目录
前言
撰写原因:
其一:以前确实不太注意这个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中输出两种形式的贴图分别为linear
和srgb
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校正,存在幂运算
- 对比度越大,曝光就越奇怪