WebGL着色器输出是否应进行伽马调整?

12
WebGL片段着色器是否应输出线性的gl_FragColor RGB值,还是输出一些1γ次幂以修正显示伽马? 如果采用后者,则必须使用特定值还是完整应用程序可配置?
目前,WebGL规范中不包含“gamma”、“γ”或相关的“linear”,并且GL_ARB_framebuffer_sRGB扩展在WebGL中不可用。 是否有其他适用的规范? 如果这个规范描述不清楚,那么当前的实现会怎么做? 需要提供有信源的答案。
(假设我们已经成功加载或生成了线性颜色值;也就是说,纹理图像的伽马值不是问题。)
2个回答

7
这是一个棘手的问题,但从我所了解的情况来看(主要来自此电子邮件线程),目前的行为是对加载的线性颜色空间图像(如PNG)进行伽马校正。像JPEG这样的东西会在加载时不做任何转换,因为它们已经进行了伽马校正。(来源:https://www.khronos.org/webgl/public-mailing-list/archives/1009/msg00013.html)这表明纹理可能以非线性空间传递给WebGL,这将是有问题的。我不确定自2010年末以来是否有所改变。 在该线程的其他地方,很清楚地表明期望的行为应该是从WebGL输入和输出的所有内容都在线性颜色空间中。之后发生的事情超出了WebGL规范的范围(这就是为什么它对此问题保持沉默的原因)。
抱歉如果这并不能权威地回答你的问题,我只是尽力挖掘相关信息。至于是否应该在着色器中进行校正,我认为答案似乎是“不应该”,因为WebGL输出将被假定为线性,并尝试自我校正可能会导致颜色空间的双重转换。

你说“...WebGL的输出应该是线性颜色空间”,但同时又说“WebGL的输出将被假定为sRGB”,这两者似乎相互矛盾。能否请您澄清一下? - Kevin Reid
是的,解释是我打字比我思考得更快。 :) 已经纠正以保持一致。抱歉。 - Toji
谢谢。顺便提一下,该存档中的后续消息(例如https://www.khronos.org/webgl/public-mailing-list/archives/1009/msg00127.html)表明这实际上仍然是一个未解决的问题(可能会在未来的上下文选项中解决),但由于“OpenGL通常是线性的”等语言,线性可能会胜出。另外,如果您想真正完善您的答案,最好将第一段放在最后,因为根据我的问题,我担心的是输出而不是纹理加载。 - Kevin Reid
就我个人而言,当我在加载和输出时都明确添加伽马校正时,我的结果要好得多。不幸的是 :/ - Magnus Hoff
1
目前看来,答案似乎是“是”,因为当前的浏览器不会对输出执行伽马校正。 您可以使用一些着色器进行测试,例如 https://www.shadertoy.com/view/Xdl3DM 这意味着,如果您执行照明并且希望获得感知准确的输出,则应在您的着色器中实现伽马校正。 - h3r3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接