首页 > 技术文章 > 伽马校正 线性空间 伽马空间-简单说明白

hiker-online 2020-03-15 23:47 原文

伽马校正怎么产生?

  远古时代的CRT显示器,颜色输入输出不一致,比如输入0.5,输出0.218,其关系:输出 = 输入的2.2次幂

  2.2这个幂数就是伽马值。为保证预期结果,输出想要0.5,那输入为0.5的1/2.2次幂,这就是伽马校正,就

  是为了解决设备问题,根据公式,采用逆向思路做的处理,就叫伽马校正

基本都是液晶屏了,为啥伽马校正还活得滋润?

  因为人的眼睛喜欢,人眼对暗色较敏感,亮色不太敏感,举个例子,(一个字节存放亮度值,范围是0-255)

  现在我们要存储0.24与0.243这两个亮度,线性下0.24*255 = 61.2,0.243*255=61.965,在0-255的整数

  范围都代表了61,细节差异就丢失了。

  如果经过了伽马校正,两个结果分别是0.24(1/2.2幂)255133.3,0.243(1/2.2幂)255134.1,这样

  它们的细节差异就保留了

  正是由于伽马校正增大暗部数值的精度,减少了亮部数值的精度,刚好符合了人眼对明暗的敏感特点,所以

  从视觉上,图像质量被伽马校正神奇的改善了!!就因为这样,伽马依然活的很好!

经常使用的贴图,相片为什么是gamma的非线性图

  如上面所说的道理,gamma空间下的非线性图,相对人眼来说有更丰富的细节表现,在相同的编码精度下,会

  有更好的细节表现,所以现在使用的相片,贴图基本还是gamma的非线性图

伽马空间VS线性空间?

  如下图所示,是伽马空间的工作流,正常情况下,伽马空间用于光照计算的贴图不是真实颜色

  的贴图,是1/2.2幂之后保存的贴图,用这样错误的贴图参与光照计算,光照结果也是不正确的,

  所以最后得到的渲染效果也不是一个真实自然的渲染效果。

  如果是线性空间,Texture如果是线性的,那么光照计算时,直接使用;如果是非线性的图,要

  先进行Gamma校正,校正的结果就是真实Color,之后再光照计算。最后进行一次1/2.2幂操作,

  用以抵消屏幕最终的一次2.2的Gamma校正。

  下面是Gamma空间与Linear空间下的渲染流程对比:

 Gamma空间(上)VS Linear空间(下)

 新疑问,Linear空间下的流程,Gamma在shader中手动处理,也可以啊,为什么还要Linear空间????

  其实针对上面Gamma渲染流程,我们在shader中做两次(1/2.2,2.2)的处理,确实能实现Linear空间下一样的效果,

  但是,Linear模式是需要硬件支持的,硬件支持处理的就是硬件化的高效1/2.2与2.2幂的处理,这样使得渲染效率更高,

  线性空间下的两个主要支持:sRGB Frame Buffer和sRGB Sampler,sRGB Frame Buffer就是做硬件级的1/2.2操作,

  sRGB Sampler是硬件级的2.2操作。所以原始贴图就是线性的,在uniyt中就是勾sRGB设置,非线性的要勾sRGB。

线性空间与Gamma空间的选择?

  线性空间适合要求自然光照结果的渲染,尤其是PBR,它有硬件的要求OpenGL 3.0;其他情况下都可以用Gamma空间

理解误区!!

  Gamma空间是一套流程,如图一所示;sRGB贴图是一个精度上的选择,与Gamma空间严格说没啥关系,Linear空间都在用。

参考资料:

https://blog.csdn.net/u011618339/article/details/80842486

https://www.cnblogs.com/guanzz/p/7416821.html

推荐阅读