You're welcome, Marcus
Actually, I got a problem myself here, I want to do some more post render process like anti-alias even after the silhouette pass, I don't know how to set some later render camera. Anyone who knows please tell me. -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Marcus Fritzen Sent: Wednesday, July 18, 2007 4:46 PM To: osg users Subject: Re: [osg-users] multipass rendering Thank you very much for your exact explanation. You helped me a lot with this! Wish you all the best. Marcus Shuxing Xiao schrieb: > Hi, Marcus: > > First, I set up the render to color texture camera, and set the render order > to PRE_RENDER, and the render target to FRAME_BUFFER_OBJECT, then I set up > the render to normal and depth texture camera, with the same render order > and render target. I use the uniform variable to tell the GLSL what to set > to gl_FragColor, if RENDERNORMALANDDEPTH is set false, the gl_FragColor is > set to the shaded color, otherwise, I set the normalized normal vector in > the RGB tunnel of the gl_FragColor, and the depth value in the A tunnel of > the gl_FragColor. > > Now, I have the color and depth texture, I can set a POST_RENDER hud to > render synthetic texture and use these two textures as the input, and do > some calculation in this camera's shader. > > I'm not sure whether I have expressed this clear or not, anyway, I'm just > gonna paste my code here, and if you have any questions, feel free to > discuss. > > Actually, I got a problem myself here, I want to do some more post render > process like antialias even after the silhouette pass, I don't know how to > set some later render camera. Anyone who knows please tell me. > > > /*************************************************************************** > ***********************************/ > osg::ref_ptr<osg::Texture2D> colorTexture = new osg::Texture2D; > colorTexture->setTextureSize(windowWidth, windowHeight); > colorTexture->setInternalFormat(GL_RGBA); > > colorTexture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR); > > colorTexture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); > > colorTexture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER > ); > > colorTexture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER > ); > colorTexture->setBorderColor(osg::Vec4(1.0f,1.0f,1.0f,1.0f)); > > // set up the render to color texture camera. > { > osg::ref_ptr<osg::Camera> colorCamera = new osg::Camera; > colorCamera->setName("ColorCamera"); > colorCamera->setClearColor(clearColor); > colorCamera->setViewport(0,0,windowWidth,windowHeight); > > //colorCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); > //colorCamera->setViewport(the_viewport.get()); > //colorCamera->setProjectionMatrix(proj_matrix); > //colorCamera->setViewMatrix(view_matrix); > > colorCamera->setRenderOrder(osg::Camera::PRE_RENDER); > > colorCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT) > ; > colorCamera->attach(osg::Camera::COLOR_BUFFER, > colorTexture.get()); > colorCamera->addChild(viewnode); > > osg::ref_ptr<osg::StateSet> stateset = > colorCamera->getOrCreateStateSet(); > stateset->addUniform(new > osg::Uniform("RENDERNORMALANDDEPTH",false),osg::StateAttribute::ON); > > root->addChild(colorCamera.get()); > } > > osg::ref_ptr<osg::Texture2D> normalAndDepthTexture = new > osg::Texture2D; > normalAndDepthTexture->setTextureSize(windowWidth, windowHeight); > normalAndDepthTexture->setInternalFormat(GL_RGBA); > > normalAndDepthTexture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D:: > LINEAR); > > normalAndDepthTexture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D:: > LINEAR); > > normalAndDepthTexture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_ > TO_BORDER); > > normalAndDepthTexture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_ > TO_BORDER); > > // set up the render to normal and depth texture camera. > { > osg::ref_ptr<osg::Camera> normalAndDepthCamera = new > osg::Camera; > normalAndDepthCamera->setName("NormalAndDepthCamera"); > normalAndDepthCamera->setClearColor(clearColor); > > normalAndDepthCamera->setViewport(0,0,windowWidth,windowHeight); > //normalAndDepthCamera->setViewport(the_viewport.get()); > > //normalAndDepthCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); > //normalAndDepthCamera->setProjectionMatrix(proj_matrix); > //normalAndDepthCamera->setViewMatrix(view_matrix); > > normalAndDepthCamera->setRenderOrder(osg::Camera::PRE_RENDER); > > normalAndDepthCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFE > R_OBJECT); > normalAndDepthCamera->attach(osg::Camera::COLOR_BUFFER, > normalAndDepthTexture.get()); > normalAndDepthCamera->addChild(viewnode); > > osg::ref_ptr<osg::StateSet> depstateset = > normalAndDepthCamera->getOrCreateStateSet(); > depstateset->addUniform(new > osg::Uniform("RENDERNORMALANDDEPTH",true),osg::StateAttribute::OVERRIDE); > > root->addChild(normalAndDepthCamera.get()); > } > > // set hud to render synthetic texture > { > osg::ref_ptr<osg::Geode> geode = new osg::Geode; > osg::ref_ptr<osg::Geometry> geom = > osg::createTexturedQuadGeometry(osg::Vec3(0,0,0),osg::Vec3(windowWidth,0.0,0 > .0),osg::Vec3(0.0,windowHeight,0.0)); > > > geom->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF); > geode->addDrawable(geom.get()); > > osg::ref_ptr<osg::Camera> viewCamera = new osg::Camera; > viewCamera->setName("ViewCamera"); > viewCamera->setClearColor(clearColor); > > viewCamera->setProjectionMatrix(osg::Matrix::ortho2D(0,windowWidth,0,windowH > eight)); > viewCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); > viewCamera->setViewMatrix(osg::Matrix::identity()); > viewCamera->setViewport(0,0,windowWidth,windowHeight); > viewCamera->setRenderOrder(osg::Camera::POST_RENDER); > viewCamera->addChild(geode.get()); > > osg::ref_ptr<osg::StateSet> viewstateset = > viewCamera->getOrCreateStateSet(); > osg::ref_ptr<osg::Program> program = new osg::Program; > > program->addShader(Shaders::Instance()->getSilhouetteFragmentShader()); > > viewstateset->setAttributeAndModes(program.get(),osg::StateAttribute::ON); > > > viewstateset->setTextureAttributeAndModes(0,colorTexture.get(),osg::StateAtt > ribute::ON); > > viewstateset->setTextureAttributeAndModes(1,normalAndDepthTexture.get(),osg: > :StateAttribute::ON); > > viewstateset->addUniform(new > osg::Uniform("colorTexture",0)); > viewstateset->addUniform(new > osg::Uniform("normalAndDepthTexture",1)); > > viewstateset->addUniform(new > osg::Uniform("windowWidth",(int)windowWidth)); > viewstateset->addUniform(new > osg::Uniform("windowHeight",(int)windowHeight)); > viewstateset->addUniform(new > osg::Uniform("SILHOUETTEONLY",false)); > viewstateset->addUniform(new osg::Uniform("DepthThreshold", > (float)0.5)); > viewstateset->addUniform(new osg::Uniform("NormalThreshold", > (float)0.5)); > viewstateset->addUniform(new > osg::Uniform("DEPTHONLY",false)); > viewstateset->addUniform(new > osg::Uniform("NORMALONLY",false)); > viewstateset->addUniform(new > osg::Uniform("DEPTHANDNORMAL",true)); > viewstateset->addUniform(new > osg::Uniform("silhouettecolor",osg::Vec4f(0.0f,0.0f,0.0f,1.0f))); > viewstateset->addUniform(new > osg::Uniform("backgroundcolor",clearColor)); > > root->addChild(viewCamera.get()); > } > > /*************************************************************************** > ***********************************/ > > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Marcus Fritzen > Sent: Wednesday, July 18, 2007 3:20 PM > To: osg users > Subject: Re: [osg-users] multipass rendering > > Hi Shuxing Xiao, > > I have a similar problem, perhaps you can help me. I have a prerender > camera with a texture attached and make computations on it with a > fragment shader. Now I want to use the output of the shader as the input > of another shader. I am not really sure how I can do this. Do I need > another Camera or what? It would be usefull to me if you could explain > me how you did it. > > Thank, > Marcus > > Shuxing Xiao schrieb: > >> I used to implement the silhouette calculating by multipass rendering. >> >> I calculated the rendering image and the normal and depth buffer in some >> > pre > >> render camera, respectively, and save them in some textures, which are the >> inputs of the post render camera.(all of these three cameras are rendered >> > by > >> GLSL shader.) >> >> I don't know what exact problem you have encountered, but if you want to >> discuss, feel free. >> >> >> -----Original Message----- >> From: [EMAIL PROTECTED] >> [mailto:[EMAIL PROTECTED] On Behalf Of Andreas >> > Hollmann > >> Sent: Monday, July 16, 2007 10:21 PM >> To: [email protected] >> Subject: [osg-users] multipass rendering >> >> I need to implement post process effect. >> >> I have to change the color of rendered picture depending on the depth >> buffer. So I wrote shader for my post process, but as input it needs the >> rendered image and depth buffer. >> >> Is there some another technique to render post process as differing >> > shading? > >> I looked at osg prereder and reflection examples, but I do not have real >> strategy. :-( >> >> Help!!! >> _____________________________________________________________________ >> Der WEB.DE SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! >> http://smartsurfer.web.de/?mc=100071&distributionid=000000000066 >> >> _______________________________________________ >> osg-users mailing list >> [email protected] >> http://openscenegraph.net/mailman/listinfo/osg-users >> http://www.openscenegraph.org/ >> >> _______________________________________________ >> osg-users mailing list >> [email protected] >> http://openscenegraph.net/mailman/listinfo/osg-users >> http://www.openscenegraph.org/ >> >> >> > > -- ---------------------------------------------------------------- Marcus Fritzen E-mail: [EMAIL PROTECTED] University Koblenz Mobil: +491786867360 Triererstr. 105, 56072 Koblenz, HIWI FB4 Herr Jackel ---------------------------------------------------------------- _______________________________________________ osg-users mailing list [email protected] http://openscenegraph.net/mailman/listinfo/osg-users http://www.openscenegraph.org/ _______________________________________________ osg-users mailing list [email protected] http://openscenegraph.net/mailman/listinfo/osg-users http://www.openscenegraph.org/
