10

WebGL 片段着色器是否应该输出gl_FragColor线性的 RGB 值,或者输出1 ⁄<sub> γ功率以校正显示伽马?如果是后者,是否有要使用的特定值或必须可配置完整的应用程序?

WebGL 规范目前不包含“gamma”、“γ”或“linear”的相关用法,并且GL_ARB_framebuffer_sRGB扩展在 WebGL 中不可用。还有其他适用的规范吗?如果未指定,当前的实现会做什么?一个来源良好的答案将不胜感激。

(假设我们已成功加载或程序生成线性颜色值;也就是说,纹理图像的伽马不存在问题。)

4

2 回答 2

6

这是一个艰难的问题,但从我能够挖掘的内容(主要来自这个电子邮件线程)看来,当前的行为似乎是在加载线性色彩空间图像(例如 PNG)时对其进行伽玛校正。JPEG 之类的内容无需任何形式的转换即可加载,因为它们已经经过伽马校正。(来源:https ://www.khronos.org/webgl/public-mailing-list/archives/1009/msg00013.html )这表明纹理可能会在非线性空间中传递给WebGL,这将是有问题的。我不确定自 2010 年底以来情况是否发生了变化。

在该线程的其他地方,非常清楚的是,所需的行为应该是从 WebGL 输入和输出的所有内容都应该在线性颜色空间中。除此之外发生的事情超出了 WebGL 规范的范围(这就是它对这个问题保持沉默的原因)。

抱歉,如果这不能权威地回答你的问题,我只是在挖掘我能做的事情。至于您是否应该在着色器中进行校正,我会说答案似乎是“不”,因为 WebGL 输出将被假定为线性的,并且尝试自我校正可能会导致到颜色空间的双重变换。

于 2012-07-02T20:47:28.083 回答
2

当我在Freenode #webgl(2012 年 6 月 29 日)上提到这个问题时, Florian Boesch强烈表示几乎所有用户的系统在 gamma 方面都存在无可救药的错误配置,因此获得良好结果的唯一方法是提供 gamma WebGL 应用程序中的选项,即使 WebGL 为帧缓冲区数据指定了颜色空间(无论是线性还是非线性),它也不会为监视器正确转换。

于 2012-07-02T20:57:22.257 回答