为什么要新写一篇呢?这是因为上一篇主要是理论知识,我们在工作中常常直接拿来用不会有什么问题,而本篇关于色彩空间等,则是我们在工作项目中常常会遇到相关的问题还容易搞混,所以我单独写一篇,顺便来谈谈在Unity引擎中会遇到的问题。
颜色的量化
首先讲讲我们是如何量化颜色的(以下理论内容大部分来自动视的一篇HDR相关的分享,PPT贴在了目录的下方,推荐大家看看):
我们人眼能够感知到的可见光如下:
由于我们眼部的视锥细胞主要对红、绿、蓝三种光最为敏感。人们便选取了三个单播长光,即三元光(primaries)。并根据此建立了一系列的颜色标准,如著名的CIE 1931 xyz color space:
有了理论依据,我们可以在任意的颜色空间之间进行颜色转换。我们最熟悉也最常用的颜色空间当属sRGB(standard Red Green Blue)。
线性空间和gamma矫正
我们常常谈到的线性是指的是一种线性工作流(linear working/rendering space),并不是一个颜色空间的概念,颜色在各种不同的颜色空间下都可以是线性的。
我们所处的真实世界中,光照亮度和光照强度是一种线性关系:
而我们使用的显示器,由于显示器的电流电压特性,我们得到的光照亮度和光照强度是非线性的:
我们要将屏幕中的颜色还原为真实世界,由此产生了gamma校正的概念:
通俗的讲,gamma矫正用数学模型描述就是就是做一次0.45次幂的运算。借用一下@PuzzledBoy文章中的图来描述:
一些值得注意的点:我们通过PS等一系列的DCC设计软件制作图片,通常是在sRGB颜色空间,我们通过拾色器显示的数值都是文件真实存储的数值。
关于Unity URP中线性工作流方案我单独写了一篇博客。
色调映射(Tone Mapping)
也称色调复制(tone reproduction),是将宽范围的照明级别拟合到屏幕有限色域内的过程。因为基于HDR渲染出来的亮度值会超过显示器能够显示最大亮度,所以需要使用色调映射,将光照结果从HDR转换为显示器能够正常显示的LDR。