[osg-users] Slave camera rendering

Sergey Polischuk pol-ss at yandex.ru
Fri Apr 29 04:47:04 PDT 2011


Hi, Zuzana

I'm not quite familiar with slave cameras setup, but i did lens-like effect recently with rtt cameras. I had two rtt prerender cameras (not slaves of main cameras, just regular ones added to graph) rendering scene, one - for normal scene, one for zoomed view(it had different projection matrix), and main camera drawing screen aligned quad with both textures combined in shader. It worked good for me. Cant say much about your errors - you can try OSG_NOTIFY_LEVEL=DEBUG and OSG_GL_ERROR_CHECKING=ON env variables or opengl debugger like gDEBugger or glslDevil to find out where this errors comes from.

23.04.2011, 13:54, "Zuzana Číková" <zuzana.cikova1 at gmail.com>:
> 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
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



More information about the osg-users mailing list