2

我正在尝试从 FBO 复制到窗口的帧缓冲区。据我所知,窗口帧缓冲区对于 R、G、B 和 A 各有 8 位,并且有一个深度缓冲区(可能是 24 位)。FBO 有一个纹理附件(RGBA8 格式)并且没有渲染缓冲区。

问题是当我尝试将 FBO 传送到屏幕时,我遇到了访问冲突(SIGSEGV 的 Windows 术语)。位代码:

//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 时不会出现问题,尽管似乎没有数据被复制]

4

1 回答 1

1

似乎这个实现对输入的命令命令非常挑剔。我在对一些现有代码进行逆向工程后发现了以下内容。也许他们必须按这个顺序有一些神秘的原因,但我不知道是什么。

无论如何,我相信段错误行为是 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(...)
于 2012-06-22T00:02:36.397 回答