参考视频:图形 2.6 伽马校正
Gamma校正与线性工作流入门讲解
gamma本质上是对输入值用指数函数进行映射。(如gamma2.2就是f(x)=x^2.2的意思)
gamma矫正原因:人眼感受到的光强变化和实际的变化不一致
(上面是人眼感受到的均匀的灰阶,下图是物理上均匀变化的灰阶)
所以需要一条gamma曲线将物理灰阶转换为美术灰阶。如下图所示,
X轴为物理光强线性增加的灰阶,y轴是人眼感受到的均匀的灰阶(实际上是非线性的)
__
我们的显示器基本遵循着SRGB标准,SRGB标准位于gamma2.2空间,相当于数据在经过显示器显示之前会经过一次gamma2.2函数压缩(变暗),因此为了抵消显示器的gamma2.2效果,所以在导出bmp/jpg/png等格式的图片时会经过一次gamma0.45变换(变亮),这样做也能存储更多的暗部信息。图片经过gamma0.45(gamma矫正)变换后存储在磁盘中,读取时经过显示器gamma2.2(degamma)变换,两次gamma正好抵消,就能得到原始的图片颜色数据
——
ps中,8位每通道模式为非线性空间,相当于在gamma2.2(下压曲线)中,横坐标为ps里输入的数据,纵坐标为实际光能量。因此可以看到(0.5,0.5,0.5)实际对应的是光能量为0.2的“美术中灰”。
32位每通道为线性空间,因此线性工作流应该在32位每通道下进行,在此空间进行线性计算(如高斯模糊等),完成后最终转为为8位每通道模式导出
——
unity中如果设置渲染空间为gamma,则unity不会对数据输入输出做任何处理,需要自己手动处理。
如果设置为linear(线性空间),则unity会根据贴图的设置对贴图进行处理:如果勾选srgb,则将其转换为线性数据(gamma2.2),否则不做处理。最后输出进行一次gamma0.45操作(为了跟显示器的gamma2.2抵消)
——
一般来讲,用于存储颜色的贴图为非线性数据,如albedo贴图,相当于原始线性数据经过了一次gamma矫正(gamma0.45,变亮);用于存储值的贴图为线性数据,如法线,粗糙度,金属度贴图等
作业
linear空间下正常渲染(左边lit shader,右边自己手写的)
转换为gamma空间后变暗(原始的albedo是gamma矫正后上拱的曲线,其他贴图是线性数据)
在gamma空间中按线性工作流处理
处理方法(对上一节的代码进行修改):
1.对albedo贴图进行gamma处理(往下凹)转换为线性数据
2.最后的颜色gamma矫正(上拱回去)以和显示器的gamma矫正抵消。
(学习别人的作业后发现可以用LinearToGammaSpace函数和GammaToLinearSpace函数进行转换,这才是正确的做法)