ios - glClear 上的 "invalid framebuffer operation"- 在 OpenGL ES3 中使用 sRGB

标签 ios xcode opengl-es

使用 openGL-ES3,在 Xcode 7.3 的 iPhone5s(硬件,而不是模拟器)上运行,我在执行 glClear 时收到“无效的帧缓冲区操作”。

有问题的纹理是我的 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);

据我了解,OpenGL ES3 支持 sRGB ...那么为什么 glClear 会失败? 有什么想法吗?

最佳答案

GL_SRGB8 不是 ES 3.0 中的颜色可渲染格式。在规范文档中:

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

这也匹配 EXT_srgb扩展规范,在“问题”下:

Do we require SRGB8_EXT be supported for RenderbufferStorage?

No. Some hardware would need to pad this out to RGBA and instead of adding that unknown for application developers we will simply not support that format in this extension.

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

最接近的颜色可渲染替代方案是 GL_SRGB8_ALPHA8

关于ios - glClear 上的 "invalid framebuffer operation"- 在 OpenGL ES3 中使用 sRGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38962338/

相关文章:

opengl-es - FBO 的 glReadPixels 太慢

ios - PowerVR GPU 如何提供深度缓冲?

ios - Testflight:无法上传构建,无法下载 SDK

iphone - 我如何使一个表格 View 指向具有另一个表格 View 的页面?

iphone - 显示 UIImageView 的问题

ios - 似乎无法将纹理加载到 OpenGL ES 中。我究竟做错了什么?

ios - 在 OpenAL (iOS) 中设置平移

ios - 无法将 ****.com 团队与 Apple Developer Portal 同步。未知此类主机。 (Xamarin 项目)。?

ios - NSXMLParser 的奇怪行为与\n

ios - 一个 iOS(或 OS X)项目依赖于一个框架的两个版本