ios - iOS OpenGL ES 2.0 上的 sRGB

标签 ios opengl-es opengl-es-2.0

据非常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 设置为 RenderbufferStorageinternalformat 参数,但没有说明如何获得正常的最终帧缓冲区以应用 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 规范中没有任何地方提到字符串 srgbAccording to the makers of glm GL ES 完全忽略 sRGB。

我知道我已经使用我的代码来渲染纹理(我制作了一个基本的 OpenGL 驱动的图像查看器来渲染 PVRTC 纹理)并且它们没有“变暗”。我认为那里正在发生的事情是由于 GL ES 2 缺乏 sRGB 意识,纹理被加载为线性空间并以相同的方式写回。在这种情况下,由于没有应用任何光照(所有颜色都乘以 1.0),结果没有任何问题。

最佳答案

iOS 7.0 添加了新的颜色格式 kEAGLColorFormatSRGBA8,您可以为 kEAGLDrawablePropertyColorFormat 键设置它来代替 kEAGLColorFormatRGBA8(默认值) CAEAGLLayerdrawableProperties 字典。如果您使用 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/

相关文章:

ios - 如何在 swift 4 中隐藏 SexyTooltip?

ios - 从 iOS App 中的音频文件中分离语音和音乐(制作卡拉 OK)

Android:在 GLSurfaceView 中创建纹理会从标准硬件加速 View 元素中删除纹理

java - 当我尝试创建 Opengl ES 环境时,我的应用程序不断崩溃

ios - 如何根据 iOS 应用报告获取付款?

IOS:将imageview从 ScrollView 拖放到 View 中

api - opengl当前顶点是什么?

android - 无法将已编译的着色器链接到 OpenGL ES 2.0 Android 程序

java - Opengl es 2.0 在视频上绘制位图叠加

android - 如何从 colors.xml 为 GLES20.glClearColor() 提供参数?