【发布时间】: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