物理世界中的颜色和光照规律都是在线性空间描述的(即光强度增加了一倍,亮度也增加一倍)。 而计算机图形学是物理世界视觉的数学模型,Shader中颜色插值、光照的计算自然也是在线性空间描述的
其中sRGB对应Gamma0.45空间
伽马校正会将颜色转换到Gamma0.45空间(也就是上图的最左侧)
在真实世界中,如果光的强度从0.0逐步增加到1.0,那么亮度应该是线性增加的。但是对于人眼来说,感知到的亮度变化是非线性的,在暗的地方会更多的细节(如上图最右侧)
同时显示器中输出的颜色值在Gamma2.2空间,所以在此基础上人眼看到的颜色值会比显示器中输出的颜色值更暗。这样导致了画面的不真实
所以此时就要将显示器输出的颜色值置于线性空间中,这样被人眼看到才是正确的颜色
那么在进行渲染时,使用Gamma空间还是选择Linner空间呢?
在Gamma 或 Linear空间的渲染结果是不同的,在Linear Space中渲染会更接近物理世界,所以一般选择Linner空间
美术输出的贴图等资源都是在sRGB空间的(即本身颜色就被Gamma校正过),但Normal Map等其他电脑计算出来的纹理则一般在线性空间
因为物理世界中的颜色和光照规律都是在线性空间描述的(即光强度增加了一倍,亮度也增加一倍)。 而计算机图形学是物理世界视觉的数学模型,Shader中颜色插值、光照的计算自然也是在线性空间描述的
所以在进行Shader计算前需移除颜色Gamma校正,将颜色值转换到线性空间中,再进行Shader中的颜色插值以及光照等的计算
在Shader着色器中计算完毕后再将颜色值进行Gamma校正,这样经过显示器的输出和人眼的识别后的颜色才更加接近现实效果
如果美术资源的贴图不处于sRGB空间时,那么该贴图在进入Shader计算前就不会移除Gamma校正,所以会导致结果不正确
所以在线性空间中需要勾选sRGB选项,也就是告诉unity该贴图本身是存在于Gamma0.45空间下的,所以在进行Shader计算前需移除Gamma校正,在Shader计算后须重新添加Gamma校正
详细知识可参考:Unity Color Space详解--深入理解Gamma、Linear、sRGB_unity srgb-CSDN博客