【太长不看】举例说明Gamma Space & Linear Space

前言


撰写原因:

其一:以前确实不太注意这个gamma和sRGB的问题,虽然大概知道是怎么回事;但推敲后,感觉真的晕。本人认为结合具体例子来证明Gamma空间和线性空间的区别感觉更有说服力些。这些例子是通过SD两种贴图类型来加以说明的。

其二:写文档就等于在写日记,开心就完事了。

其三:最近想搞搞1bit渲染的相关的内容

本章内容容易混淆,如有纰漏望指正
参考指引:https://blog.csdn.net/u011618339/article/details/80842486


1.gamma空间


1.1gamma校正和变换

  • gamma变换:显示器在显示颜色时做了gamma变换(=近似2.2),让图像变暗

  • 如果想要看起来和原来的颜色看起来差不多,那就需要事先gamma(=近似1/2.2)校正

    • 下结论:

      • 存储在计算机上的图像让人观看一般都是事先经过gamma(=近似1/2.2)校正的, 现在设置的目的是为了比较符合人眼的感知。
        在这里插入图片描述

      • 如果图片捕获后什么都不做的话,会直接经过显示器的gamma变换,那么整个图像就是偏暗的
        在这里插入图片描述

      • 处理图片的工具一般是读取文件数据,而不是显示器的颜色。

  • gamma值不唯一,于是定义了同一的颜色空间标准sRGB

    • 颜色空间:波长与数值的对应关系。也可以解释为模拟与数字信号的对应关系

      sRGB标准,是一种非线性的颜色映射关系早期用于应对显示器的显像问题。

      举个例子在sRGB标准下的(0.5,0.5,0.5)并不是你认为的0与1之间的50%混合

      使用统一sRGB编码的图像,不同显示器接受sRGB编码信息,输入会免去转换

如果unity使用Gamma空间,sRGB的设置是无效的,贴图总是会被线性采样
在这里插入图片描述
如果我们想要比较真实的效果,则需要手动校正,但这样的情况,我们可能无法得到非常正确的结果。
在这里插入图片描述

1.2 举个例子

我们在sd中输出两种形式的贴图分别为linearsrgb

sd的颜色空间

我们在sd中创建一个填充节点
在这里插入图片描述

sd中的颜色情况,我们在srgb空间下工作的,sRGB预览下颜色和显示是一致的。
在这里插入图片描述
linear预览模式,实际就是gamma校正后的颜色,当这个颜色真正输出到屏幕上时会进一步做gamma变换,这样与fig1显示一致
在这里插入图片描述

贴图导出

同一节点的颜色数据我们用两种形式srgb和linear两种格式导出
在这里插入图片描述

  • linear:文件存储时数据不变(就是原来sd中原来的显示效果),显示器显示时gamma变换的效果
  • sRGB:文件存储时数据经过gamma校正(就是原来sd中linear预览效果),显示器显示是gamma变换的效果

Unity

unity空间我们设置为gamma空间,贴图颜色是被线性采样的。
如果我们使用srgb贴图,文件读取的数据是gamma校正的数据。经过shader后(我们并没有做任何的光照处理),输出屏幕前,会再次进行gamma变换。(左图)
在这里插入图片描述
如果我们使用linear贴图,文件读取的数据是未经过gamma校正的数据。经过shader后(我们并没有做任何的光照处理),输出屏幕前,会再次进行gamma变换。(中间图)
如果我们使用linear贴图,文件读取的数据是未经过gamma校正的数据。经过shader后(我们并没有做任何的光照处理,但是人为加入了校正),输出屏幕前,会再次进行gamma变换。(右图)


2.线性空间


2.1 sRGB Frame Buffer

Linear贴图如果你在gamma空间什么都不做,得出的是下图中的第一行结果。

下一行是使用sRGB Frame Buffer,它能够在结果输出到显示器这个阶段前做sRGB伽玛校正,当CPU读取FrameBuffer时不进行转换:
在这里插入图片描述

  • 提问: 选择SRGB Frame Buffer而不是在shader中人为校正的理由
    • sRGB Frame Buffer是由硬件支持的,运算速度更快
    • 但是对硬件有要求

2.2 sRGB Sampler

当使用线性空间时,srgb贴图应该转换为linear贴图.
我们注意到unity的贴图资产的设置中,有sRGB的选项,如果勾选它,则表明这是一个存在非线性颜色映射关系的贴图,需要解码才能使用。如果不勾选,则表明这是一张线性贴图。
在这里插入图片描述

2.3 举个例子

unity为线性空间。我们使用的贴图还是上一节的那两张,这个是目标显示颜色:
在这里插入图片描述
Linear贴图取消sRGB选项
在这里插入图片描述
srgb贴图,取消srgb选项,作为线性贴图使用,此时数据保留gamma校正数据,因此渲染结果变亮了
在这里插入图片描述
在这里插入图片描述

  • 提问:
    • srgb贴图勾选srgb选项最终的输出结果?和目标显示差不多
  • linear贴图勾选srgb选项最终的输出结果?比目标显示暗

3.总结


gamma 空间下的2种情况

在这里插入图片描述

linear空间下的4种情况

在这里插入图片描述

其他发现

还发现,如果shader中是使用纯数值来作为颜色的输出,就会发生这样的现象
在这里插入图片描述
数值=0.5,左侧gamma空间显示颜色值=0.5,右侧线性空间则显示0.73。理由大概如下(我承认我有赌的成分):
在这里插入图片描述

4.两个空间的意义


一般情况下,albedo贴图会存储为srgb格式,视觉上会更加舒服。数值类贴图例如金属,粗糙度则为linear,否则转换会产生精度的损失,数值类贴图要求精确。

如果我们追求真实感渲染,选择linear空间

  • 为什么sRGB空间下的图像看起来更舒服
    因为人眼对暗部更敏感,SRGB颜色编码暗部的量化差距小,量化精度一致时,同样跨度的编码值可以表示更细微的过渡,就存在更多的暗部 palette
    在这里插入图片描述
  • gamma空间计算更容易出错
    • srgb图是带有gamma校正,存在幂运算
    • 对比度越大,曝光就越奇怪

猜你喜欢

转载自blog.csdn.net/qq_43544518/article/details/128780850