WebGL片段着色器输出gl_FragColor
RGB值是线性的,还是某些 1 / γ 电源的顺序纠正显示伽玛?如果是后者,是否需要使用特定值,或者必须配置完整的应用程序?
WebGL Specification目前不包含“gamma”,“γ”或“linear”的相关用法,GL_ARB_framebuffer_sRGB
扩展名为not available in WebGL。是否有其他适用的规范?如果未详细说明,当前的实现有何作用?一个很好的答案将不胜感激。
(假设我们已经成功加载或程序生成线性颜色值;也就是说,纹理图像的伽玛不是问题。)
答案 0 :(得分:6)
这是一个艰难的问题,但是从我能够挖掘的内容(主要来自this email thread)来看,目前的行为似乎是将图像线性颜色空间图像(如PNG)进行伽马校正。他们被装上了。像JPEG这样的东西在没有任何变换的情况下加载,因为它们已经被伽马校正。 (来源:https://www.khronos.org/webgl/public-mailing-list/archives/1009/msg00013.html)这表明纹理可能会在非线性空间中传递给WebGL,这可能会有问题。我不确定自2010年底以来这是否有所改变。
Elsewhere in that thread非常明确地说,期望的行为应该是WebGL的所有输入和输出都应该在线性颜色空间中。除此之外发生的事情超出了WebGL规范的范围(这就是为什么它在这个问题上保持沉默)。
很抱歉,如果没有权威性地回答你的问题,我只是在挖掘我能解决的问题。至于是否有问题你应该在着色器中进行校正,我会说答案似乎是“不”,因为WebGL输出将被假定为线性,并且试图自我纠正可能导致对色彩空间进行双重转换。
答案 1 :(得分:1)
当我在Freenode #webgl(2012年6月29日)上提到这个问题时,Florian Boesch强烈表达了几乎所有用户的系统在伽玛方面都无可救药地错误配置的意见,因此是唯一的获得良好结果的方法是在WebGL应用程序中提供gamma选项,因为即使WebGL为帧缓冲区数据指定了颜色空间(无论是线性还是非线性),它也无法正确转换为监视器。