Gamma和Linear

线性空间

在线性空间下,我们感知到的强度和对应的数值强度是按比例对应的,也就是说如果有两个数值强度0.25和0.25那么他们相加的数值强度就是0.5。没有这样特性的空间就是非线性空间。

伽马空间

之所以引入gamma空间一是因为显示器对颜色强度的感知是非线性的,另一个原因是人眼在较暗的环境下比起亮的环境能够更好的辨别细节。因此在图像压缩中我们希望能够在暗部获得更高的精确度,所以对图像每个像素引入了一个幂函数来进行处理。

上图(图片来自kinematicsoup)可以看到,当我们在0.45的gamma下,暗部区域有了更高的值,这样就为暗部获取了更高的精确度,但是亮部区域信息就被压缩了。以这样形式存储的图片就称为放在gamma空间中,在显示器上显示的时候会对图片进行一个gamma为2.2的幂的操作,在这里就抵消了0.45gamma的影响,因此能够显示正常。

常见流程

在游戏中为了达到更真实的渲染结果 (常见于PBR),因此先去除gamma矫正再对图像进行操作

这里写图片描述

Unity中的设置

在unity中通过Edit->Project Settings->Player->Other Settings中可以直接设置在线性空间中进行

Unity默认对移动平台不支持线性空间。但可以在着色器里来做类似实现:对传进来的贴图做幂为2.2的pow()函数处理,然后在颜色返回值前做幂为0.45的pow()函数处理。这种实现有计算开销,不能滥用

参考

kinematicsoup