WebGL 片段着色器输出的 gl_FragColor
RGB 值应该是线性的,还是某个 1⁄γ功率以校正显示 Gamma ?如果是后者,是否有特定的值可供使用,或者完整的应用程序必须是可配置的?
WebGL Specification目前不包含“gamma”、“γ”或“线性”的相关使用,并且 GL_ARB_framebuffer_sRGB
扩展名是 not available in WebGL 。还有其他适用的规范吗?如果未指定,当前的实现会做什么?如果有来源良好的答案,我们将不胜感激。
(假设我们已经成功加载或程序生成线性颜色值;也就是说,纹理图像的 Gamma 值不存在问题。)
最佳答案
这是一个困难的问题,但从我能够挖掘的内容(主要来自 this email thread )来看,当前的行为似乎是在加载线性颜色空间图像(例如 PNG)时对其进行 Gamma 校正。像 JPEG 这样的东西无需任何类型的转换即可加载,因为它们已经经过 Gamma 校正。 (来源:https://www.khronos.org/webgl/public-mailing-list/archives/1009/msg00013.html)这表明纹理可能会在非线性空间中传递到 WebGL,这会出现问题。我不确定自 2010 年底以来情况是否有所改变。
Elsewhere in that thread非常明确的是,期望的行为应该是 WebGL 的所有输入和输出都应该位于线性颜色空间中。除此之外发生的事情超出了 WebGL 规范的范围(这就是为什么它对这个问题保持沉默)。
很抱歉,如果这不能权威地回答您的问题,我只是在挖掘有关此事的信息。至于是否应该在着色器中进行校正的问题,我想说答案似乎是“否”,因为 WebGL 输出将被假定为线性的,并且尝试 self 校正可能会导致色彩空间的双重变换。
关于webgl - WebGL 着色器输出是否应该针对 Gamma 进行调整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843321/