笔记11 图形 2.6 伽马校正

铁名_IronName Lv4

参考了 2.6伽马(Gamma)校正

前置知识

颜色空间

笔记06 图形 2.1 色彩空间介绍
  • 通用:sRGB
  • 电影:DCI-P3
  • 电视:Rec-709、PAL等
  • 印刷:CMYK、Adobe RGB
  • 其他

Gamma 矫正

读书笔记17《Unity Shader入门精要》的答疑解惑部分

传递函数(Gamma矫正使用)

OETF:光转电传递函数,负责把场景线性光转到非线性视频信号值。
EOTF:电转光传递函数,负责把非线性视频信号值转换成显示光亮度。

定义

Vout=VingammaV_{out}=V_{in}^{gamma}

Gamma 矫正是指对线性三色值和非线性视频信号之间进行编码和解码的操作。

图像将获取到的物理数据做一次 gamma 值约为0.45的映射,这样的过程叫做 gamma编码,再存入硬盘。此时图像的像素比实际物理像素要更亮。
在显示图像时,需要将每个像素做一次 gamma 值约为 2.2 的矫正,使最终的结果为正确的物理数据。经过显示的 gamma校正 之后,之前偏亮的图像亮度降低。

WHY?

非线性转换的目的主要是为了优化存储空间和带宽,传递函数能够更好地帮我们利用编码空间。
由于我们用于显示图像数据都是8bit,且人眼对暗部变化更敏感,如果要充分利用带宽,那么就需要使用更多位置去存储暗部值。也就是说暗部使用更高精度保存,而亮部使用更低精度保存。

韦伯定律

韦伯定律(Weber’s Law)是心理物理学的基本定律,指出差别阈限(人能察觉到刺激变化的最小差异)与原刺激强度的比例是一个常数。

小结

  1. 人眼对暗部变化比亮部更加敏感
  2. 我们目前所使用的真彩格式RGBA32,每个颜色通道只有8位用于记录信息,为了合理使用带宽和存储空间,需要进行非线性转换。
  3. 目前我们所普遍使用的sRGB颜色空间标准,他的传递函数gamma值为2.2(2.4)
Gamma矫正的另一种由来

早期我们使用的图像显示器都是CRT(学名:阴极射线显像管),人们发现这种设备的亮度与电压并不成线性关系,而是gamma值约为2.2类似幂律的关系。

线性工作流

在生产的各个环节,正确使用gamma编码及gamma解码,使得最终得到的颜色数据与最初输入的物理数据一致。
如果是使用Gamma空间的贴图,在传给着色器前需要从Gamma空间转到线性空间。

如果在 Gamma 空间下进行渲染工作,会产生什么问题?
  • 亮度叠加时,过渡曝光
  • 颜色混合时,纯色的边界出现一些黑边
  • 光照渲染时,灯光容易过曝,室内容易偏黑

Unity 中的颜色空间

通过点击菜单 Edit->Project Settings->Player 页签->Other Settings 下的 Rendering 部分进行修改,参数 Color Space 可以选择 Gamma 或 Linear

  • 当选择Gamma Space时,Unity不会做任何处理
  • 当选择Linear Space时,引擎的渲染流程在线性空间计算,理想情况下项目使用线性空间的贴图颜色,不需要勾选sRGB,如果勾选了sRGB的贴图,会通过硬件特性采样时进行线性转换。
sRGB 和 Gamma 空间的关系
  • sRGB是工业界统一采用的带Gamma2.2曲线的标准色彩空间

硬件支持

线性空间需要图形API的硬件支持,目前支持的平台

  1. Windows,Mac OS×和Linux(Standalone)
  2. Xbox One
  3. PS4
  4. Android (OpenGL ES 3.0)
  5. iOS(Metal)
  6. WebGL

主要由两个硬件特性来支持:

  • sRGB Frame Buffer
    将Shader的计算结果输出到显示器前做Gamma校正
    作为纹理被读取时会自动把存储的颜色从sRGB空间转换到线性空间
    调用ReadPixels()、ReadBacklmage()时,会直接返回sRGB空间下的颜色
    sRGB Frame Buffer 只支持每通道为8bit的格式,不支持浮点格式
    HDR开启后会先把渲染结果绘制到浮点格式的FB中,最后绘制到sRGB FB上输出。
  • sRGB Sampler
    将sRGB的贴图进行线性采样的转换。

使用硬件特性完成sRGB贴图的线性采样和shader计算结果的gamma校正,比起在shader里对贴图采样和计算结果的校正要快

资源导出问题

Substance Painter

当Substance的贴图导出时,线性的颜色值经过伽马变换,颜色被提亮了,所以需要在Unity中勾选sRGB选项,让它在采样时能还原回线性值。

Photo Shop

如果使用线性空间,一般来说Photoshop可以什么都不改,导出的贴图只要勾上sRGB就可以了。
如果调整PhotoShop的 gamma 值为 1,导出的贴图在Unity中也不需要勾选sRGB了。

Document Color Profile

  • PhotoShop对颜色管理特别精确,Unity里看到的颜色要经过显示器的伽玛变换,而PhotoShop不会,PhotoShop会读取显示器的Color Profile,反向补偿回去
  • PhotoShop 有第二个 Color Profile,叫做 Document Color Profile。通常它的默认值就是sRGB Color Profile,和显示器的 Color Profile 一致,颜色是被这个ColorProfile压暗了,所以PhotoShop中看到的结果才和Unity中一样。

Unity中的混合是线性混合,Photoshop的图层和图层之间做混合的时候,每个上层图层都经过了伽马变换,然后才做了混合。在设置中更改,选择“用灰度系数混合RGB颜色”,参数设置为1,这样图层才是直接混合的结果。

-作业-

尝试 Gamma 矫正。

  1. 引擎设置中修改
  2. Unity Shader 中的函数
  • 标题: 笔记11 图形 2.6 伽马校正
  • 作者: 铁名_IronName
  • 创建于 : 2026-02-24 10:14:08
  • 更新于 : 2026-02-24 11:24:33
  • 链接: https://blog.ironname.top/2026/02/24/笔记11-技术美术百人计划/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论