使用在Xcode 7.3中的iPhone5s(硬件,不在模拟器中)上运行的openGL-ES3执行glClear时,会收到“无效帧缓冲区操作”。glClear中的“invalid framebuffer operation” - 在OpenGL ES3中使用sRGB
有问题的纹理是我的GBuffer的“最终”纹理,非常像本教程http://ogldev.atspace.co.uk/www/tutorial37/tutorial37.html。 由于ES3的限制,主要区别在于我请求的是sRGB纹理,而我使用的是GL_COLOR_ATTACHMENT3(而不是4)。
glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8, WindowWidth, WindowHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
// glTexParameteri ...
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, m_finalTexture, 0);
GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER); // No errors here
现在,当我试图清除它,我得到一个“无效的帧缓冲操作”
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
// Element at index**[i]** needs to match GL_COLOR_ATTACHMENT**i** on GL-ES3!
GLenum drawbuf[4] = { GL_NONE, GL_NONE, GL_NONE, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(sizeof(drawbuf)/sizeof(drawbuf[0]), drawbuf);
GLCheckError(); // no errors
glClear(GL_COLOR_BUFFER_BIT);
GLCheckError(); // => glGetError 506 GL_INVALID_FRAMEBUFFER_OPERATION
现在,如果不是我初始化纹理像这样的(所以没有的sRGB),OpenGL的不给在明确的错误:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, WindowWidth, WindowHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
现在,我的理解是,sRGB的支持OpenGL的ES3 ...那么,为什么不glClear失败? 任何想法的人?
这解决了这个问题 - 事实上,我没有注意到GL_SRGB不是颜色可渲染的(网址:https://www.khronos.org/opengles/sdk/docs/man3/html/glTexImage2D.xhtml) - 但它在创建帧缓冲区时肯定会返回GL_FRAMEBUFFER_COMPLETE。将其更改为GL_SRGB8_ALPHA8有效,glClear不再报告任何错误。还要感谢扩展的摘录,这解释了为什么它不被支持,现在它是有意义的。 – kalmiya