Hi Rômulo, I didn't spot any code you posted that handles resizing, did I miss it?
Robert. On Tue, 2 Oct 2018 at 08:10, Rômulo Cerqueira <romulogcerque...@gmail.com> wrote: > > Hi, > > I have rendered a FBO camera to image by using a callback (as seen in the > code below), however some OpenGL warnings/erros are raised when I resize at > runtime by setupViewer() method. I debugged the code by using > > > Code: > export OSG_GL_ERROR_CHECKING=ON > > > > and got the following error: > > > Code: > Warning: detected OpenGL error 'invalid operation' after applying attribute > Viewport 0x7fb35406e500 > > > > How can I properly do the resizing of my FBO camera? > > > > Code: > // create a RTT (render to texture) camera > osg::Camera *ImageViewerCaptureTool::createRTTCamera(osg::Camera* cam, > osg::Camera::BufferComponent buffer, osg::Texture2D *tex, > osg::GraphicsContext *gfxc) > { > osg::ref_ptr<osg::Camera> camera = cam; > camera->setClearColor(osg::Vec4(0, 0, 0, 1)); > camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); > camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT); > camera->setRenderOrder(osg::Camera::PRE_RENDER, 0); > camera->setViewport(0, 0, tex->getTextureWidth(), > tex->getTextureHeight()); > camera->setGraphicsContext(gfxc); > camera->setDrawBuffer(GL_FRONT); > camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); > camera->attach(buffer, tex); > return camera.release(); > } > > // create float textures to be rendered in FBO > osg::Texture2D* ImageViewerCaptureTool::createFloatTexture(uint width, uint > height) > { > osg::ref_ptr<osg::Texture2D> tex2D = new osg::Texture2D; > tex2D->setTextureSize( width, height ); > tex2D->setInternalFormat( GL_RGB32F_ARB ); > tex2D->setSourceFormat( GL_RGBA ); > tex2D->setSourceType( GL_FLOAT ); > tex2D->setResizeNonPowerOfTwoHint( false ); > tex2D->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR ); > tex2D->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR ); > return tex2D.release(); > } > > void ImageViewerCaptureTool::setupViewer(uint width, uint height, double fovY) > { > // set graphics contexts > osg::ref_ptr<osg::GraphicsContext::Traits> traits = new > osg::GraphicsContext::Traits; > traits->x = 0; > traits->y = 0; > traits->width = width; > traits->height = height; > traits->pbuffer = true; > traits->readDISPLAY(); > osg::ref_ptr<osg::GraphicsContext> gfxc = > osg::GraphicsContext::createGraphicsContext(traits.get()); > > // set the main camera > _viewer = new osgViewer::Viewer; > osg::ref_ptr<osg::Texture2D> tex = createFloatTexture(width, height); > osg::ref_ptr<osg::Camera> cam = createRTTCamera(_viewer->getCamera(), > osg::Camera::COLOR_BUFFER0, tex, gfxc); > cam->setProjectionMatrixAsPerspective(osg::RadiansToDegrees(fovY), (width > * 1.0 / height), 0.1, 1000); > > // render texture to image > _capture = new WindowCaptureScreen(gfxc, tex); > cam->setFinalDrawCallback(_capture); > } > > osg::ref_ptr<osg::Image> > ImageViewerCaptureTool::grabImage(osg::ref_ptr<osg::Node> node) > { > // set the current node > _viewer->setSceneData(node); > > // if the view matrix is invalid (NaN), use the identity > if (_viewer->getCamera()->getViewMatrix().isNaN()) > _viewer->getCamera()->setViewMatrix(osg::Matrixd::identity()); > > // grab the current frame > _viewer->frame(); > return _capture->captureImage(); > } > > //////////////////////////////// > ////WindowCaptureScreen METHODS > //////////////////////////////// > > WindowCaptureScreen::WindowCaptureScreen(osg::ref_ptr<osg::GraphicsContext> > gfxc, osg::Texture2D* tex) { > _mutex = new OpenThreads::Mutex(); > _condition = new OpenThreads::Condition(); > _image = new osg::Image(); > > // checks the GraficContext from the camera viewer > if (gfxc->getTraits()) { > _tex = tex; > int width = gfxc->getTraits()->width; > int height = gfxc->getTraits()->height; > _image->allocateImage(width, height, 1, GL_RGBA, GL_FLOAT); > } > } > > WindowCaptureScreen::~WindowCaptureScreen() { > delete (_condition); > delete (_mutex); > } > > osg::ref_ptr<osg::Image> WindowCaptureScreen::captureImage() { > //wait to finish the capture image in call back > _condition->wait(_mutex); > return _image; > } > > void WindowCaptureScreen::operator ()(osg::RenderInfo& renderInfo) const { > osg::ref_ptr<osg::GraphicsContext> gfxc = > renderInfo.getState()->getGraphicsContext(); > > if (gfxc->getTraits()) { > _mutex->lock(); > > // read the color buffer as 32-bit floating point > renderInfo.getState()->applyTextureAttribute(0, _tex); > _image->readImageFromCurrentTexture(renderInfo.getContextID(), true, > GL_FLOAT); > > // grants the access to image > _condition->signal(); > _mutex->unlock(); > } > } > > > > ... > > Thanks in advance, > > Cheers, > Rômulo > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=75005#75005 > > > > > > _______________________________________________ > 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