The second issue is a problem (overlapped copy of a different area of the viewport) on getting a bitmap from the MSAA pixel format. Here is the code, do you see something strange? On the ATI hardware this works perfectly…
uint fb = glGenFramebuffersEXT();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
cb = glGenRenderbuffersEXT();
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, cb);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, width, height);
db = glGenRenderbuffersEXT();
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, db);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, cb);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, db);
int status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
ReportFboStatus();
if (isFsaaAvailable && GL_EXT_framebuffer_multisample)
{
uint fb1 = glGenFramebuffersEXT();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb1);
cb1 = glGenRenderbuffersEXT();
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, cb1);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, width, height);
GL_RENderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_RGB8, width, height);
db1 = glGenRenderbuffersEXT();
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, db1);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height);
GL_RENderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, cb1);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, db1);
int status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
ReportFboStatus();
//Bind the MS FBO
glBindFramebufferEXT(gl.READ_FRAMEBUFFER_EXT, fb1);
//Bind the standard FBO
glBindFramebufferEXT(gl.DRAW_FRAMEBUFFER_EXT, fb);
gl.BlitFramebufferEXT(0, 0, posterWidth, posterHeight, 0, 0, posterWidth, posterHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
}
DrawScene();
glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, bitmapData.Scan0);
glDeleteTexture(cb);
glDeleteRenderbuffersEXT(db);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glDeleteFramebuffersEXT(fb);
if (isFsaaAvailable && GL_EXT_framebuffer_multisample)
{
glDeleteTexture(colorBuf);
glDeleteRenderbuffersEXT(depthBuf);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glDeleteFramebuffersEXT(fb);
}