量子计算9 发表于 2022-3-10 07:33

Unity 中的Gamma 和 Linear

目标

有很多介绍Gamma的文章,看了很多反而云里雾里了。 我总结一下主要原因是有各种效果的配图,因为配图本身就是要通过“Gamma” 存储和显示屏幕来显示的,反而不好理解。
另外会提及到早期的CTR显示器原理的问题, 理解CTR显示原理不仅对理解Gamma没有一点帮助,反而会添加很多困惑。 本文试图通过纯数字的方法来解释一下:

[*]Gamma 和 Linear 的区别
[*]在Unity 里面怎么使用
Gamma

首先参考一下这个问题的回答,请只看疾风齿轮的回答。
我把他提及到的几个重点拎出来。

[*]gamma值就是对动态范围内亮度的非线性存储/还原算法。
[*]gamma值的存在,归根到底,是一个解决方案,用于化解“无限的自然存在,与有限的存储容量/传输带宽”之间的矛盾。
[*]人类对于外界刺激变化程度的感受,是指数形式的。
假设有一张只考虑亮度的照片,不考虑颜色只考虑灰度,每个像素点表示的是真实世界的光照强度。这张图片里面有表示太阳的光照强度 100000 勒克斯。 同时也有表示完全黑暗的角落,这里的光照强度为0 勒克斯。
我们用显示设备来显示这张照片, 把显示亮度归一化到空间, 即0代表显示完全黑 0勒克斯 ,1代表显示完全亮 100000 勒克斯。我们常用的显示器只能接收8bit的二进制数来表示对应的亮度,也就是说对应有 https://www.zhihu.com/equation?tex=2%5E8+%3D+256 个等级,然后再把空间对应到的整数空间。 我们线性的把他对应到这张图片显示亮度的关系是这样的。
等级0123...254255光强03927841176...99608100000正常情况下面我们就应该采用这种线性的对应方式来表示光的强度。

但是我们人眼对亮度的感知不是线性的,假设我们也把人眼对亮度的感觉分为256个等级。即伸手不见五指是0级, 直视骄阳的等级为255。 那么我们每个等级的对光亮度的感觉和物理的光强度是以下的对应关系。
眼感受0123456光强度00.52.335.6910.7217.5126.15眼感受78...252253254255光强度36.7149.25...974309828299139100000可以看到,当物理的光强度很弱的时候,级别增加一点点光强度(比如几个勒克斯),我们人眼就能感觉到亮度提升了一个等级。 而在亮度非常高的时候则需要提高非常大的物理光强度才能感觉到亮度提高了一个等级(比如一千多个勒克斯)。
图片的目的是用有限的空间来还原接近人眼真实感受的亮度。自然在显示器还原图片的时候,每个等级还原的亮度就不是线性对应图片数据等级的了。 而是采用物理亮度更低的范围来对应大部分图片数据等级,物理亮度更高的范围来对应小部分图片数据的等级。
Gamma 空间的定义就是, 采用非线性的方式来还原图片数据的物理亮度。 图片采用更多的数据空间来表示物理光强更暗的区间。
Linear

Linear 就是线性空间的意思了,有了Gamma的概念就知道Linear是什么意思了。 只不过我们如果采用线性的方式来还原物理亮度, 那就会导致我们8bit /256个等级的数据位对应人眼感知的亮度的等级大大减少。 所以必须要采用更多的等级来表示线性空间光强度,比如增加到16bit / 65536 个等级,或者32bit / 4,294,967,296 个等级来描述光强。
那么为什么要用Linear空间呢? 答: 因为我们在计算渲染的时候,有各种物理光照强度的计算,采用线性空间能更真实的还原物理世界的光强度。 也能有更好的预期。
在Unity 里面怎么使用

Unity Gammer 空间效果

http://pic1.zhimg.com/v2-6968cd1242a25e5b44a405cf94aaa0fc_r.jpg
Unity Linear 空间效果

http://pic3.zhimg.com/v2-8cc3572596da63f9c84aba4557eb8032_r.jpg

过年了,我过完年再写。
页: [1]
查看完整版本: Unity 中的Gamma 和 Linear