我在开发 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/