virtual void keyPressed(const KeyEventPtr e) { if(e->getKey() == KeyEvent::KEY_Q && e->getModifiers() & KeyEvent::KEY_MODIFIER_CONTROL) { TutorialWindowEventProducer->closeWindow(); } switch(e->getKey()) { case KeyEvent::KEY_UP: { Color4f Col(TheLight->getDiffuse()); Col += Color4f(0.2,0.2,0.2,0.0); std::cout << "Diffuse Color : " << Col << std::endl; beginEditCP(TheLight); TheLight->setAmbient(Col*0.1); TheLight->setDiffuse(Col); TheLight->setSpecular(Col); endEditCP(TheLight); MaxLuminance = Col.red(); std::cout << "MaxLuminance : " << MaxLuminance << std::endl; HDRTextureFilter->setUniformParameter("MaxLuminance", MaxLuminance); } break; case KeyEvent::KEY_DOWN: { Color4f Col(TheLight->getDiffuse()); Col -= Color4f(0.2,0.2,0.2,0.0); std::cout << "Diffuse Color : " << Col << std::endl; beginEditCP(TheLight); TheLight->setDiffuse(Col); endEditCP(TheLight); MaxLuminance = Col.red() + 1.0f; std::cout << "MaxLuminance : " << MaxLuminance << std::endl; HDRTextureFilter->setUniformParameter("MaxLuminance", MaxLuminance); } break; case KeyEvent::KEY_RIGHT: { Exposure += 0.1f; std::cout << "Exposure : " << Exposure << std::endl; HDRTextureFilter->setUniformParameter("Exposure", Exposure); } break; case KeyEvent::KEY_LEFT: { Exposure -= 0.1f; std::cout << "Exposure : " << Exposure << std::endl; HDRTextureFilter->setUniformParameter("Exposure", Exposure); } break; case KeyEvent::KEY_8: { Gamma += 0.05f; std::cout << "Gamma : " << Gamma << std::endl; HDRTextureFilter->setUniformParameter("Gamma", Gamma); } break; case KeyEvent::KEY_7: { Gamma -= 0.05f; std::cout << "Gamma : " << Gamma << std::endl; HDRTextureFilter->setUniformParameter("Gamma", Gamma); } break; } }
int main(int argc, char **argv) { // OSG init osgInit(argc,argv); // Set up Window TutorialWindowEventProducer = createDefaultWindowEventProducer(); WindowPtr MainWindow = TutorialWindowEventProducer->initWindow(); TutorialWindowEventProducer->setDisplayCallback(display); TutorialWindowEventProducer->setReshapeCallback(reshape); TutorialUpdateListener TheUpdateListener; TutorialWindowEventProducer->addUpdateListener(&TheUpdateListener); TutorialKeyListener TheKeyListener; TutorialWindowEventProducer->addKeyListener(&TheKeyListener); // Create the SimpleSceneManager helper mgr = new SimpleSceneManager; // Tell the Manager what to manage mgr->setWindow(MainWindow); // Make Main Scene Node and add the Torus NodePtr scene = osg::Node::create(); beginEditCP(scene, Node::CoreFieldMask | Node::ChildrenFieldMask); scene->setCore(osg::Group::create()); endEditCP(scene, Node::CoreFieldMask | Node::ChildrenFieldMask); //Create a FBO Source FBOSourceTextureFilterPtr TutorialFBOSourceTextureFilter = FBOSourceTextureFilter::create(); beginEditCP(TutorialFBOSourceTextureFilter, FBOSourceTextureFilter::FBOFieldMask | FBOSourceTextureFilter::FBOSizeFieldMask); TutorialFBOSourceTextureFilter->setFBO(createSceneFBO()); TutorialFBOSourceTextureFilter->setFBOSize(Vec2f(-1.0,-1.0)); endEditCP(TutorialFBOSourceTextureFilter, FBOSourceTextureFilter::FBOFieldMask | FBOSourceTextureFilter::FBOSizeFieldMask); //Create a HDR filter std::string HDRFragProg = ""; HDRFragProg += "uniform sampler2D Slot0Texture;" "uniform float Exposure;" "uniform float MaxLuminance;" "uniform float Gamma;" "void main()" "{" " vec3 Color = texture2D(Slot0Texture,gl_TexCoord[0].st).rgb;" //" float Intensity = dot(vec3(0.3,0.59,0.11),Color);" " float TonePercent = Exposure * ((Exposure/MaxLuminance + 1.0)/(Exposure + 1.0));" //Apply Tone Mapping And Gamma Correction " Color = pow(Color * TonePercent, vec3(Gamma));" " gl_FragColor = vec4(Color, 1.0);" "}"; //Create a shader Filter HDRTextureFilter = ShaderTextureFilter::create(); HDRTextureFilter->attachSource(TutorialFBOSourceTextureFilter, 0, 0); HDRTextureFilter->setFragmentSource(HDRFragProg); HDRTextureFilter->setUniformParameter("Exposure", Exposure); HDRTextureFilter->setUniformParameter("MaxLuminance", MaxLuminance); HDRTextureFilter->setUniformParameter("Gamma", Gamma); // Create the ImageProcessed Foreground Object ImageProcessedForegroundPtr TutorialImageProcessedForeground = ImageProcessedForeground::create(); beginEditCP(TutorialImageProcessedForeground, ImageProcessedForeground::FilterFieldMask | ImageProcessedForeground::OutputSlotFieldMask); TutorialImageProcessedForeground->setFilter(HDRTextureFilter); TutorialImageProcessedForeground->setOutputSlot(0); endEditCP(TutorialImageProcessedForeground, ImageProcessedForeground::FilterFieldMask | ImageProcessedForeground::OutputSlotFieldMask); mgr->setRoot(scene); // Add the ImageProcessed Foreground Object to the Scene ViewportPtr TutorialViewport = mgr->getWindow()->getPort(0); beginEditCP(TutorialViewport, Viewport::ForegroundsFieldMask); TutorialViewport->getForegrounds().push_back(TutorialImageProcessedForeground); beginEditCP(TutorialViewport, Viewport::ForegroundsFieldMask); // Show the whole Scene mgr->showAll(); //Open Window Vec2f WinSize(TutorialWindowEventProducer->getDesktopSize() * 0.85f); Pnt2f WinPos((TutorialWindowEventProducer->getDesktopSize() - WinSize) *0.5); TutorialWindowEventProducer->openWindow(WinPos, WinSize, "03ScenePostProcessing"); //Enter main Loop TutorialWindowEventProducer->mainLoop(); osgExit(); return 0; }