一、基本概念
1. 线性空间 (Linear Space)
- 数值和物理亮度成正比
- 0.5 = 50%亮度, 真实反映物理量
- 理解: 现实世界中光是线性叠加的,线性空间的数值也与物理强度成正比,因此能更真实地还原现实世界
2. 伽马空间(Gamma Space)
- 前置知识: 人眼对光的感知是非线性的,对暗部更敏感,对亮部不敏感
- 数值经过非线性编码
- 0.5 ≈ 22%亮度(约等于0.5^2.2)
- 理解: 在gama编码下(如上计算), 会给暗部保留更多细节(指数函数的特征), 所以看起来更符合人眼的认知
二、使用
1. 理解
- 既然线性空间更符合物理规律, 更适合用于计算, 而伽马空间更符合人眼认知, 那么结合两者的情况下:可以使用线性空间进行计算, 使用伽马空间进行存储 和 显示
2. 线性空间工作流
- Edit → Project Settings → Player → Other Settings → Color Space: Gamma / Linear (这里选择的是工作流)
- 当前环境,最好选用线性空间工作流(除了很老旧的设备)
美术在PS/设计工具中制作图片
↓
保存的PNG/JPG = sRGB编码(伽马空间)
↓
Unity中勾选sRGB = 告诉GPU"这张图是sRGB编码的"
↓
GPU采样时自动 sRGB → Linear(去伽马)
↓
在线性空间进行光照/颜色计算
↓
计算结果 Linear → sRGB(伽马校正)
↓
输出到显示器正确显示 ✅ (渲染管线输出 → 自动做 Linear→sRGB → 显示器)
- 线性工作流本质上是在 “人眼友好的存储方式” 和 “物理正确的计算方式” 之间反复转换,让两者各司其职
3. sRGB参数: 勾选时,即告诉GPU这张图是伽马空间的, 计算时需要进行去伽马
但并非所有纹理都需要勾选 sRGB:
勾选 sRGB ✅ 不勾选 sRGB ❌
───────────── ──────────────
颜色贴图(Albedo) 法线贴图
自发光贴图 金属度贴图
UI 图片 粗糙度贴图
遮蔽贴图(AO)
原因:
法线/金属度等贴图存储的是"数据"而非"颜色"
本身就是线性数据,不需要转换
强行转换反而会导致计算错误