您需要 登录 才可以下载或查看,没有账号?注册
x
网上介绍颜色空间的内容有很多,这里就不做过多介绍了,只针对Unity做个简单的概述吧。
Gamma校正
首先提一下,为什么需要Gamma校正, 有两种说法,一种从显示器的工作原理上:显示器呈现的亮度并不是和电压成线性关系增长的; 一种是从人类的视觉感受上:人眼对亮部的变化比暗部更敏感。 详细介绍:Link: https://www.cambridgeincolour.com/tutorials/gamma-correction.htm
sRGB纹理
可以理解为在Gamma空间制作的纹理,经过Gamma校正后存储的纹理。
Unity Gamma & Linear 工作流
Unity设置为Gamma空间 需要确保输入的贴图是Gamma 校正的,即sRGB贴图。纹理颜色直接传给shader,不会移除Gamma校正,但是shader中的计算仍然是线性的(0.25 + 0.25 = 0.5),所以着色的结果并不是真实准确的。但是着色结果在写入Frame Buffer之前会做一些修正,所以最后看起来还可以。 目前大部分的美术工具如果输出时不经过特别的设置,默认都是经过了Gamma校正的(这样就可以直接在显示器上显示),但也有某些特殊情况下贴图直接是在线性空间下的制作的,通常不直接作为显示,也没必要做转换了。
Unity设置为Linear空间
对于没有勾选sRGB选项的纹理,引擎直接将纹理颜色提交给shader, 计算过程是线性的,对于勾选了sRGB的纹理会采用sRGB Sampling 移除Gamma校正后提交给shader,一般内容为颜色的贴图是在Gamma空间制作的需要进行转换,比如diffuse & albedo,即要勾选sRGB选项。 对于内容为数值的贴图来说,这部分贴图在美术工具中导出的结果就是线性的,比如Substance导出的Metallic贴图,Roughness贴图,即不需要进行Gamma转化就可以直接使用。 另外线性空间在渲染的最后一步会多一个Frame Buffer的Gamma校正操作,校正后提交给显示器显示。
Gamma & Linear 颜色空间 的问题
- Gamma空间中颜色的计算是非线性的, 对亮度的Intensity更敏感,可以说相对Linear空间更白。 - 颜色的混合问题: Gamma空间中错误的颜色混合结果:
Linear空间中正确的颜色混合结果:
- 由于Gamma颜色空间中非线性的原因所以导致了PBR的计算结果并不准确,PBR需要在线性的颜色空间中计算。 - Gamma空间的计算没有过多的转化计算,效率要高于Linear。 - 并不是所有设备都支持linear空间, Android设备需要支持OpenGL ES 3.0和至少Android 4.3的系统,IOS需要Metal graphics API(系统至少为IOS 8)。在2016年底统计有38.9%的Android设备和28.9%的IOS设备无法使用Linear颜色空间。
官方文档:
|