据非常few related topics that I could find我收集到的是,获得正确光照计算的求幂步骤可能必须在 iOS 应用程序的最终片段着色器中完成。
我一直在使用最新最好的 Xcode 5 OpenGL 调试器进行性能分析,片段的求幂计算量很大。这是整个着色器中花费时间最长的线(其余性能被点光源所需的各种 norm
调用所耗尽)。
glEnable(GL_FRAMEBUFFER_SRGB);
不起作用,因为未声明 GL_FRAMEBUFFER_SRGB
。
当然,我应该为 GL ES 使用的实际枚举可能会有所不同。
根据 Apple :
The following extensions are supported for the SGX 543 and 554 processors only:
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 校正似乎是获得正确颜色所缺少的步骤。我在我的应用程序中为处理可怕的“曝光不足”颜色所做的工作是在片段着色器中手动应用 Gamma 校正,如下所示:
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
渲染缓冲区,但我我应该没有一个吗?我是 SOL 吗?
如果是这样的话,pow
调用会占用太多时间,我似乎可以通过构建 1D 纹理进行采样并用作 Gamma 查找表。然后可以使用此纹理以自定义方式调整输出颜色强度(与仅原始取幂相比,获得更好的 sRGB 近似值)。但这似乎有点不对劲,因为据说 sRGB 是免费的。
还有一点令人担忧的是,在 GL ES 2.0 规范中没有任何地方提到字符串 srgb
。 According to the makers of glm
GL ES 完全忽略 sRGB。
我知道我已经使用我的代码来渲染纹理(我制作了一个基本的 OpenGL 驱动的图像查看器来渲染 PVRTC 纹理)并且它们没有“变暗”。我认为那里正在发生的事情是由于 GL ES 2 缺乏 sRGB 意识,纹理被加载为线性空间并以相同的方式写回。在这种情况下,由于没有应用任何光照(所有颜色都乘以 1.0
),结果没有任何问题。
最佳答案
iOS 7.0 添加了新的颜色格式 kEAGLColorFormatSRGBA8
,您可以为 kEAGLDrawablePropertyColorFormat
键设置它来代替 kEAGLColorFormatRGBA8
(默认值) CAEAGLLayer
的 drawableProperties
字典。如果您使用 GLKit 为您管理主帧缓冲区,您可以通过将 drawableColorFormat
属性设置为 GLKViewDrawableColorFormatSRGBA8888
,让 GLKView
创建一个 sRGB 渲染缓冲区>.
请注意,EXT_sRGB
的 OpenGL ES 版本的行为就像始终启用 GL_FRAMEBUFFER_SRGB
一样。如果您想在不与目标帧缓冲区进行 sRGB 转换的情况下进行渲染,则需要使用具有非 sRGB 内部格式的不同附件。
关于ios - iOS OpenGL ES 2.0 上的 sRGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20769620/