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.modenb...@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.modenb...@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@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> _______________________________________________ >> osg-users mailing list >> osg-users@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> >> >> _______________________________________________ >> osg-users mailing list >> osg-users@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> > _______________________________________________ > osg-users mailing list > osg-users@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: i...@texion.eu
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org