Unity3d 基础知识-伽马空间和线性空间区别

   更新日期:2024.06.06
官方文档:https://docs.unity3d.com/Manual/LinearRendering-LinearOrGammaWorkflow.html

1、伽马空间(非线性空间)-Gamma

一个是屏幕和强度的对应关系是非线性,一个是相当于浅色变色,人眼更容易区分暗色的渐变色的不同,例如当图像压缩以节省空间的时候,我们牺牲一下浅色强度的精度,以让暗色的强度可以获得更高的精度,这个可以通过伽马校正解决;每一个像素的强度都是通过一个幂函数存储到图像中,伽马就是应用到图像上幂的名字。

大部分图像都是以伽马0.45存储,如左图所显示。图像的暗色区域使用更大范围的数值存储,而浅色的范围是被压缩的,被压缩的空间图像就是“伽马空间”。

伽马空间流程:

在这个颜色空间内渲染,GPU不会再Gamma校正,而是直接使用存储的值参与渲染计算,因为大家使用的都是阉割版的颜色嘛。

但是在这个空间里进行的渲染,因为使用的是阉割过的Gamma颜色空间,因此你会得到不符合真实表现的效果。

在最终输出到显示器的时候,仍然会经过Gamma校正,将渲染后的0.5,表现成0.2给你看。

因为使用了较少的颜色(相对于线性颜色空间),因此会得到比较好的渲染效率以及较低的渲染能力需求。但是图像会存在失真(偏暗,因为亮部细节表现不够)等一系列问题。

2、线性空间-Linear

是数值强度值,与感知强度是成正比例对应的。

线性空间流程:

在Unity中,如果使用Linear颜色空间,除非对指定图片选择了ByPass sRGB(忽略sRGB,你理解为忽略Gamma校正),否则所有的图片都会默认变成sRGB格式。

这样做的目的是把你在Gamma颜色空间里创作的图片里面的颜色给校正到正确的32位颜色,再参与GPU渲染计算。

ByPass sRGB的意思就是直接使用这个0.5,不用再校正了,除非你是在线性颜色空间里创作的图片,否则不建议这么干。

然后,GPU再把结果Gamma校正一次,0.2-0.5,这样做的目的是:显示器不管你到底干了什么,他老人家是一定要在最后Gamma校正一次的(0.5-0.2)。

显示器按照接受到的值进行Gamma校正(0.5校正到0.2)给你看。

在这个空间里进行渲染,因为使用的是线性的颜色空间,因此你会得到非常真实的表现效果。

但是,因为色彩丰富的同时,带来的各项成本,如硬件渲染能力的需求也会增加。

3、颜色空间和渲染管线

Unity 默认使用伽马空间,仅在PC,Xbox,和游戏平台支持线性渲染。最近项目开发中在渲染3D模型时,遇到了Linear和Gamma两种不同的设置出现不同的效果问题,查阅了一下Unity官方blog,看到目前在Unity5.5新增加了linear Rendering 同时支持Android和IOS,但是它使用的OpenGLES3.0,而现在大部分Android手机只支持OpenGLES2.0。所以只能选择Gamma。二者在效果是不同的:

相关链接

欢迎反馈与建议,请联系电邮
2024 © 视觉网