void ospray::sg::FrameBuffer::updateFB() { // workaround insufficient detection of new framebuffer in sg::Frame: // create the new FB first and release the old afterwards to ensure a // different address / handle auto oldFrameBuffer = ospFrameBuffer; committed_size = child("size").valueAs<vec2i>(); committed_format = OSP_FB_NONE; auto key = child("colorFormat").valueAs<std::string>(); for(auto const& el : colorFormats) if (el.first == key) { committed_format = el.second; break; } #ifdef OSPRAY_APPS_ENABLE_DENOISER useDenoiser = child("useDenoiser").valueAs<bool>(); if (useDenoiser) committed_format = OSP_FB_RGBA32F; #endif auto useAccum = child("useAccumBuffer").valueAs<bool>(); auto useVariance = child("useVarianceBuffer").valueAs<bool>(); ospFrameBuffer = ospNewFrameBuffer((osp::vec2i&)committed_size, committed_format, OSP_FB_COLOR | #ifdef OSPRAY_APPS_ENABLE_DENOISER (useDenoiser ? OSP_FB_NORMAL | OSP_FB_ALBEDO : 0) | #endif (useAccum ? OSP_FB_ACCUM : 0) | (useVariance ? OSP_FB_VARIANCE : 0)); setValue(ospFrameBuffer); ospRelease(oldFrameBuffer); toneMapperActive = false; }
void GLFWOSPRayWindow::reshape(const ospcommon::vec2i &newWindowSize) { windowSize = newWindowSize; // release the current frame buffer, if it exists if (framebuffer) ospRelease(framebuffer); // create new frame buffer framebuffer = ospNewFrameBuffer(*reinterpret_cast<osp::vec2i *>(&windowSize), OSP_FB_SRGBA, OSP_FB_COLOR | OSP_FB_ACCUM); // reset OpenGL viewport and orthographic projection glViewport(0, 0, windowSize.x, windowSize.y); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, windowSize.x, 0.0, windowSize.y, -1.0, 1.0); // update camera arcballCamera->updateWindowSize(windowSize); ospSetf(camera, "aspect", windowSize.x / float(windowSize.y)); ospCommit(camera); }
int main(int ac, const char **av) { // image size osp_vec2i imgSize; imgSize.x = 1024; // width imgSize.y = 768; // height // camera float cam_pos[] = {0.f, 0.f, 0.f}; float cam_up [] = {0.f, 1.f, 0.f}; float cam_view [] = {0.1f, 0.f, 1.f}; // triangle mesh data float vertex[] = { -1.0f, -1.0f, 3.0f, 0.f, -1.0f, 1.0f, 3.0f, 0.f, 1.0f, -1.0f, 3.0f, 0.f, 0.1f, 0.1f, 0.3f, 0.f }; float color[] = { 0.9f, 0.5f, 0.5f, 1.0f, 0.8f, 0.8f, 0.8f, 1.0f, 0.8f, 0.8f, 0.8f, 1.0f, 0.5f, 0.9f, 0.5f, 1.0f }; int32_t index[] = { 0, 1, 2, 1, 2, 3 }; // initialize OSPRay; OSPRay parses (and removes) its commandline parameters, e.g. "--osp:debug" ospInit(&ac, av); // create and setup camera OSPCamera camera = ospNewCamera("perspective"); ospSetf(camera, "aspect", imgSize.x/(float)imgSize.y); ospSet3fv(camera, "pos", cam_pos); ospSet3fv(camera, "dir", cam_view); ospSet3fv(camera, "up", cam_up); ospCommit(camera); // commit each object to indicate modifications are done // create and setup model and mesh OSPGeometry mesh = ospNewGeometry("triangles"); OSPData data = ospNewData(4, OSP_FLOAT3A, vertex, 0); // OSP_FLOAT3 format is also supported for vertex positions (currently not on MIC) ospCommit(data); ospSetData(mesh, "vertex", data); data = ospNewData(4, OSP_FLOAT4, color, 0); ospCommit(data); ospSetData(mesh, "vertex.color", data); data = ospNewData(2, OSP_INT3, index, 0); // OSP_INT4 format is also supported for triangle indices ospCommit(data); ospSetData(mesh, "index", data); ospCommit(mesh); OSPModel world = ospNewModel(); ospAddGeometry(world, mesh); ospCommit(world); // create and setup renderer OSPRenderer renderer = ospNewRenderer("scivis"); // choose Scientific Visualization renderer ospSet1f(renderer, "aoWeight", 1.0f); // with full Ambient Occlusion ospSet1i(renderer, "aoSamples", 1); ospSetObject(renderer, "model", world); ospSetObject(renderer, "camera", camera); ospCommit(renderer); // create and setup framebuffer OSPFrameBuffer framebuffer = ospNewFrameBuffer(&imgSize, OSP_FB_SRGBA, OSP_FB_COLOR | /*OSP_FB_DEPTH |*/ OSP_FB_ACCUM); ospFrameBufferClear(framebuffer, OSP_FB_COLOR | OSP_FB_ACCUM); // render one frame ospRenderFrame(framebuffer, renderer, OSP_FB_COLOR | OSP_FB_ACCUM); // access framebuffer and write its content as PPM file const uint32_t * fb = (uint32_t*)ospMapFrameBuffer(framebuffer, OSP_FB_COLOR); writePPM("firstFrameC.ppm", &imgSize, fb); ospUnmapFrameBuffer(fb, framebuffer); // render 10 more frames, which are accumulated to result in a better converged image for (int frames = 0; frames < 10; frames++) ospRenderFrame(framebuffer, renderer, OSP_FB_COLOR | OSP_FB_ACCUM); fb = (uint32_t*)ospMapFrameBuffer(framebuffer, OSP_FB_COLOR); writePPM("accumulatedFrameC.ppm", &imgSize, fb); ospUnmapFrameBuffer(fb, framebuffer); return 0; }