Unity3d 基础知识-伽马空间和线性空间区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3d 基础知识-伽马空间和线性空间区别相关的知识,希望对你有一定的参考价值。
参考技术A 官方文档:https://docs.unity3d.com/Manual/LinearRendering-LinearOrGammaWorkflow.html1、伽马空间(非线性空间)-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。二者在效果是不同的:
以上是关于Unity3d 基础知识-伽马空间和线性空间区别的主要内容,如果未能解决你的问题,请参考以下文章
Unity3d中法线在世界空间或切线空间计算的原理 整理链接
投石问路Unity内置管线升级URP之色彩空间(伽马sRGBGamma Space和Linear Space)