Here is the code used to create the FBOs:
// Creation of the FBO
glGenFramebuffersEXT(1, &m_GLframeBufferId);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_GLframeBufferId);
// Creation of the render buffer
glGenRenderbuffersEXT(1, &m_GLrenderBufferId);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_GLrenderBufferId);
// Render buffer attachment
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_GLrenderBufferId);
// Unbind
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
Next, when I know the size of the render buffer, I create it.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_GLframeBufferId);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_GLrenderBufferId);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA, _width, _height);
ASSERT(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT);
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glViewport( 0, 0, _width, _height);
Next, I draw into the render buffer:
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDisable(GL_DITHER);
glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Dessin du fond
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, 1.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBegin(GL_QUADS);
glColor3f(0.949f, 0.953f, 0.957f);
glVertex2f(1.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glColor3f(0.735f, 0.888f, 0.972f);
glVertex2f(0.0f, 1.0f);
glVertex2f(1.0f, 1.0f);
glEnd();
And finally, I read the datas:
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, m_pBuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
As mentioned, I disable the GL_DITHER, and I obtain something better, but…
New screen
As specified on the screen, my desktop use 32bits colors.