Hi,

I used the masks as you suggested, and it works as I want, now I am trying to 
somehow make the viewport moveable, so it would look like magic lens. 

I was suggested to render the second, lens camera to texture so it could be 
made moveable in simplier way. 

This is my code for adding texture rendering 



Code:
osg::Texture2D* renderTexture = new osg::Texture2D;
renderTexture->setTextureSize(width()/2,height()/2);
renderTexture->setInternalFormat(GL_RGBA);
renderTexture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
renderTexture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
osg::ref_ptr<osg::Geometry> screenQuad;
screenQuad = osg::createTexturedQuadGeometry(osg::Vec3(),
osg::Vec3(width(), 0.0, 0.0),
osg::Vec3(0.0, height(), 0.0));
osg::ref_ptr<osg::Geode> quadGeode = new osg::Geode;
quadGeode->addDrawable(screenQuad.get());
osg::StateSet *quadState = quadGeode->getOrCreateStateSet();
quadState->setTextureAttributeAndModes(0, renderTexture, 
osg::StateAttribute::ON);


osg::ref_ptr<osg::Camera> orthoCamera = new osg::Camera;
orthoCamera->setProjectionMatrix(osg::Matrix::ortho2D(0, width()/2, 0, 
height()/2));
orthoCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
orthoCamera->setViewMatrix(osg::Matrix::identity());
orthoCamera->setViewport(0, 0, width()/2, height()/2);
orthoCamera->setRenderOrder(osg::Camera::POST_RENDER);
orthoCamera->addChild(quadGeode.get());

osg::ref_ptr<osg::Camera> camera2 = new osg::Camera;
camera2->setCullMask(0x2);
camera2->setGraphicsContext(getGraphicsWindow());
camera2->setViewport(new 
osg::Viewport(width()/2,height()/2,width()/2,height()/2));
camera2->setProjectionMatrixAsPerspective(60, 
static_cast<double>(width())/static_cast<double>(height()), 0.01, 
appConf->getValue("Viewer.Display.ViewDistance").toFloat());
//camera2->setViewMatrixAsLookAt(osg::Vec3d(-10, 0, 0), osg::Vec3d(0, 0, 0), 
osg::Vec3d(0, 1, 0));
//camera2->setReferenceFrame(osg::Transform::RELATIVE_RF);
camera2->setRenderOrder(osg::Camera::PRE_RENDER);
camera2->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
camera2->attach(osg::Camera::COLOR_BUFFER, renderTexture); 

addSlave(camera2.get(), osg::Matrixd::translate(0.0,0.0,0.0), osg::Matrixd());
addSlave(orthoCamera.get(), osg::Matrixd::translate(0.0,0.0,0.0), 
osg::Matrixd());





But I get this writing to ouput in infinite loop:

Warning: detected OpenGL error 'invalid value' at start of State::apply().

I don't know if I understood correctly the RTT, now I have three cameras, one 
main and two for one RTT, is it correct? And the RTT for moving lens, is it 
good way to do this?


Thank you very much!

Cheers,
Zuzana

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





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to