Unity线性空间

使用线性空间的一个显着优点是,随着光强度的增加,提供给场景中的着色器的颜色会线性地变亮。使用伽玛空间,随着光强度的增加,颜色会快速变为白色。

一些移动设备不支持线性空间(仅对OpenGLES 3.0及以上的设备进行支持)。

Unity贴图上有个选项:sRGB(Color Texture),当贴图作为颜色来显示,则勾上sRGB,当贴图作为值来使用,则不勾上。

伽玛空间:Unity设置了伽玛空间后,图片导入时无论是否选择勾选sRGB的结果都是一样的,不会有伽玛校正,默认你导入到工程的纹理就进行了伽玛压缩。在伽玛空间中,在Shader进行光学计算的过程中,直接将图像采样得到结果带入公式中进行计算,得到的color存入colorbuff中,然后提交到显示器,进过一次伽玛补偿,就得到最终的颜色。所以在Shader计算中就会有偏差,这时候就需要线性空间了。

线性空间:勾选了sRGB的纹理,输入会经过pow(2.2)的伽玛校正处理,输出会经过pow(1/2.2)的伽玛校正,真正的线性空间图片不要勾选sRGB选项。线性空间中对所有的图片默认图片都是线性存储的方式,所以如果原图是伽玛空间的sRGB的存储方式,需要勾选sRGB的标志,这样在进行Shader计算的时候,会首先进行一次伽玛补偿,将颜色从伽玛空间转换到线性空间,然后进行正确的光照计算,得到结果最后再转换回到伽玛空间(伽玛压缩), 最后提交到显示器,进行一次伽玛补偿,得到最终的颜色。

在伽马空间下,Unity采用放任的方式,就是你给我什么输入我就拿什么计算,到最后设备显示的时候做一次伽马校正。线性空间的差别是会根据贴图是否勾选sRGB做一次线性转换,在最后的输出阶段还是做一次反伽马校正,大约就是pow4.5的计算,就是说不管你有没有贴图采样参与计算,在线性空间下最后一步的反伽马校正都是要做的,这就是差别的原因。

线性空间的使用:

伽玛空间下实现线性渲染:主要用到的是GammaToLinearSpace() 和LinearToGammaSpace() ,光照部分自己转换到线性空间处理。

线性空间下实现线性渲染:伽玛空间图片要勾选sRGB,只有内容为颜色的贴图需要进行转换,法线贴图和通道控制图则不需要。对于内容为数值的贴图来说,这部分贴图在美术工具中导出的结果就是线性的,即不需要进行Gamma转化就可以直接使用。一般用个后处理最后做一次伽玛压缩(depth较大的相机最后处理)。

你可能感兴趣的:(Unity,Shader)