[osg-users] Strange behaviour on GBufferCamera with 2 attached osg::Image

Robert Osfield robert.osfield at gmail.com
Wed Jun 27 07:04:52 PDT 2018


HI Werner,

The code looks OK. I don't see any reason why attaching an image to
both the colour and depth attachments wouldn't work, it's not
something I have tested out though.

There is chance it's an OSG bug, but perhaps there is something in
your setup that isn't quite right.  It's impossible to know from what
info I have.  Could you create a small test program that tests out
assigning an image to colour and depth buffers and if this fails then
share this so others like myself can have a look at it and either spot
an error on the OSG side or in your code.  If it works then this
simple case might shine a light on what you are doing differently.

Robert.
On Wed, 27 Jun 2018 at 14:52, Werner Modenbach
<Werner.Modenbach at texion.eu> wrote:
>
> Hi Robert,
>
> I'm sorry, I thougth it's OK like that.
> Find the definition of the "unknown" method below.
> I think this shrinks the code to be just OSG, except createScreenQuad() but that should not really matter.
>
> Thanks
>
> - Werner -
>
> Am 27.06.2018 um 15:44 schrieb Robert Osfield:
>
> Hi Werner,
>
> You appear to be included reference to calls and classes that aren't
> in the OpenSceneGraph, are you using a 3rd party library that is
> providing these?
>
> At this point I can't see a way of helping you as there bit doing the
> set up are unknown to us.
>
> Robert.
> On Wed, 27 Jun 2018 at 13:53, Werner Modenbach
> <Werner.Modenbach at texion.eu> wrote:
>
> Hi all,
>
> I found a strange behavior of a GBufferCamera. I want to get the color channel in one image and the depth channel in another image.When
> What I do:
>
>         if (!renderImage.valid()) {
>
>             renderImage = new osg::Image;
>
>             renderImage->allocateImage(width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1);
>
>             renderImage->setInternalTextureFormat(GL_RGBA8);
>
>         }
>
>         if (includeDepth && !depthImage.valid()) {
>
>             depthImage = new osg::Image;
>
>             depthImage->allocateImage(width, height, 1, GL_DEPTH_COMPONENT, GL_FLOAT, 1);
>
>             renderImage->setInternalTextureFormat(GL_LUMINANCE32F_ARB);
>
>         }
>
>         if (!includeDepth)
>             renderCamera = view->createRTTCameraImage(osg::Camera::COLOR_BUFFER, 0, renderImage.get(), true);
>         else
>             renderCamera = view->createRTTCameraGBufferImage(osg::Camera::COLOR_BUFFER0, renderImage.get(), osg::Camera::DEPTH_BUFFER, depthImage.get(),
>                                                             osg::Camera::COLOR_BUFFER1, 0, 0, true);
>
> The definition of createRTT...
>
>     osg::Camera *createRTTCameraGBufferImage(osg::Camera::BufferComponent _bufferType1, osg::Image *_image1,
>                                         osg::Camera::BufferComponent _bufferType2, osg::Image *_image2,
>                                         osg::Camera::BufferComponent _bufferType3, osg::Image *_image3,
>                                         int _orderNumber, bool _isAbsolute, bool _withScreenQuad = true) {
>
>     osg::ref_ptr<osg::Camera> camera = new osg::Camera;
>
>     camera->getOrCreateStateSet()->setGlobalDefaults();
>
>     camera->setClearColor(osg::Vec4());
>
>     camera->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
>
>     camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
>
>     camera->setRenderOrder(osg::Camera::PRE_RENDER, _orderNumber);
>
>     if (_image1) {
>
>         camera->setViewport(0, 0, _image1->s(), _image1->t());
>
>         camera->attach(_bufferType1, _image1);
>
>     }
>
>     if (_image2) {
>
>         camera->setViewport(0, 0, _image2->s(), _image2->t());
>
>         camera->attach(_bufferType2, _image2 );
>
>     }
>
>     if (_image3) {
>
>         camera->setViewport(0, 0, _image3->s(), _image3->t());
>
>         camera->attach(_bufferType3, _image3);
>
>     }
>
>     if (_isAbsolute) {
>
>         camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
>
>         camera->setProjectionMatrix(osg::Matrix::ortho2D(0.0, 1.0, 0.0, 1.0));
>
>         camera->setViewMatrix(osg::Matrix::identity());
>
>         if (_withScreenQuad) {
>
>             camera->addChild(createScreenQuad(1.0f, 1.0f));
>
>         }
>
>     }
>
>     return camera.release();
>
> }
>
> When rendering without depth, I get a correct color channel image.
> When rendering both, color and depth, the depth image is OK but the color image seems having only the red color information.
> Are there any limitations in using 2 images?
>
> Has anybody else had such an effect already or can anybody give me a hint?
>
> Many thanks in advance
>
> - Werner -
>
> Many thanks in advance.
> _______________________________________________
> 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


More information about the osg-users mailing list