在了解Gamma校正之前,对颜色、空间以及色度图还有各个颜色空间的标准有一个基本的概念。
色度图
通用:sRGB
- sRGB:微软和惠普在1996年发布的一个通用的颜色空间标准
电影:DCI-P3
- DCI-P3:电影行业数字电影播放的颜色空间标准
电视:Rec-709、PAL等
- Rec-709:电视行业的颜色空间标准。和sRGB表达的颜色范围其实是差不多的,他们的三原色位置是相同的,他们的传递函数1不同。
印刷:CMYK、Adobe RGB
其他
Gamma矫正
简单来说,是对线性三色值和一个非线性的视频信号之间进行了一个编码和解码的操作。
在 sRGB 格式下,Gamma 值为 2.2
https://zhuanlan.zhihu.com/p/36581276
https://blog.csdn.net/kuweicai/article/details/78953017
在常用的 RGBA32 格式,每个颜色通道都只有 8 位,只能存储 256 种亮度,所以基于人眼感知2的原因,用更多的空间存储更多暗部的颜色是更合理的。
所以可以理解为,如果记录的图像在RGBA的256种强度中用Gamma空间(sRGB空间)存储并非均匀分布,我们在线性运算光线RGBA强度之前,要先把贴图先转化回线性空间,一定要先把他转化为显示器色彩空间的不均匀色彩模型的物理量。
韦伯定律
简单来说就是,当所受刺激越大时,需要增加的刺激也要足够大才会让人感觉到明显变化,但是只适用于中等强度的刺激。
- 上面的渐变条是人眼感知均匀
下面的渐变条是物理上均匀 - 如果中间叫中灰色,
上面的叫美术中灰
下面的叫物理中灰
把这两条曲线放到同一张图里,就得到了映射关系。这就是Gamma编码的曲线。
图形工业须知 - 线性工作流
在生产的各个环节,正确使用gamma编码及gamma解码,使得最终得到的颜色数据与最初输入的物理数据一致。
-
如果是使用Gamma空间的贴图,在传给着色器前就需要从Gamma空间转到线性空间。
-
不对Gamma空间的贴图进行gamma解码的话,会产生过曝的结果。因为经过Gamma编码之后,它的值比实际的要大。
比如在叠加的情况下,线性空间的0.098 + 0.098 = 0.196
在Gamma空间下0.0980.45+0.0980.45= 0.35 + 0.35 = 0.7
叠加完即使再用Gamma解码回 0.72.2=0.45 也远远超出了0.196
Unity中颜色空间
Substance Painter
Substance Painter的贴图在导出时,颜色值经过了Gamma编码,颜色被提亮了。需要在Unity中勾选sRGB选项,让它在采样时能还原回线性值。
PhotoShop
- PhotoShop把灰度系数设为1导出图片,也不需要勾选sRGB选项了。不做设置的话,需要勾选sRGB。
- 因为PhotoShop对颜色的管理很精准,我们在unity里看到的颜色要经过显示器的Gamma变换,而PhotoShop会主动读取我们显示器的Gamma值反向补偿回去,也就是真实的颜色值
- PhotoShop自身有一个系统通过灰度值去控制我们颜色的显示,通常情况下,这个值会和显示器的Gamma值一致,所以我们最终看到的颜色好像和在unity中看到的一样,但其实它是可以通过主动设置灰度值改变看到的这个颜色的结果。
颜色混合
- Unity在进行半透明的混合时会先将它们转换到线性空间下,然后再进行混合。
- PhotoShop的图层和图层之间做混合,每个上层图层都会读取它们的Color Profile里的Gamma值经过Gamma变换再做混合,得到的结果偏暗一些。可以在工作空间设置中更改,选择用灰度系数混合RGB颜色,参数设置为1,这样就能得到一个线性空间混合的结果。