Hi again Cedric,

I think I have last piece of the puzzle. It looks like readPixels work perfectly correct with float Renderbuffer. I was blaming it because scene background was properly darkened by postRender camera callback but rendered cessna model seemed unafected by image darkennig process. Image darkenning was done by simple color scaling by 0.5.

It turned out that cessna interior was also properly scaled. But when Renderbuffer was float, render buffer color compononts were not clamped to 0..1 range (which is obvious for float buffers, but I always forget about it;-). Shaders were substituting colors with vertices and multiplying them by 2 (Sine uniform) so even after scaling by 0.5 we were still having color components much larger than 1.0. Thats why cessna interior seemed not darkened at all.

Jeez, I learned a lot today ;-) Thanks for interesting example ;-)

Cheers,

Wojtek

Hi Cedric,

I just have found one more bit of info. Image internalTextureFormat gets reset by Image::allocateImage called from Image::readPixels when RTT camera buffer contents are read into image after first draw. So this does not happen when texture is applied for final scene draw.

I am not sure if resseting internal format from GL_RGBA32F_ARB to GL_RGBA should not be considered as a bug ?

However, it still does not explain what happens with image during and after readPixels got called when render buffer was GL_RGBA32F_ARB.

Cheers,
Wojtek


Well thank you for helping,
You give me a lot of imformation, i will dig it

Cedric

Wojciech Lewandowski wrote:
Hi Cedric,

If someone has some clue or advise to dig it

Sorry I had no time to look at the repro you created. I looked at your earlier modified prerender example though. I got curious and started to debug it I think I found some additional important circumstances and workaround that my help you. But topic is quite mixed nad complex and I may have problems explaining it. But here it goes:

Both DrawThreadPerContext and CullThreadPerCameraDrawThreadPerContext modes
use osgViewer::Renderer thread with double buffered SceneViews.
SingleThreaded and CullDrawThreadPerContext use single SceneView for
rendering. (CullDrawThreadPerContext also uses Renderer but only with one
SceneView see osgViewer::Rendered::cull_draw method in comparison to
osgViewer::Renderer::draw & osgViewer::Renderer::cull)

Double buffered SceneViews mean that there are two interleaved SceneViews performing cull and draw operations for subsequent odd/even frames. These
two scene views share some resources but may also create some separate
resources. For example, if texture is attached to RTT camera, each of these SceneViews will create two separate FBOs for this camera but these FBOs will share camera texture. But when you attach the image to RTT camera, each of these FBOs will create spearate render buffer and will read pixels to the camera image from the buffer.

What seems to be the case in your modified osgprerender looks like there is either some problems with refreshing the image in one of these SceneViews. I ran your example through gliIntercept and found something really weird. First SceneView FBO creates Renderbuffer with RGBA_32F format but second SceneView creates RenderBuffer with RGBA format. So you end up with situation when odd RTT camera frames are rendered into float framebuffer but even frames are rendered into ubyte framebuffer. Apparently readPixels from float buffer fails somehow and only read pixels from ubyte work as intended.

I got curious why first SceneView FBO uses float buffer but second uses ubyte buffer. I think the answer is following: Apparently first frame drawn by prerender RTT camera proceeds before rendered texture is initialized and aplied to draw final scene. When first FBO is created its render buffer is based on initial image internal format (RGBA_32F). FBO is build and used to render first frame and then its contents are read to the image. Then main camera draws scene using texture initilized from updated image. When this texture gets applied for the first time, image internal image format gets changed to texture format (RGBA) and thus second FBO is created using this different format

So we end up with odd prerender frames rendered into RGBA_32F buffer and even frames rendered into RGBA byte buffer. But this does not explain why readPixels produce so visually different results. It looks like there might be additional bug in OSG or OpenGL in reading pixels from RGBA_32F framebuffer.

Now time for the conclusion. I don't have much time to dig this further, and see why readPixels fail, maybe will investigate this some other day. So I don't have a real fix, but you may try a simple workaround. Set initial internal image format to RGBA instead of RGBA_32F. I did that and it seemed to remove the discrepancy. Alternatively make sure that texture build from image has its internal format set to RGBA_32F. But I did not try this option.

Cheers,
Wojtek




J.P. Delport wrote:
Hi,

for our current app we use singlethreaded. FBO is a requirement
because of multiple render targets.

Best would be to fix multithreaded and FBO. For this we will need
small test apps that reliably trigger errors.

Problem is that I think most people are unsure whether they are
abusing OSG (not using the library correctly, not setting dynamic
correctly, not blocking correctly...) or whether it is a bug.

jp

Cedric Pinson wrote:
What do you use to have a robust solution ? maybe i should just use
something different than fbo ?

Cedric

J.P. Delport wrote:
Hi,

Cedric Pinson wrote:
Hi,

I would like to know if other found some strange issue with multi
threaded, and render slave camera to fbo.

Yes, there have been quite a few discussions about multithreaded and
fbo in the recent months, but AFAIK nobody has put a finger on the
exact problem yet.

Attached is a simple modded version of osgprerender that also
displays something strange in multithreaded. I'm not sure if it is
related though.

run with:
./osgprerender --image

The image flashes every second frame for some reason. (Turn sync to
vblank on so it does not flash too fast.)

If, at the bottom of the .cpp, one enables the single threaded
option, the flashing disappears.

I have tried setting properties to dynamic on scene nodes, but it
does not seem to help, or I am missing a critical one.

jp

------------------------------------------------------------------------



_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org





--
+33 (0) 6 63 20 03 56  Cedric Pinson mailto:[EMAIL PROTECTED]
http://www.plopbyte.net





--------------------------------------------------------------------------------



_______________________________________________
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

--
+33 (0) 6 63 20 03 56 Cedric Pinson mailto:[EMAIL PROTECTED] http://www.plopbyte.net


_______________________________________________
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

Reply via email to