[osg-users] How to handle cameras in the scene graph when rendering to framebuffer

Werner Modenbach Werner.Modenbach at texion.eu
Mon Feb 27 04:07:16 PST 2017


Sorry, found the second parameter of  setRenderOrder, but using this on
the wallpaper and the framebuffer camera doen't make a difference,
independent of the numbers I assign.

Am 27.02.2017 um 12:08 schrieb Werner Modenbach:
> 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
>
>
> _______________________________________________
> 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/51ffd898/attachment-0002.htm>


More information about the osg-users mailing list