我正在尝试从 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/