Light & Color

Light & Color

最近看完了《悠长假期》+ 通关了mother2,电视剧很好看,游戏很折磨😅


Light Quantities

  1. Radiometry。该方法完全基于物理量来度量光照,而没有去考虑人眼的感受。
    在实际渲染中我们不会使用Radiometry中的这些物理量来计算光照,而是使用RGB三个坐标来计算,RGB和物理量的关系在下面会说到。【PS:Radiometry有一个重要的物理量,叫Radiance,它是位置,方向,波长的函数,一般自然界的光是混合光,即由具有不同波长的单色光混合得到(该混合光的波长可由SPD来描述,光在不同波长上的分布,叫做光谱功率分布SPD)。】

  2. Photometry。该方法则基于人眼的敏感程度来度量光照。
    两种方法的计算结果可以通过CIE photometric curve来进行转换;两种方法单位间的对照:

  3. Colorimetry。我们对颜色的感知是一种心理物理学现象(研究心理量与物理量之间的数量关系),该方法研究的是SPD (spectral power distribution)和对颜色的感知之间的关系。
    “色域马蹄图”
    色彩匹配实验:实验人员使用三种单波长的光(645 nm for r, 526 nm for g, and 444 nm for b),通过改变它们的功率进行混合来模拟光谱上的其它单色光。
    通过该实验,三色光匹配连续波长的纯色所记录下的功率比值,用数学方式描述成三个函数,这三个函数即配色函数。这组配色函数在红色区域存在部分负值(出现负值是因为某些颜色无法通过这rgb三个颜色混合得到),通过对这组配色函数进行组合得到了一组不存在负值的配色函数,将任意光照的SPD分别和三个配色函数相乘再积分之后会得到三个系数X,Y,Z,它们是被定义在CIE XYZ色彩空间中的值。有了配色函数,我们可将任何SPD的光照转换成对应的XYZ坐标,这个坐标定义了颜色的chromaticity(色度) 和 luminance(亮度)。将XYZ坐标归一化后,分别得到x,y,z三个值,其中x,y就组成了下面的色度图(由于xyz是归一化的,因此知道xy就知道了z,这里就可以舍弃掉z了):

    归一化后的xy描述了光的色度,而未归一化的Y则描述了光的亮度,它们定义了xyY-coordinate system。 色域马蹄图中外围的弧线表示的是光谱上的纯色,而马蹄图内部则相当于是这些纯色的混合颜色,在色域马蹄图中离中心白点越近饱和度越低,越远饱和度越高。

    一些需要注意的事情:
    首先色度图不代表像素值【但可转换得到像素值,RGB空间到XYZ空间的转换是线性的,可以通过一个矩阵实现转换】——色度图上的每一个位置的色度坐标,都是在描述可见光的主观颜色的物理意义上的量化结果,这个量化的结果,也就是色度图中的坐标值,是可以通过不同的显示设备在分别显示红绿蓝纯色的时候测量出来的,当纯色的坐标值越接近色度图中光谱轨迹上的红绿蓝纯色位置时,就表示显示设备的色域越大,它对纯色像素值的显示效果也就更饱和。
    色度图中马蹄形之外的区域没有物理意义,光谱轨迹以外的区域只是数学计算中的假想色,只有数学上的抽象意义,没有物理上的实际意义。
    色度图不是简单的色彩模型的横切面。如上所述,它是通过一系列复杂的数学映射得到的一个抽象的数学模型,而不是简单的几何投射得来的。
    色度图中不包括黑色。当光照功率为0时就是黑色。


HDR

Dynamic Range(动态范围):Dynamic Range是一种用数学方式来描述某个给定场景的亮度层次范围的技术术语。指图像中所包含的从“最亮”至“最暗”的比值,也就是图像从“最亮”到“最暗”之间灰度划分的等级数;动态范围越大,所能表示的层次越丰富,所包含的色彩空间也越广。表示方式:

  1. 一种是摄影界通常所说的D值(以对数值表示的场景最高亮度和最低亮度比的相对数值),通常由0-4之间的很精确的数字来表示。D值的计算公式为:Dynamic Range=log10(Max Intensity / Min Intensity)。公式中intensity是指光照强度,我们对最大亮度除以最低亮度的结果取对数,得到的结果就是动态范围的相对数值——摄影界所说的D值。各种景物、底片和照片都有其各自特定的D值范围。

  2. 另一种是计算机图形学中通常使用的直接以场景最高亮度和最低亮度的亮度比表述的方法,如255:1。 在数字图像领域一般都采用这第二种比值的表述方式来评述场景的动态范围。亮度的单位以每平方米的烛光来表示(cd/m2)。太阳自身的亮度大约为1,000,000,000 cd/m2。阳光照射下的景物的亮度可达100,000 cd/m2,而星光的亮度大约在0.001 cd/m2以下,二者亮度比达亿倍以上。现实中人类的眼睛所能看到亮度比的范围是\(10^5\)左右,相对于255:1来说,我们称之为高动态范围,即HDR。

