在查找相关资料的过程中,看到了很多人争论,出现Gamma Correction到底是人对自然亮度的感知原因,还是由于早期的 CRT 显示器存在非线性输出的问题。在研究了一些Gamma Correction资料后,个人认为早期Gamma Correction的出现是由于原来的 CRT 显示器存在非线性输出的问题,而在显示器完全可以解决非线性输出的问题的今天,Gamma Correction的存在更多的是由于人对自然亮度的感知。
人眼对环境光的不是随着光的强度线性增加的,越暗的地方,变化感受越明显,设1为白色,当环境为白色的0.2的时候,人眼感受的已经是0.5了:
Gamm校正的定义:Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:这个指数即为Gamma.
由于图像信息保存位数是有限的,为了更大限度的保存人眼能识别的颜色范围,需要多保存暗处信息,少保存亮度信息,因此照相机这保存图像是需要对原始颜色做个gamma校正,一般pow(0.45),这样图片保存的颜色空间就在gamma空间了。至于为什么是0.45这就是人眼的问题了。
一般图片RGB色彩都是在gamma空间内,gamma空间内的颜色直接计算,结果是错的,因为已经是非线性的颜色空间。如果在shader中想使用线性颜色空间,需要可以在着色器里来做类似实现:对传进来的贴图做幂为2.2的pow()函数处理,然后在颜色返回值前做幂为0.45的pow()函数处理。