笔记 —— 伽马空间 & 线性空间

0 阅读2分钟

一、基本概念

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)

原因:
  法线/金属度等贴图存储的是"数据"而非"颜色"
  本身就是线性数据,不需要转换
  强行转换反而会导致计算错误