I started playing with RTT cameras and, having looked at some OSG examples, I 
tried my own code but when I switch from fullscreen to windowed mode the 
rendered texture doesn't appear as expected: it seems not to cover the whole 
quad as it does while in fullscreen, only a part of it is updated and as you 
stretch the window the rendered texture is stretched too (refer to attached 
images).

Here's my code:


Code:

int main( int argc, char **argv )
{
    osg::ArgumentParser arguments(&argc,argv);
    osgViewer::Viewer viewer(arguments);

    // add stats and window size handlers...
    viewer.addEventHandler( new osgViewer::StatsHandler() );
    viewer.addEventHandler( new osgViewer::WindowSizeHandler() );
    
    int screenWidth = 1366;
    int screenHeight = 768;

    // create the texture to render to...
    osg::ref_ptr<osg::Texture2D> texture_RTT = new osg::Texture2D;
    texture_RTT->setTextureSize(screenWidth, screenHeight);
    texture_RTT->setInternalFormat(GL_RGBA);
    texture_RTT->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
    texture_RTT->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
    texture_RTT->setResizeNonPowerOfTwoHint(false);

    // create the quad...
    osg::ref_ptr<osg::Geometry> quad_RTT = osg::createTexturedQuadGeometry(
                                               osg::Vec3(0.0, 0.0, 0.0),
                                               osg::Vec3(screenWidth, 0.0, 0.0),
                                               osg::Vec3(0.0, screenHeight, 
0.0));

    quad_RTT->setDataVariance( osg::Object::DYNAMIC );

    osg::ref_ptr<osg::Geode> quad_geode_RTT = new osg::Geode;
    quad_geode_RTT->addDrawable(quad_RTT.get());
    quad_geode_RTT->setDataVariance( osg::Object::DYNAMIC );

    osg::StateSet *quadState = quad_geode_RTT->getOrCreateStateSet();
    quadState->setTextureAttributeAndModes(0, texture_RTT.get(), 
osg::StateAttribute::ON);
    quadState->setMode( GL_LIGHTING, osg::StateAttribute::OFF | 
osg::StateAttribute::PROTECTED );

    // create the camera...
    osg::ref_ptr<osg::Camera> camera_RTT = new osg::Camera;

#ifdef USE_IMAGE
        osg::ref_ptr<osg::Image> image_RTT = new osg::Image;
        image_RTT->allocateImage(screenWidth, screenHeight, 1, GL_RGBA, 
GL_UNSIGNED_BYTE);
        camera_RTT->attach(osg::Camera::COLOR_BUFFER, image_RTT.get());
        texture_RTT->setImage(0, image_RTT.get());
#else
        camera_RTT->attach(osg::Camera::COLOR_BUFFER, texture_RTT.get());
#endif
 
    
//camera_RTT->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT, 
osg::Camera::FRAME_BUFFER);
    camera_RTT->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER);
    camera_RTT->setRenderOrder(osg::Camera::PRE_RENDER);

    camera_RTT->setReferenceFrame( osg::Camera::ABSOLUTE_RF );
    camera_RTT->setClearColor( osg::Vec4( 0., 0., 1., 1. ) );
    camera_RTT->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // add whatever children you want drawn to the texture
    osg::ref_ptr< osg::Node > node = osgDB::readNodeFile("cow.osg");
    if(node.valid())
    {
        const osg::BoundingSphere& bs = node->getBound();
        float znear = 1.0f*bs.radius();
        float zfar  = 3.0f*bs.radius();
        float proj_top   = 0.25f*znear;
        float proj_right = 0.5f*znear;
        znear *= 0.9f;
        zfar *= 1.1f;

        
camera_RTT->setProjectionMatrixAsFrustum(-proj_right,proj_right,-proj_top,proj_top,znear,zfar);
        
camera_RTT->setViewMatrixAsLookAt(bs.center()-osg::Vec3(0.0f,2.0f,0.0f)*bs.radius(),bs.center(),osg::Vec3(0.0f,0.0f,1.0f));

        camera_RTT->addChild(node.get());
    }
    else
        osg::notify(osg::FATAL)<<"model not loaded"<<std::endl;

    // add camera and quad to root...
    osg::Group* rootNode = new osg::Group();
    rootNode->addChild(camera_RTT.get());
    rootNode->addChild(quad_geode_RTT.get());

    // add model to the viewer.
    viewer.setSceneData( rootNode );

return viewer.run();
}




Sorry if the code doesn't visualize fine (I'm attaching a .cpp FYC).

The situation does not change if I use FRAME_BUFFER_OBJECT target instead of 
FRAME_BUFFER. On the other hand, it changes if I use an osg::Image (by defining 
USE_IMAGE in the above code, but performances are not so good (9 fps) as when 
using the texture).

What am I missing? 

Cheers.
Alessandro

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=41214#41214




Attachments: 
http://forum.openscenegraph.org//files/rtt_windowed_using_image_712.png
http://forum.openscenegraph.org//files/rtt_windowed_919.png
http://forum.openscenegraph.org//files/rtt_fullscreen_175.png
http://forum.openscenegraph.org//files/test_rtt_603.cpp


_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to