c++ - 来自 glClear() 的 OpenGL 帧缓冲区错误

标签 c++ opengl

我在开发 OpenGL 应用程序时遇到错误,我找不到任何有用的文档。在完整的帧缓冲区上调用 glClear() 时,会设置 OpenGL 错误 GL_INVALID_FRAMEBUFFER_OPERATION。似乎没有副作用 - glClear 调用甚至按预期工作。无论如何,它会抛出很多不必要的错误,导致很难找到有效的错误。

帧缓冲区设置如下:(在本例中,大小是显示分辨率的两倍)

glGenFramebuffers(1, &buffer);
glBindFramebuffer(GL_FRAMEBUFFER, buffer);

textures = new GLuint[1];
glGenTextures(1, textures);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Size.width, Size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);

renderBuffers = new GLuint[1];
glGenRenderbuffers(1, renderBuffers);
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffers[0]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Size.width, Size.height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBuffers[0]);

auto state = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(state != GL_FRAMEBUFFER_COMPLETE)
    printf("Incomplete frambuffer: %d\n", state); //Never hit, framebuffer reports complete

glBindFramebuffer(GL_FRAMEBUFFER, 0);

然后,当帧缓冲区被绑定(bind)时:

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, buffer);
glViewport(0,0,size.width, size.height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Sets GL_INVALID_FRAMEBUFFER_OPERATION error

到目前为止,这只发生在 Radeon 卡上,而且只出现在看似随机的帧上。如果场景没有改变,错误通常不会重现。

最佳答案

最终,我们偶然发现了这个问题的解决方案。在旧代码中调用了 glInterleavedArrays(),这导致对 glClear() 的调用以无意义的方式中断。

这没有明显的原因,所以现在我假设这是一个非常具体的驱动程序错误。

关于c++ - 来自 glClear() 的 OpenGL 帧缓冲区错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28618483/

相关文章:

opengl - 运行已编译的 C++ 文件时出错(使用 OpenGL)。错误 : “Inconsistency detected by ld.so: dl-version.c: 224”

Delphi - GLScene如何获取拾取对象的x,y,z

c++ - 尝试设置唯一指针 bool 数组的值时出现 BAD_ACCESS 错误

c++ - 变量的可访问性

C++ 如何使用运算符 < 对 vector<class *> 进行排序

opengl - 使用着色器在 2D 环境中实现视野

c++ - SFML & OpenGL(glew) 为什么我的程序在绘制到新窗口时失败?

c++ - 如何修复依赖于模板参数的 'there are no arguments to ' glGenVertexArrays ...' C++ 中的错误

c++ - 如何从二进制文件中读取最后一行

c++ - OpenCV C++ : Conversion from CV_32F to CV8U using converTo is giving unexpected values