我正在尝试从FBO复制到窗口的帧缓冲区。据我所知,窗口帧缓冲区对于R,G,B和A中的每一个都有8位,并且具有深度缓冲区(可能是24位)。 FBO有一个纹理附件(格式为RGBA8),没有渲染缓冲区。
问题在于,当我尝试将FBO blit到屏幕时,我得到了访问冲突(Windows术语为SIGSEGV)。 Blit代码:
//Earlier: const int screen_rect[4] = {0,0,512,512};
glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo->framebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glFinish();
//checking GL errors here gives no error
glBlitFramebuffer(
screen_rect[0],screen_rect[1],screen_rect[2],screen_rect[3],
screen_rect[0],screen_rect[1],screen_rect[2],screen_rect[3],
GL_COLOR_BUFFER_BIT,
GL_NEAREST //EDIT: I've also tried GL_LINEAR
);
glFinish();
//never reaches here
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
glBindFramebuffer(GL_READ_FRAMEBUFFER,0);
FBO是GL_FRAMEBUFFER_COMPLETE_EXT,任何时候都不会发生GL错误。 FBO和窗口框架缓冲区的大小相同。
使用驱动程序301.42(迄今为止,最新)在NVIDIA GeForce 580M GTX上运行。
为什么会发生这种情况的任何想法?
[编辑:我发现从FBO到另一个FBO进行blit时没有出现问题,虽然似乎没有复制数据]
答案 0 :(得分:1)
这个实现似乎非常挑剔订单命令。我在对一些现有代码进行逆向工程后想出了以下内容。也许有一些神秘的原因,他们必须按此顺序,但我不知道是什么。
无论如何,我认为segfaulting行为是NVIDIA OpenGL实现中的一个错误。
不用多说,关键命令,依次为:
GLenum buffers1[] = {GL_BACK};
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
glDrawBuffers(1,buffers1);
glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo->framebuffer);
glReadBuffer(GL_COLOR_ATTACHMENT1);
glBlitFramebuffer(...)