颜色空间,线性和伽马颜色空间
为什么要有伽马空间,那是因为人眼对亮度的感知没暗部感知来的敏感,举个例子,黑暗的房间,灯源数量从1增加到2,人眼能明显感知到变化。但从100增加到101,人眼就很难察觉变化,虽然从物理上来说它们的增量是相同的。
如果把真实光照按照线性变化,如0-100亮度对应0-1的像素值(8bit 像素对应 0~255 的线性亮度),则会造成大量的浪费,大部分亮度信息我们感知不明显。所以有伽马空间,就是通过一种矫正,把0-100的亮度映射到合理的范围(举个例子,0-50对应0-0.7,51-100对应0.7-1这样,不太准确的举例,但大概意思差不多)
把真实世界的线性光照进行非线性映射存储的过程叫伽马编码(sRGB 色彩空间),我们要看到照片:
Unity Editor 允许您使用传统的伽马颜色空间以及线性颜色空间。伽马颜色空间是历史悠久的标准格式,但线性颜色空间渲染可提供更精确的结果。
如需进一步阅读这方面的信息,请参阅以下相关文档:
- 线性或伽马工作流程,介绍应该选用线性颜色空间还是伽马颜色空间。
- 采用线性渲染的伽马纹理,介绍线性工作流程中的伽马纹理。
- 线性纹理,介绍如何使用线性纹理。
线性和伽马颜色空间
人眼对光强的反应不呈线性。我们在观察光时会发现一些亮度比另一些亮度更容易看到,即从黑到白的线性渐变在我们人眼中不是线性渐变的。
左:线性渐变。右:人眼对该渐变的感知情况。注意每种情况下界限(正好是中灰色)与渐变相融合的位置
由于历史原因,监视器和显示器具有相同的特性。向监视器发送线性信号会导致看起来像上图右侧的渐变,人眼观察感觉是错误的。为了弥补这一点,需要发送经校正的信号来确保监视器能够呈现出看起来自然的图像。这种校正称为伽马校正。
伽马和线性颜色空间同时存在的原因是,光照计算应该在线性空间中进行,以便确保数学上的正确性,但结果应该在伽马空间中呈现以便让人眼看起来正确。
在帧缓冲格式限制为每通道 8 位的旧硬件上,计算光照时使用伽马曲线可在人类可感知的范围内提供更高的精度。在人眼最敏感的范围内,使用的位数最多。
即使当今的监视器是数字显示器,它们仍然采用伽马编码信号作为输入信号。图像文件和视频文件显式编码到伽马空间(这意味着它们带有伽马编码值,而不是线性强度)。这便是标准;一切数值都在伽马空间内。
伽马空间的公认标准称为 sRGB(请参阅 Wikipedia)。该标准定义了它与线性空间之间的一个映射,使得人眼能充分利用 8 位/通道的精度。
线性渲染指的是渲染场景的过程,此情况下的所有输入都是线性的,也就是说,没有经过伽马校正以适合人眼观察或输出到显示器。
Unity里的设置:

从左往右分别是(Linear空间下不勾sRGB,Linear空间下勾sRGB,Gamma空间(勾不勾sRGB都一样))

需要在Shder里手动进行颜色空间的转换吗?
一、核心逻辑:sRGB 对 Shader 的影响本质
二、场景 1:Unity 全局颜色空间 = 线性(Linear)
1. 勾选 sRGB 的纹理(颜色图)
2. 取消 sRGB 的纹理(数据图)
关键例外:手动控制采样转换
三、场景 2:Unity 全局颜色空间 = 伽马(Gamma)
1. 勾选 / 取消 sRGB 的纹理
2. 数据图(法线 / 高度等)
四、关键总结:Shader 编写的通用原则

浙公网安备 33010602011771号