赞
踩
撰写原因:
其一:以前确实不太注意这个gamma和sRGB的问题,虽然大概知道是怎么回事;但推敲后,感觉真的晕。本人认为结合具体例子来证明Gamma空间和线性空间的区别感觉更有说服力些。这些例子是通过SD两种贴图类型来加以说明的。
其二:写文档就等于在写日记,开心就完事了。
其三:最近想搞搞1bit渲染的相关的内容
本章内容容易混淆,如有纰漏望指正
参考指引:https://blog.csdn.net/u011618339/article/details/80842486
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的设置是无效的,贴图总是会被线性采样
如果我们想要比较真实的效果,则需要手动校正,但这样的情况,我们可能无法得到非常正确的结果。
我们在sd中输出两种形式的贴图分别为linear
和srgb
我们在sd中创建一个填充节点
sd中的颜色情况,我们在srgb空间下工作的,sRGB预览下颜色和显示是一致的。
linear预览模式,实际就是gamma校正后的颜色,当这个颜色真正输出到屏幕上时会进一步做gamma变换,这样与fig1显示一致
同一节点的颜色数据我们用两种形式srgb和linear两种格式导出
unity空间我们设置为gamma空间,贴图颜色是被线性采样的。
如果我们使用srgb贴图,文件读取的数据是gamma校正的数据。经过shader后(我们并没有做任何的光照处理),输出屏幕前,会再次进行gamma变换。(左图)
如果我们使用linear贴图,文件读取的数据是未经过gamma校正的数据。经过shader后(我们并没有做任何的光照处理),输出屏幕前,会再次进行gamma变换。(中间图)
如果我们使用linear贴图,文件读取的数据是未经过gamma校正的数据。经过shader后(我们并没有做任何的光照处理,但是人为加入了校正),输出屏幕前,会再次进行gamma变换。(右图)
Linear贴图如果你在gamma空间什么都不做,得出的是下图中的第一行结果。
下一行是使用sRGB Frame Buffer,它能够在结果输出到显示器这个阶段前做sRGB伽玛校正,当CPU读取FrameBuffer时不进行转换:
当使用线性空间时,srgb贴图应该转换为linear贴图.
我们注意到unity的贴图资产的设置中,有sRGB的选项,如果勾选它,则表明这是一个存在非线性颜色映射关系的贴图,需要解码才能使用。如果不勾选,则表明这是一张线性贴图。
unity为线性空间
。我们使用的贴图还是上一节的那两张,这个是目标显示颜色:
Linear贴图取消sRGB选项
srgb贴图,取消srgb选项,作为线性贴图使用,此时数据保留gamma校正数据,因此渲染结果变亮了
还发现,如果shader中是使用纯数值来作为颜色的输出,就会发生这样的现象
数值=0.5,左侧gamma空间显示颜色值=0.5,右侧线性空间则显示0.73。理由大概如下(我承认我有赌的成分):
一般情况下,albedo贴图会存储为srgb格式,视觉上会更加舒服。数值类贴图例如金属,粗糙度则为linear,否则转换会产生精度的损失,数值类贴图要求精确。
如果我们追求真实感渲染,选择linear空间
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。