On Sun, Nov 28, 2010 at 6:55 PM, Sajjadul Islam <[email protected]>wrote:

> Hi,
>
> I believe that my previous post was not enough to elaborate the issue. So i
> am attaching some code snippet of the problem i am having after doing minor
> changes inside the osgdistortion.
>
> I see two possible things that are wrong. On the camera that renders to the
texture / FBO, you haven't set the camera read and draw buffers. Do
         camera->setDrawBuffer(GL_FRONT);
        camera->setReadBuffer(GL_FRONT);
Otherwise you might get OpenGL errors and no output.

You might try setting the draw order of the distortion camera to
POST_RENDER. You might also try following the osgdistortion example more
closely and use slave cameras instead of cameras embedded in the scene
graph.

Tim

> ***********************************************'
>
> osg::ref_ptr<osg::Node> OSGQtMainWindow::createDistortedSubGraph(osg::Node
> *subGraph, osg::Camera *cam)
> {
>    osg::ref_ptr<osg::Group> distortedNode = new osg::Group;
>
>    //get the viewport of the camera
>    osg::ref_ptr<osg::Viewport> viewport = cam ? cam->getViewport() : 0;
>
>    unsigned int texture_width = int(viewport->width());
>    unsigned int texture_height = int(viewport->height());
>
>
>    //create a opengl texture state;
>    osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D();
>    texture->setTextureSize(texture_width,texture_height);
>    texture->setInternalFormat(GL_RGBA);
>    texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
>    texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
>
>
>    //get  the clearing color of the set camera
>    osg::Vec4 clearColor = cam->getClearColor();
>
>    //now setup to render to the texture camera
>    {
>        osg::ref_ptr<osg::Camera> camera = new osg::Camera;
>        camera->setClearColor(clearColor);
>        camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
>
>
>
>        //NOW inherit the main camera view
>         camera->setReferenceFrame(osg::Transform::RELATIVE_RF);
>         camera->setProjectionMatrix(osg::Matrixd::identity());
>        camera->setViewMatrix(osg::Matrixd::identity());
>
>
>        //set the viewport of the camera
>        camera->setViewport(0,0,texture_width,texture_height);
>
>
>        //set  the camera to render before the main camera
>         camera->setRenderOrder(osg::Camera::PRE_RENDER);
>
>
>
>         //tell  the camera to use frame buffer object where supported
>
>  camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
>
>
>         //attach the texture and use it as a color buffer
>        //means that the rendering will be done onto the texture
>        camera->attach(osg::Camera::COLOR_BUFFER,texture.get());
>
>        //add the subgraph as a child
>        //of the camera
>         //to render to the texture
>         camera->addChild(subGraph);
>
>
>        distortedNode->addChild(camera.get());
>    }
>
>
>    //set up the hud camera
>    {
>        //create a quad to visualize
>        osg::ref_ptr<osg::Geometry> polyGeom = new osg::Geometry;
>
>        osg::ref_ptr<osg::DrawArrays> polyGeomDA = new
> osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4);
>
>        osg::ref_ptr<osg::Vec3Array> vertices  = new osg::Vec3Array;
>
>        osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array;
>
>        osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
>        colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
>
>        vertices->push_back(osg::Vec3d(0,0,0));
>        vertices->push_back(osg::Vec3d(texture_width,0,0));
>        vertices->push_back(osg::Vec3d(texture_width,0,texture_height));
>        vertices->push_back(osg::Vec3d(0,0,texture_height));
>
>        texcoords->push_back(osg::Vec2(0,0));
>         texcoords->push_back(osg::Vec2(texture_width,0));
>        texcoords->push_back(osg::Vec2(texture_width,texture_height));
>        texcoords->push_back(osg::Vec2(0,texture_height));
>
>
>        polyGeom->setVertexArray(vertices.get());
>        polyGeom->setTexCoordArray(0,texcoords.get());
>        polyGeom->addPrimitiveSet(polyGeomDA.get());
>        polyGeom->setColorArray(colors.get());
>        polyGeom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
>
>
>        //get or create the  stateset for this geometry
>        osg::ref_ptr<osg::StateSet> stateset =
> polyGeom->getOrCreateStateSet();
>
>  
> stateset->setTextureAttributeAndModes(0,texture.get(),osg::StateAttribute::ON);
>        stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
>
>
>
>        //create a geode
>        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
>        geode->addDrawable(polyGeom.get());
>
>
>        //now setup  the camera to render the textured quad
>        osg::ref_ptr<osg::Camera> camera = new osg::Camera;
>
>        //inherit the main camera view
>        camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
>        camera->setViewMatrix(osg::Matrix::identity());
>
>  camera->setProjectionMatrixAsOrtho2D(0,texture_width,0,texture_height);
>
>
>        camera->setRenderOrder(osg::Camera::NESTED_RENDER);
>
>
>        camera->addChild(geode.get());
>
>
>
>        distortedNode->addChild(camera.get());
>    }
>
>    return distortedNode.get();
> }
>
>
> *****************************************'******
>
> I really need some hint on it.
>
> Thank you!
>
> Cheers,
> sajjad
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=34192#34192
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to