颜色空间
Reference
sRGB 和 Gamma 矫正
用 sRGB 类型的纹理存储颜色在 Gamma 0.45 空间,整体提亮图片颜色,存储更多暗部细节
图片加载时数据 pow(2.2) 变暗后存储到线性空间 Gamma 1.0
Shader 使用线性数据计算,输出使用 Gamma 矫正 pow(0.45) 到 Gamma 0.45
显示器输出的时候压暗颜色 pow(2.2) Gamma 1.0
Unity 中的 Gamma 矫正

勾选了 sRGB 的纹理在线性工作流中,加载时会自动 pow(2.2),统一到 Gamma 1.0
Shader lab 的输出会自动 pow(0.45) 给显示器压暗
效果
sRGB 纹理不启用 sRGB 将会整体偏亮
Unity 一般纹理读取保证内存中的是 linear,sRGB 读取内存中是 Gamma 0.45
// Unity 统一后处理伽马矫正 linear -> Gamma 0.45,再屏幕输出到人眼后变暗 (linear)
// return half4(0.5, 0.5, 1, 1); // 直接返回的值 () -> linear,矫正 -> Gamma 0.45
// return half4(normalSample, 1); // 直接返回 sRGB 纹理颜色 : 从 Gamma 0.45 -> linear , 矫正 -> Gamma 0.45 // 制作 sRGB png 的时候使用 Gamma 0.45 存储
// return half4(normalSample, 1); // 直接返回 rgb 纹理颜色 : 预处理 从 linear -> Gamma 0.45, 从 Gamma 0.45 -> linear, 矫正 -> Gamma 0.45
// return half4(normalSample, 1); // 直接返回 normalmap 纹理颜色 : 预处理 从 linear -> Gamma 0.45, 从 Gamma 0.45 -> linear, 矫正 -> Gamma 0.45
总结
Unity Gamma 空间, 使用 sRGB 纹理是在 Gamma 0.45 颜色的, 输入输出 Shader 时不做任何处理, 所以在计算高光时会出现太亮过曝现象
Unity Linear 空间, 使用 sRGB 纹理会在输入 Shader 时变换颜色从 Gamma 0.45 到 Linear, 所以物理颜色运算是准确的, 输出颜色到显示器时会自动变换 Linear 到 Gamma 0.45
输出到显示器的 Gamma 0.45 会由显示器自动变换到 Linear
最后更新于
这有帮助吗?