2016-08-15 46 views
1

使用在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失败? 任何想法的人?

回答

1

GL_SRGB8在ES 3.0中不是可呈现颜色的格式。在规范文件:

  • 在开始128页的“必需的纹理格式”部分,SRGB8将在“纹理仅色彩格式”中列出。
  • 在表3.13中,从第130页开始,SRGB8在“Color-renderable”列中没有复选标记。

这也符合EXT_srgb扩展规范,在 “问题”:

我们是否需要为SRGB8_EXT被RenderbufferStorage支持?

不,有些硬件需要将其填充到RGBA,而不是为应用程序开发人员添加未知数,我们将不支持该扩展中的格式。

glCheckFramebufferStatus()在这种情况下应该返回GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT。如果不这样做,那看起来像是OpenGL实现中的一个错误。

最接近色彩的替代品是GL_SRGB8_ALPHA8

+0

这解决了这个问题 - 事实上,我没有注意到GL_SRGB不是颜色可渲染的(网址:https://www.khronos.org/opengles/sdk/docs/man3/html/glTexImage2D.xhtml) - 但它在创建帧缓冲区时肯定会返回GL_FRAMEBUFFER_COMPLETE。将其更改为GL_SRGB8_ALPHA8有效,glClear不再报告任何错误。还要感谢扩展的摘录,这解释了为什么它不被支持,现在它是有意义的。 – kalmiya

0

试试这个 的#define GL_COLOR_BUFFER_BIT 0x00004000

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);