GLSL对预乘输出进行正确的Gamma校正

时间:2018-01-22 12:23:01

标签: opengl glsl

我正在片段着色器中执行线性输入的伽马校正。但在我的情况下,输出像素也是预乘的(为了正确的alpha混合)。在这种情况下,我不确定正确的顺序是什么:

 vec4 pixelOut = vec4(pow(color.xyz,vec3(1.0/2.2)) * alpha, alpha);

或者:

 vec4 pixelOut = vec4(pow(color.xyz * alpha,vec3(1.0/2.2)) , alpha);

我应该在预乘之前或之前对像素颜色进行伽马校正吗?

从视觉上看,我目前无法发现任何差异。

1 个答案:

答案 0 :(得分:2)

伽玛校正应该是着色管道的最后一步。在sRGB空间中混合会导致错误的结果。 有关此问题的详细解释/讨论,请查看Naty Hoffman的博客文章Adventures with Gamma-Correct Rendering

  

正确的做法是在线性空间中执行与任何其他着色计算一样的混合。

因此,您应首先使用alpha进行预乘,然后进行伽马校正。