【发布时间】:2013-12-25 06:12:06
【问题描述】:
根据few related topics that I could find 的说法,我收集到获得正确光照计算的求幂步骤可能必须在 iOS 应用程序的最终片段着色器中完成。
我一直在使用最新最好的 Xcode 5 OpenGL 调试器进行性能分析,片段的幂运算占用了大量的计算量。这是整个着色器中花费时间最长的那条线(其余的性能被点光源所需的各种norm 调用吸走了)。
glEnable(GL_FRAMEBUFFER_SRGB); 不幸的是不能工作,因为GL_FRAMEBUFFER_SRGB 没有声明。
当然,我应该用于 GL ES 的实际枚举可能会有所不同。
据Apple:
SGX 543 和 554 支持以下扩展 仅限处理器:
EXT_color_buffer_half_float
EXT_occlusion_query_boolean
EXT_pvrtc_sRGB
EXT_shadow_samplers
EXT_sRGB
EXT_texture_rg
OES_texture_half_float_linear
嗯,很好,没有 543 或 554 的最新设备是 iPhone 4。
从the extension's text file 看来我可以将SRGB8_ALPHA8_EXT 设置为RenderbufferStorage 的internalformat 参数,但没有说明如何让正常的最终帧缓冲区免费为我们应用sRGB。
现在 sRGB 校正似乎缺少获得正确颜色的步骤。我一直在我的应用程序中处理可怕的“曝光不足”颜色是在片段着色器中手动应用这样的伽玛校正:
mediump float gammaf = 1.0/1.8; // this line declared outside of `main()`
// it specifies a constant 1.8 gamma
mediump vec4 gamma = vec4(gammaf, gammaf, gammaf, 1.0);
gl_FragColor = pow(color, gamma); // last line of `main()`
现在我认识到典型的渲染管道涉及一个或多个对纹理的渲染,然后是 FS 四边形绘制,这将使我有机会使用 SRGB8_ALPHA_EXT 渲染缓冲区,但如果没有我该怎么办一?我是索尔吗?
如果是这样的话,pow 调用会占用太多时间,以至于我几乎可以通过构建一维纹理来采样并用作伽玛查找表来从中挤出更多性能。然后可以使用此纹理以自定义方式调整输出颜色强度(与仅原始取幂相比,获得更好的 sRGB 近似值)。但这似乎有点不对劲,因为据说 sRGB 是免费的。
同样令人担忧的是,在 GL ES 2.0 规范中的任何地方都没有提到字符串 srgb。 According to the makers of glmGL ES 完全忽略了 sRGB。
我知道我已经使用我的代码来渲染纹理(我制作了一个基本的 OpenGL 驱动的图像查看器来渲染 PVRTC 纹理)并且它们没有“变暗”。我认为那里发生的事情是由于 GL ES 2 缺乏 sRGB 意识,纹理被加载为线性空间并以相同的方式写回。在这种情况下,由于没有应用光照(所有颜色都乘以 1.0),因此结果没有发生任何不好的事情。
【问题讨论】:
-
这并不完全正确。 GLES 确实支持 sRGB 默认帧缓冲区,但您需要另一个扩展(EGL 扩展)才能获得它。
EGL_KHR_gl_colorspace。这是一个非常新的扩展,所以我并不奇怪 G-Truc 不知道或没有写任何关于它的东西。 -
好的,这很有趣。正如你所说,它很新。令我惊讶的是,目前关于 iOS 上的伽马校正/sRGB 的文献很少。这让我猜测
EGL_KHR_gl_colorspace不是当前支持的 GL ES 2.0 扩展。 (GL 3.0 确实带来了 sRGB 支持,所以如果我的应用请求并获得 3.0 上下文,我应该为此做好准备。)
标签: ios opengl-es opengl-es-2.0