[osg-users] How to handle cameras in the scene graph when rendering to framebuffer
Werner Modenbach
Werner.Modenbach at texion.eu
Mon Feb 27 03:08:48 PST 2017
Hi Robert,
you may be right. There are several (more) objects that have to be
rendered in a certain sequence and PRE-/NORMAL-/POST-RENDER is
a little weak for fine grained tuning.
Can I use
StateSet->setRenderBinDetails( 11, "RenderBin");
instead? That should work, isn't it?
What are the bin numbers usually used for the 3 modes?
Am 27.02.2017 um 12:02 schrieb Robert Osfield:
> HI Werner,
>
> It's hard to work exactly what is going on with a quick read through
> as it's rather complicated set up of various Camera's. My current
> best guess Your Cl_3D_Wallpaper class is setting the RenderOrder to
> POST_RENDER as this is make it render after the Camera you are adding
> to do the screenshot has been done.
>
> Perhaps the best way to work out what order things are being done in
> is to add a Camera initiali, pre, post and a final DrawCallbacks to
> each of the Camera's and have these debug callbacks just write to the
> console when they are being called.
>
> Robert.
>
> On 27 February 2017 at 10:34, Werner Modenbach
> <Werner.Modenbach at texion.eu> wrote:
>> Hi Robert,
>>
>> sorry for the delayed answer. It's carnival time here and so everybody is
>> out - except me ;-)
>>
>> I try to give an as compressed description as possible here.
>>
>> The scene looks like that:
>> *
>>
>> * ---------------
>>
>> * | RootNode |
>>
>> * ---------------
>>
>> * / \
>>
>> * ---------------
>> ---------------------
>>
>> * | ShadowScene | |evtl.
>> PPU-Prozessor|
>>
>> * ---------------
>> ---------------------
>>
>> * / \
>>
>> * --------------- ---------------
>>
>> * | Switchnode | | LightSource |
>>
>> * --------------- ---------------
>>
>> * / \\\
>>
>> * --------------- -----------------
>>
>> * | User scene | | evtl. further |
>>
>> * --------------- | Objects |
>>
>> * -----------------
>>
>> The further objects are the wallpaper, a magnifier etc.
>>
>>
>> The main camera is a standard camera with perspective view and a trackball
>> manipulator.
>> The wallpaper class is like that:
>> class Cl_3D_Wallpaper : public osg::Camera {
>>
>> public:
>>
>> Cl_3D_Wallpaper(Cl_3Dview_osg *_parent);
>>
>> /** This Method creates the background image. */
>>
>> void setWallpaper(const QString _path);
>>
>> protected:
>> Cl_3Dview_osg *view;
>> QString path;
>> };
>>
>>
>> Cl_3D_Wallpaper::Cl_3D_Wallpaper(Cl_3Dview_osg *_parent): view(_parent),
>> path(QLatin1String("")) {
>>
>> setCullingActive( false );
>>
>> setClearMask( 0 );
>>
>> setAllowEventFocus( false );
>>
>> setReferenceFrame( osg::Transform::ABSOLUTE_RF );
>>
>> setRenderOrder( osg::Camera::POST_RENDER );
>>
>> setProjectionMatrix( osg::Matrix::ortho2D(0.0, 1.0, 0.0, 1.0) );
>>
>> setName(getNodeName().toStdString().c_str());
>>
>> osg::StateSet* ss = getOrCreateStateSet();
>>
>> ss->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
>>
>> ss->setAttributeAndModes( new osg::Depth(osg::Depth::LEQUAL, 1.0, 1.0)
>> );
>>
>> view->installDefaultShader(ss); // In case we are on gl3
>>
>> }
>>
>> /** Diese Methode erzeugt eine Hintergrundbildanzeige,
>>
>> * falls der Pfad auf eine Bilddatei verweist.
>>
>> */
>>
>> void Cl_3D_Wallpaper::setWallpaper(const QString _path) {
>>
>> path = _path;
>>
>> if (!_path.isEmpty()) {
>>
>> // ================================================
>>
>> // Die Szene des Bildes erzeugen
>>
>> // ================================================
>>
>> osg::Geode* geode = new osg::Geode();
>>
>> osg::Geometry* geometry =
>> osg::createTexturedQuadGeometry(osg::Vec3(0,0,0),osg::Vec3(1,0,0),osg::Vec3(0,1,0),0,
>> 0, 1, 1);
>>
>> geode->addDrawable(geometry);
>>
>> osg::Texture2D* texture = view->loadTexture(_path, false);
>>
>>
>> geode->getOrCreateStateSet()->setTextureAttributeAndModes(BASE_TEXTURE_UNIT,
>> texture, osg::StateAttribute::ON);
>>
>> geode->getOrCreateStateSet()->setMode(GL_LIGHTING,
>> osg::StateAttribute::OFF);
>>
>> addChild(geode);
>>
>> view->installDefaultShader(geode->getOrCreateStateSet()); //In case
>> we are on gl3
>>
>> }
>>
>> }
>>
>> Now the part of getting a frame buffer screenshot:
>>
>> /** The screen image is rendered at a pregiven dpi */
>>
>> QImage Cl_3Dview_osg::getHighResQImage(const int _dpi) {
>>
>> double scale = (double)_dpi / (double)dpi;
>>
>> // Calculation of image size and tiles per row
>>
>> int width = (int) (view->getGraphicsWidth());
>>
>> int height = (int) (view->getGraphicsHeight());
>>
>> int imageWidth = (int)(width * scale);
>>
>> int imageHeight = (int)(height * scale);
>>
>> int tiles = (imageWidth - 1) / width + 1;
>>
>> osg::ref_ptr<osg::Image> image = new osg::Image;
>>
>> // Creating the new camera
>> osg::ref_ptr<osg::Camera> camera = new osg::Camera;
>>
>> camera->getOrCreateStateSet()->setGlobalDefaults();
>>
>> camera->setClearColor(view->getCamera()->getClearColor());
>>
>> camera->setViewport(new osg::Viewport(0,0,width,height));
>>
>> camera->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
>>
>> camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );
>>
>> camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
>>
>> camera->setRenderOrder( osg::Camera::POST_RENDER );
>>
>>
>> camera->addChild(view->getCamera()->getChild(0)); // The root node
>>
>> osg::ref_ptr<osg::Image> fbImage = new osg::Image;
>>
>> fbImage->allocateImage(width,height,1,GL_RGBA,GL_UNSIGNED_BYTE, 1);
>>
>> camera->attach( osg::Camera::COLOR_BUFFER, fbImage.get(), 0, 0);
>>
>> // Setting the new camera a child of the main camera
>>
>> view->getCamera()->addChild(camera.get());
>>
>> // Loop over tiles
>> osg::Matrixd viewMatrix = view->getCamera()->getViewMatrix();
>>
>> osg::Matrixd projectionMatrix =
>> view->getCamera()->getProjectionMatrix();
>>
>> int y_out = imageHeight - 1;
>>
>> for (int row = 0; row < tiles; row++) {
>>
>> for (int col = 0; col < tiles; col++) {
>>
>> // Calculate projection matrix offset of each tile
>>
>> osg::Matrix offsetMatrix =
>>
>> osg::Matrix::scale(scale, scale, 1.0) *
>>
>> osg::Matrix::translate(scale-1-2*col, scale-1-2*row,
>> 0.0);
>>
>> camera->setViewMatrix(viewMatrix);
>>
>> camera->setProjectionMatrix( projectionMatrix * offsetMatrix );
>>
>> view->frame();
>> image = fbImage.get();
>>
>> // Transferring tile into final image
>> .......
>>
>> }
>>
>> y_out -= height;
>>
>> if (y_out < 0) break;
>>
>> }
>>
>> view->getCamera()->removeChild(camera.get());
>> }
>>
>>
>> The rendered image is missing my wallpaper.
>> If I add the camera as a slave camera to the main camera I just get an empty
>> black image.
>> Actually I also don't understand the difference between slave and child
>> cameras here. I know you explained it recently :-)
>> Why does the slave camera give an empty image but the child camera doesn't?
>>
>> BTW. I wrote my code here with the background of giving an example to others
>> looking for functionality like that.
>>
>>
>>
>>
>>
>> Am 24.02.2017 um 17:56 schrieb Robert Osfield:
>>
>> Hi Werner,
>>
>> In principle what you are doing should be possible. What is going
>> wrong in your instance is impossible to say without seeing how you are
>> setting up the viewer Camera's and the in scene graph Camera's.
>>
>> Robert.
>>
>> On 24 February 2017 at 16:44, Werner Modenbach
>> <Werner.Modenbach at texion.eu> wrote:
>>
>> Hi all,
>> sorry for so many questions today.
>>
>> My scene graph has additional cameras as children somewhere in the scene
>> graph.
>> For example a hud camera for a background image.
>>
>> I do screenshots by adding a slave camera to the main camera which renders
>> the scene to the FB.
>> Unfortunately this rendering doesn't show the parts of the nested cameras,
>> i.e. no
>> background wallpaper.
>> What is the recommended way to solve this?
>>
>> Thanks for any help.
>>
>> - Werner -
>>
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>>
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
--
*TEXION Software Solutions*, Rotter Bruch 26a, D-52068 Aachen
Phone: +49 241 475757-0
Fax: +49 241 475757-29
Web: http://texion.eu
eMail: info at texion.eu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20170227/8c336ead/attachment-0003.htm>
More information about the osg-users
mailing list