TA百人计划 图形 2.6 伽马校正
笔记
Gamma校正
颜色空间
TA百人计划 图形 2.1 色彩空间介绍
颜色空间定义了Gamma取值。sRGB使用2.2
传递函数
OETF:光转电传递函数,负责把场景线性光转到非线性视频信号值。
EOTF:电转光传递函数,负责把非线性视频信号值转换成显示光亮度。
Gamma校正
$V_{out} = V_{in}^{gamma}$
对线性颜色和非线性颜色的编解码转换。
为什么需要Gamma校正
为了更好利用存储空间。数据以8位存储,人眼对暗部更敏感。提高暗部数据的精度减少亮部数据的精度,获得存储空间和观感上的平衡。
韦伯定律
人眼对明暗感受非线性,对暗部更敏感。符合传递函数Gamma为2.2时的线条变化
线性工作流
所有工作都在线性空间下进行,计算得到正确的结果输出给显示器时再转换为非线性空间。
不在线性空间下处理会导致亮度叠加,颜色混合时结果计算错误。
Unity中颜色空间
通过点击菜单Edit->Project Settings->Player页签->Other Settings下的Rendering部分进行修改,参数Color Space可以选择Gamma或Linear
- Gamma Space:Unity不做任何处理
- Linear Space:引擎的渲染流程在线性空间计算,理想情况下项目使用线性空间的贴图颜色,不需要勾选sRGB,如果勾选了sRGB的贴图,会通过硬件特性采样时进行线性转换。
使用硬件特性完成sRGB贴图的线性采样和shader计算结果的gamma校正,比起在shader里对贴图采样和计算结果的校正要快
资源导出
- Substance Painter:当Substance的贴图导出时,线性的颜色值经过伽马变换,颜色被提亮了,所以需要在Unity中勾选sRGB选项,让它在采样时能还原回线性值。
- PhotoShop:如果使用线性空间,一般来说Photoshop可以什么都不改,导出的贴图只要勾上sRGB就可以了。如果调整PhotoShop的伽玛值为1,导出的贴图在Unity中也不需要勾选sRGB了。
作业
动手尝试进行Gamma校正的几种方法
第一张图为线性空间下的效果,第二张为Gamma空间下的效果。使用unity项目属性修改的渲染色彩空间。
使用shader手动校正到线性空间处理,然后再转为非线性空间结果输出:
// GammaToLinearSpace和LinearToGammaSpace在UnityCG.cginc里面
#include "UnityCG.cginc"
fixed4 texColor = tex2D(_MainTex, i.uv);
fixed3 texColorLinear = GammaToLinearSpace(texColor.rgb);
...
return fixed4(LinearToGammaSpace(color), 1.0);
不过怎么调整都达不到项目属性修改色彩空间出来的效果