opengl - glBlitFramebuffer 导致访问冲突

标签 opengl segmentation-fault framebuffer

我正在尝试从 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 和窗口帧缓冲区的大小相同。

在 NVIDIA GeForce 580M GTX 上运行,驱动程序为 301.42(迄今为止,最新)。

知道为什么会发生这种情况吗?

[编辑:我发现从一个 FBO 传输到另一个 FBO 时不会出现问题,尽管似乎没有数据被复制]

最佳答案

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

无论如何,我认为段错误行为是 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(...)

关于opengl - glBlitFramebuffer 导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11130668/

相关文章:

c++ - 使用 glFrustum 进行离轴投影

c - bool 方法的段错误 11

C: pthread_create 上的段错误

opengl - 如何将模板从帧缓冲区传递到另一个

c - 尝试编译 xf86drm.h 示例

python - 使用 Glumpy 将 NumPy 数组显示为不断更新的图像

c++ - 如何在 OpenGL 3.3 中实现 3d 纹理

c - strncpy 段错误

c++ - glCheckFramebufferStatus 返回 0 并且在 glGetError 中没有错误

c++ - 在特定坐标后停止在 OpenGL 上渲染纹理