人眼对色彩强度的感知并不是线性的,而是非线性的。因此,如果直接将图像从数字表示转换到显示设备的模拟信号,会让色彩看上去很奇怪。所以,在输出到显示设备前,通常需要对线性信号进行校正,使其符合人眼的感知特性。

当颜色之间的关系是线性的时候,称之为线性色彩空间。而当颜色之间的关系是非线性的时候,称之为伽马色彩空间。将线性色彩空间转换为伽马色彩空间的过程,称之为伽马校正。公式如下:

colorgamma = colorlinear1/gamma

在 Unity 中,可以在 Edit > Project Settings > Player > Other Settings 下设置色彩空间 Color Space

线性色彩空间工作流程

当选择线性色彩空间时,对于线性纹理和非线性纹理,Unity 会分别使用以下流程进行处理:

  1. 线性纹理:采样 > 计算 > 伽马校正 > 显示。
  2. 非线性纹理:移除伽马校正 > 采样 > 计算 > 伽马校正 > 显示。

其核心思想是,在进行采样计算前,将纹理转换到线性空间,而在输出显示前,将纹理转换到伽马空间。这样可以保证计算的准确性,同时也能保证显示的正确性。

那么,什么是线性纹理,什么是非线性纹理呢?

  • 线性纹理:在 Unity 中,取消勾选 sRGB (Color Texture) 或者一些特殊用途的纹理,如法线贴图、噪声图等,被认为是线性纹理
  • 非线性纹理:在 Unity 中,勾选了 sRGB (Color Texture) 的纹理被认为是非线性纹理。

sRGB 是一种伽马值约为 2.2 的标准色彩空间,广泛应用于互联网和显示器。

伽马色彩空间工作流程

当选择伽马色彩空间时,Unity 不会对纹理进行任何处理,既不会在采样前移除伽马校正,也不会在显示前进行伽马校正。

如何选择色彩空间

线性色彩空间下的渲染结果会更准确,但开销会更大;而伽马色彩空间的渲染开销会更低,但效果并不好。

目前来说(2022),性能早已不是瓶颈,因此几乎所有游戏都使用线性色彩空间。