地址:【技术美术百人计划】图形 2.6 伽马校正

笔记

Gamma校正

颜色空间

TA百人计划 图形 2.1 色彩空间介绍
颜色空间定义了Gamma取值。sRGB使用2.2

传递函数

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

Gamma校正

$V_{out} = V_{in}^{gamma}$
对线性颜色和非线性颜色的编解码转换。
Gamma校正
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里对贴图采样和计算结果的校正要快

资源导出

  1. Substance Painter:当Substance的贴图导出时,线性的颜色值经过伽马变换,颜色被提亮了,所以需要在Unity中勾选sRGB选项,让它在采样时能还原回线性值。
  2. PhotoShop:如果使用线性空间,一般来说Photoshop可以什么都不改,导出的贴图只要勾上sRGB就可以了。如果调整PhotoShop的伽玛值为1,导出的贴图在Unity中也不需要勾选sRGB了。

作业

动手尝试进行Gamma校正的几种方法

l2 g2 第一张图为线性空间下的效果,第二张为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);

不过怎么调整都达不到项目属性修改色彩空间出来的效果