图形学习笔记之Gamma校正
-
Gamma校正
颜色空间


传递函数



什么是Gamma校正?
Gamma可以简单定义为:

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


- 图像经过gamma编码存储在硬盘中,将获取到的物理数据做一次gamma值约为0.45的映射,这样的过程叫做 gamma编码。
由曲线可知,此时图像的像素比实际物理像素要更亮
- 在显示图像时,需要将每个像素做一次gamma值约为2.2的矫正,使最终的结果为正确的物理数据。
经过显示的gamma校正之后,之前偏亮的图像亮度降低
为什么进行Gamma校正?
非线性转换的目的主要是为了优化存储空间的带宽,传递函数能够更好的帮助我们利用编码空间。
由于我们用于显示图像的数据都是8bit,且人眼对暗部变化更敏感,如果要充分利用带宽,那么就需要使用到更多位置去存储暗部值。也就是说暗部使用更高精度保存,而亮度使用更低精度保存。
-
韦伯定律



人眼在感受亮度变化时,对于暗度变化明显比对于亮度变化更加敏感。
- 韦伯定律:即感觉的差别阈限随原来刺激量的变化而变化,而且表现为一定的规律性,用公式来表示,就是△Φ/Φ=C,其中Φ为原刺激量,△Φ为此时的差别阈限,C为常数,又称为韦柏率。
- 简单来说就是,当所受刺激越大时,需要增加的刺激也要足够大才会让人感觉到明显变化,但是只适用于中等强度的刺激
小结
- 人眼对暗部变化比亮部更加敏感
- 我们目前所使用的真彩格式RGBA32,每个颜色通道只有8位用于记录信息,为了合理使用带宽和存储空间,需要进行非线性转换。
- 目前我们所普遍使用的sRGB颜色空间标准,他的传递函数gamma值为2.2(2.4)
CRT


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

- CRT非线性响应的历史原因
- 人眼对暗部颜色变化更加敏感
中灰值


-
线性工作流程

- 在生产的各个环节,正确使用gamma编码及gamma解码,使得最终得到的颜色数据与最初输入的物理数据一致。
- 如果是使用Gamma空间的贴图,在传给着色器前需要从Gamma空间转到线性空间。
如果不在线性空间下进行渲染工作,会产生什么问题?


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

- 当选择Gamma Space时,Unity不会做任何处理
- 当选择Linear Space时,引擎的渲染流程在线性空间计算,理想情况下项目使用线性空间的贴图颜色,不需要勾选sRGB,如果勾选了sRGB的贴图,会通过硬件特性采样时进行线性转换。
硬件特性支持
线性空间需要图形API的硬件支持,目前支持的平台
- Windows,Mac OS x 和Linux(Standalone)
- Xbox One
- PS 4
- Android (OpenGL ES 3.0)
- iOS(Metal)
- WebGL
主要由两个硬件特性来支持:
- sRGB Frame Buffer
- 将Shader的计算结果输出到显示器前做Gamma校正
- 作为纹理被读取时会自动把存储的颜色从sRGB空间转换到线性空间
- 调用ReadPixels()、ReadBackImage()时,会直接返回sRGB空间下的颜色
- sRGB Frame Buffer只支持每通道为8bit的格式,不支持浮点格式
- HDR开启后会先把渲染结果绘制到浮点格式的FB中,最后绘制到sRGB FB上输出。
- sRGB Sampler
将sRGB的贴图进行线性采样的转换。
使用硬件特性完成sRGB贴图的线性采样和shader计算结果的gamma校正,比起在shader里对贴图采样和计算结果的校正要快
-
资源导出问题
Substance Painter

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

如果使用线性空间,一般来说Photoshop可以什么都不改,导出的贴图只要勾上sRGB就可以了。
如果调整PhotoShop的伽玛值为1,导出的贴图在Unity中也不需要勾选sRGB了。
Document Color Profile
- PhotoShop对颜色管理特别精确,Unity里看到的颜色要经过显示器的伽玛变换,而PhotoShop不会,PhotoShop会读取显示器的Color Profile,反向补偿回去
- PhotoShop有第二个Color Profile,叫做Document Color Profile。通常它的默认值就是sRGB Color Profile,和显示器的Coor Profile一致,颜色是被这个Color Profile压暗了,所以PhotoShop中看到的结果才和Unity中一样。

Unity中的混合是线性混合,Photoshop的图层和图层之间做混合的时候,每个上层图层都经过了伽马变换,然后才做了混合。在设置中更改,选择“用灰度系数混合RGB颜色”,参数设置为1,这样图层才是直接混合的结果。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)