Hi!
The following issue only occurs on ATI cards.
I render the scene into a multisampled framebuffer.
Then I blit (downsample) the multisampled framebuffer
to a non-multisampled one and try to read the depth
value at a certain pixel using glReadPixels.
But I always get 0.0 as depth value.
On NVidia cards everything works fine.
If I disable the multisampling it also works on ATI cards.
============= Full description =============
The multisampled framebuffer is setup like this:
// Create multisampled framebuffer
glGenFramebuffersEXT(1, &Handle_FB_MS);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Handle_FB_MS);
// Create and attach multisampled depth-stencil renderbuffer
glGenRenderbuffersEXT(1, &Handle_RB_depth_stencil);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, Handle_RB_depth_stencil);
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_DEPTH24_STENCIL8_EXT, Width, Height);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, Handle_RB_depth_stencil);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, Handle_RB_depth_stencil);
// Create and attach multisampled color renderbuffer
glGenRenderbuffersEXT(1, &Handle_RB_color);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, Handle_RB_color);
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_RGBA8, Width, Height);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, Handle_RB_color);
CheckStatus();
The other framebuffer setup:
// Create non-multisampled framebuffer
glGenFramebuffersEXT(1, &Handle_FB);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Handle_FB);
// Create and attach depth-stencil renderbuffer
glGenRenderbuffersEXT(1, &Handle_RB_depth_stencil);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, Handle_RB_depth_stencil);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, Width, Height);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, Handle_RB_depth_stencil);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, Handle_RB_depth_stencil);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
// Create and attach color renderbuffer (texture)
TextureColor= InitTexture(...);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TextureColor->Handle, 0);
CheckStatus();
During rendering I blit (downsample) the first multisampled framebuffer to the second non-multisampled:
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, From->Handle_FB_MS);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, To->Handle_FB);
glBlitFramebufferEXT(0, 0, Width, Height, 0, 0, Width, Height, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
Then I read a pixel from the downsampled framebuffer:
// x and y lie between 0 and the maximum screen width/height
GLfloat Zf;
glReadPixels((GLint)x, (GLint)y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &Zf);
But I always get Zf == 0.0. As I said this only happens
on ATI cards, on NVidia cards everything works fine.
And without multisampling it works on both cards.
Help is really appreciated cause I’m stuck at this point!