【问题标题】:glBlitFramebuffer causing Access ViolationglBlitFramebuffer 导致访问冲突
【发布时间】:2012-06-22 08:02:36
【问题描述】:

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

【问题讨论】:

  • 当您调用 glBlitFramebuffer 函数时,您确定 screen_rect 变量仍然指向有效数据吗?
  • 这是一个很好的检查,但是是的,我已经使用调试器验证了这一点。

标签: opengl segmentation-fault framebuffer


【解决方案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(...)

【讨论】:

  • 当我将图像从多采样 FBO 复制到常规 FBO 时,我在 GTX 680(驱动程序版本 331.65)上遇到了类似的行为,但 blit 并没有以访问冲突结束,而是复制了内容我指定为 GL_DRAW_FRAMEBUFFER 的 FBO 的主帧缓冲区。可能是绑定GL_FRAMEBUFFER(可能GL_DRAW_FRAMEBUFFER 在内部处理相同)替换了GL_DRAW_FRAMEBUFFERGL_READ_FRAMEBUFFER,因此顺序很重要。
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2016-06-15
  • 2018-12-07
  • 2012-05-24
相关资源
最近更新 更多