MAY的百人计划https://space.bilibili.com/7398208?
颜色空间
先回顾下色彩空间的定义
- 色域:三个基色的坐标,由此形成三角形;
- Gamma:如何对三角形内进行切分;
- 白点:色域三角形中心;
传递函数
我们已经知道了颜色空间下三原色的值,但是需要将图像显示在电子设备上,需要将数据转化成视频信号
传递函数就是能将颜色数据转化成视频信号的函数。
- OEFT 把光转换为电子信号(例如:拍摄视频的时候,将场景中的光保存成信号)
- EOFT 把电子信号转换成光信号(例如:播放视频的时候,将视频中的信号转换成光强度)
传递函数就是Gamma校正所使用的函数
Gamma校正
举例
为什么要Gamma校正
- 非线性转换目的主要是为了优化存储空间与带宽,传递函数能更好地帮我们利用编码空间
- 人眼在计算机上对于暗部细节观察多,而亮部细节观察少
- 计算机问题,早期性能不行,gamma≈2.2情况下,可以节约资源存储亮部,更多资源存储暗部;
韦伯定律
上方人眼看上去过渡更均匀,称为美术中灰
下方的亮度才是均匀线性变化的,称为物理中灰
Gamma编码的曲线就是物理线性增长的亮度到人眼视觉感受上的均匀灰阶的映射
8bit图片只能存储256个灰阶,如果采用均匀分布的物理灰阶,采样分布如下
采用均匀分布的美术灰阶时,采样分布如下
可以看出物理分布时,暗部采样信息过少
反映到图片本身,对于8bit图片来说,如果线性记录物理光强,图片的暗部会产生明显的色阶断层
因此,Gamma编码的作用就是通过函数将美术中灰映射到中间,使得物体的亮部和暗部能获得相同的色阶数目,更符合人眼的直观感受
小结
- 人眼对暗部变化比亮部更加敏感
- 我们目前所使用的真彩格式RGBA32,每个颜色通道只有8位用于记录信息,为了合理使用带宽和存储空间,需要进行非线性转换。
- 目前我们所普遍使用的sRGB颜色空间标准,他的传递函数gamma值为2.2(2.4)
中灰值
由上图可知中灰值并非一个固定的具体数值,而是取决于视觉感受
线性工作流
线性工作流就是在各个环节正确地使用gamma编码解码,保证最终得到的颜色和输入的物理数据是一致的
如果是使用gamma空间的贴图,在传给着色器之前需要从gamma空间转到线性空间,让我们在着色器中进行渲染计算时使用的是线性空间的颜色,避免出现显示上的错误
不使用线性工作流可能出现的问题
在亮度叠加时产生过曝效果,伽马空间下的值在经过伽马编码后,其值比实际的要大,如0.098进行叠加时其值在编码后变成0.0980.45进行叠加,最后超过1产生过曝效果;
在颜色混合时,若是未对非线性颜色进行转换,会在纯色边界出现黑边;
进行光照渲染计算时,若我们把视觉上,非线性空间下的中灰色0.5当做是实际光强为0.5进行计算产生如图效果,实际在显示时,中灰色为0.5,但在渲染空间下光强为0.18;
Unity中的颜色空间
支持线性空间的平台
Substance Painter到unity过程
PS到Unity
作业(更详细等看入门精要再来补充)
什么是Gamma校正
美术灰阶和物理灰阶的转换
为什么要Gamma校正
人眼对灰色变化更加敏感,更好利用数字存储空间,节约带宽
- 渲染器为物理模拟器,需要原始的图片数据是线性浮点数据(物理数据),
- 当保存为图片时,就用gamma小于1的函数处理,这样一来,物理上0.218的色值,就可以映射到美术上的中灰。
- 如果这张图片要被打开查看时,如果直接用物理数据,是偏亮的,这个时候又要进行一次校正,也就是显示器要用到一条gamma大于1的下压曲线来校正,把亮度压低,达到符合人眼的美术灰阶。
左侧为线性,右边是伽马