LDR:它所采用的色彩模型是目前通用的图像描述模型——RGB模型。每种色彩都可以用三原色(红、绿、蓝)加上适当的亮度来表示,三原色的亮度梯度各为256级。选定每色256级是在电脑硬件性能、照片级真彩图片需要和电脑2进制方案综合考虑后的结果。这就是目前我们非常熟习的观看、编辑、交换和处理数字图像的软硬件环境。这种8比特位元RGB低动态范围图像描述模型是将场景最高亮度和最低亮度的亮度比限定为255比1,计算得出的动态范围D值即为2.4。
其特点:8位精度;单通道0-1;常用LDR图片存储的格式有jpg/png等;常用DCC工具中的拾色器、一般的图片、电脑屏幕都是LDR。
HDR:远高于8位精度;单通道可以超过1;常用HDR图片存储的格式有hdr/tif/exr/raw等。


Tone Mapping & Gamma Correction

Tone Mapping

采用HDR渲染出来的颜色会超过显示器能够显示的范围,此时我们需要将光照结果从HDR转换为显示器能够正常显示的LDR,这一过程我们通常称之为Tone Mapping。用Tone mapping压缩以后,我们所得到的HDR影像就能很好地在显示器上显示了。
Tone Mapping由两部分组成,exposure 和 tone reproduction transform。
exposure:exposure是一个作用于scene-referred image的线性缩放操作,它在tone reproduction transform之前执行(scene-referred image在传给tone reproduction transform应当得到了正确的曝光)。如何确定曝光值是一个较难的问题,现在多数的方法都是基于分析scene-referred image(一般分析的是当前帧之前的帧)的像素亮度得到的,但更正确的方法应该是只使用光照来确定曝光。
高曝光值会使黑暗部分显示更多的细节,然而低曝光值会显著减少黑暗区域的细节,但允许我们看到更多明亮区域的细节。
tone reproduction transform:它通常表示为一条曲线,将Scene-Referred的值映射到Display-Referred的输出值,它会被分别应用到R,G,B 或 明度这些值上。

Scene-Referred image的值是基于真实物理场景的radiance定义的,Display-Referred image是基于显示器的radiance定义的。

Gamma Correction

早期的 CRT 显示器存在非线性输出的问题,为了能够得到正确的输出,我们必须对输入进行补偿,方法就是对输入进行一次指数为 1 / 2.2 的幂次运算,这个补偿的过程便是伽马编码。当今的显示器已经可以做到线性输出了,但我们仍然需要伽马矫正,这是因为人眼对暗部的变化感应更敏感,如果暗部的灰阶太少,则会出现巨大的色阶断层,因此由于精度有限,我们需要通过伽马编码来存储更多的暗部信息。

上图描述了Tone Mapping和Gamma Correction的过程,注意基于物理的操作只有作用于Scene-Referred的值的时候才是正确的。

总的来说,Tone Mapping和Gamma Correction二者都是为了更好的在LDR设备上显示图片,将图片的颜色值从一个范围分布变换到另一个范围分布。而不同的是,Tone Mapping是根据相应的算法将颜色值从一个大的范围映射到了较小的范围,而Gamma Correction则是从[0,1]映射到[0,1],映射范围并没有改变,只是改变了不同亮度值颜色的分布情况。这两种变换需求的本质是由于我们的LDR设置只支持8位的颜色值造成的,如果有一天我们的显示设备支持16位或者更高位的颜色值,也许它们就可以退出了。

Tonemapping + Gamma Correction代码示例(来自LearnOpenGL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uniform float exposure;

void main()
{
const float gamma = 2.2;
   vec3 hdrColor = texture(hdrBuffer, TexCoords).rgb; // 采样

// 曝光色调映射
vec3 mapped = vec3(1.0) - exp(-hdrColor * exposure);
// Gamma校正
mapped = pow(mapped, vec3(1.0 / gamma));

color = vec4(mapped, 1.0);
}

Color grading

颜色分级效果可以改变或校正最终图像的颜色和亮度。此效果类似于在 Instagram 等软件中应用滤镜。
Color grading通常是通过交互式地操纵示例场景图像中的颜色来进行的,直到达到操作者想要的效果为止。
用户查找纹理 (LUT)
用户 LUT 是一种简单的颜色分级方法:将屏幕上的像素替换为您提供的 LUT 中的新值。此方法不如颜色分级 (Color Grading) 效果高级,因此对于不支持更高级的颜色分级纹理格式的平台,可将此方法用作后备方案。

评论