译自:http://www.kinematicsoup.com/news/2016/6/15/gamma-and-linear-space-what-they-are-how-they-differ
线性空间照明的概念越来越多的被开发人员使用,为了达到下一代真实感使用基于物理(PBR)的渲染。线性空间和其对应的伽马空间是很简单和重要的概念,下文说明了两种空间是什么,它们的不同,和它们是如何使用的。
线性空间
首先我们需要了解线性颜色空间的概念。简单的说,它意味数值强度与它的感知强度成正比。这意味着可以正确的添加和相乘颜色。一个颜色空间没有属性叫"non-linear"。下面是一个双倍强度值在线性空间和非线性空间的例子。虽然在线性空间中相应数值是正确的,但是在非线性空间中,我们不能简单的通过加法得到结果
相机对于光强的感知是基于线性的,业界的图片都是存储在Gamma空间中,那么相机的到最终的图片就会经历一个编码过程,也就是Gamma编码, Vout = Vin(1/2.2) ;
伽马空间
需要使用伽马的两种主要情况:首先屏幕对强度是非线性的相应。另一点人眼在暗色的识别比在亮色的识别更好,这意味着图片压缩到存储空间,我们想得到更好的精度对于暗强度,且牺牲了较亮强度。这两个问题都是通过伽马矫正来解决的问题,伽马校正是指将图片中的每个像素强度他通过幂函数进行处理。具体来说,gamma是应用于图像的幂的名称。
下图显示了gamma值的不同
Gamma补偿
通过相机拍摄的图片,以gamma空间的存储格式(sRGB),那么在显示器上查看图片,是否也是以(sRGB)显示的?不是的。
业界通过对原生自然光进行压缩,那么一定要将压缩的图片转换回来,得到接近自然界的图像,就是Gamma补偿,也叫做Gamma校正。
解压过程:Vout = Vin2.2
这一步使显示器自动执行
Unity中使用线性空间和Gamma空间
在引擎中的光学计算(shader)中,是基于线性空间的公式进行的。但是输入的数据是基于gamma空间存储方式,图像采样结果作为光学计算公式的输入,得到的输出结果自然是错误的。
Gamma空间的处理过程
在gamma空间中,shader进行光学计算的过程中,直接将图像采样的结果带入公式进行计算,得到的color存入colorbuff中,然后提交到显示器,进行一次gamma补偿得到最终颜色
线性空间的处理过程
如果原图是Gamma空间的sRGB存储方式,需要勾选sRGB标志,这样在进行shader计算的时候,会先进行一次gamma补偿,将颜色从gamma空间转换到线性空间,然后进行正确的光照计算,得到的结果最后在转换回gamma空间,最后提交到显示器。