本文参考: https://catlikecoding.com/unity/tutorials/rendering/part-3/
https://blog.csdn.net/candycat1992/article/details/46228771
Unity中有两种颜色空间,一是线性空间,另一个则是Gamma空间
线性空间
自然界中光的颜色是线性变化的,所谓线性变化岂、就是单位变化的间隔都是一样的,比如提升一个点接受的光强度n倍,则该点的亮度也会提升n倍,在渲染中光照计算的模拟都是通过线性函数完成,这也更符合自然变化规律
Gamma空间
人的眼睛对光的感知力并不是线性的,我们在暗环境下可以感知的细节大于我们在亮的环境下感知的细节,网上有很多例子,这里就不多说了,这个变化是个幂函数曲线,有意思的是当年CRT显示器造出来的时候,人们发现通过增加两倍的电压,却没有得到两倍的亮度,它的这个变化也是一个幂函数曲线,这个幂值大约是2.5,换句话说就是造CRT显示器的时候虽然没有达到设想的结果,却意外得到了更适合人眼接受的颜色效果,此后所有的显示器都保留了这个特性,也就是对要输出的颜色^2.5,也就是所谓的gamma校正
(图片来源于网络)
从上图可以看出,如果我们什么都不做,显示器经过gamma矫正后,显示出来的图像会比实际的颜色暗,我们如果需要在存诸在图片中的颜色^(1/gamma),这样一来,当显示器进行gamma矫正后,我们才能得到真实的世界的颜色
sRGB标准 (standard Red Green Blue)
全称standard Red Green Blue,是一种彩色语言协议,由微软联合爱普生、HP惠普等提供一种标准方法来定义色彩,让显示、打印和扫描等各种计算机外部设备与应用软件对于色彩有一个共通的语言。通俗的说就是它们规定了所有的显示设备最终都使用gamma值为2.2进行校正,相对的使用sRGB标准的图片用gamma值为1/2.2来存储颜色,两相抵消,最终可以得出接近真实的颜色。
现在我们回到上图(紫色的曲线,接近1/2.2姑且这么看)你会发现暗色的部分的变化拉大了,亮色部分的变化压缩了,这符合人眼对光的敏感度,美术同学就是在这样的环境(Gamma空间)中创作的
导入Unity的图片,默认为sRGB,即在gamma空间,当然我们也可以在图片的属性中去掉该选项,如果你的美术同学在线性空间中创作的话(一般不可能)
Gamma空间转线性空间
我们在做光照渲染的时候,几乎所有用到的函数都是线性函数,可当我们采样纹理的时得到却是gamma空间的数据,不同标准的数据进行运算,得出来的效果自然是错误的,这就是为什么我们需要先将gamma空间的数据转化成线性空间下的数据,然后在线性空间下进行计算完毕后再转回gamma空间的原因
文章评论