gamma校正

gamma校正是为了解决什么问题呢?是为了解决我们人眼的感知误差问题。
我们在之前的章节中,用rgb的0到1的值来表示颜色的亮度。这个是线性的表示,0表示黑,1表示白。那么自然的0.5表示的就是白色的一半亮度。但是从下面的途中,我们能看到我们的模型在0.4的时候已经很亮了,而0和0.1之间的灰度没有更细致的表示,也就是说我们的模型太亮了。gamma校正就是为了解决我们人眼的这种感知误差的问题的。
gamma
第一行是人眼所感知到的正常的灰阶,亮度要增加一倍(比如从0.1到0.2)你才会感觉比原来变亮了一倍。打个比方:颜色值从0.1到0.2,我们会感受到一倍的颜色变化,而从0.4到0.8我们才能感受到相同程度(变亮一倍)的颜色变化。
第二行的灰阶显示出的才是物理世界真实的亮度。

如果我们的颜色是在rgb线性空间的话,那么可以用下面的公式来进行gamma校正:

1
2
float gamma = 2.2;
fragColor.rgb = pow(fragColor.rgb, vec3(1.0/gamma));

如果颜色已经在sRGB空间的话,这是已经做过gamma校正的了,则可以直接使用,而不用再做了,否则会导致图片偏亮。

参考资料:
https://learnopengl-cn.github.io/05%20Advanced%20Lighting/02%20Gamma%20Correction/#