glBlitFramebuffer导致访问冲突

时间:2012-06-21 02:12:00

标签: opengl segmentation-fault framebuffer

我正在尝试从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时没有出现问题,虽然似乎没有复制数据]

1 个答案:

答案 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(...)