早期光照模型:
兰伯特,BlinnPhong光照模型。
缺点:油腻,塑料感很强。
PBR第一步:
基于物理的渲染方法的第一步都是以精确的方式来量化光线。
辐射度学(radiometry)
光度学(photometry)
我们对 颜色的感知是一种心理物理现象(psychophysical phenomenon):对物理刺激的心理感知 。
辐射度学研究的是电磁辐射的测量。 这种辐射以波的形式传播。 不同波长的电磁波——具有相同相位的两个相邻点之间的距离,例如两个相邻的波峰——具有不同的性质。 在自然界中,电磁波的波长范围很广,从长度不到百分之一纳米的伽马波到长达数万公里的极低频(ELF)电波。 人类所能看到的光波只是这一范围的一小部分,从大约400纳米的紫外光 延伸到700多纳米的红光。
在辐射度学中基本单位是 辐射通量(radiant flux),Φ 。 辐射通量是随时间-功率流动的 辐射能量 ,以瓦特(watt,W)为单位量。
辐照度(irradiance) 是 辐射通量相对于面积的密度,即dΦ/ dA 。辐照度是根据面积来定义的,面积可以是空间中想象的面积,但通常是物体的表面。它的单位是瓦特每平方米。
在我们讨论下一个量之前,我们需要先介绍 立体角(solid angle) 的概念,它是角度概念的三维扩展。 一个角度可以被认为是一个平面上连续的方向集合的大小的度量,它的弧度值等于这个方向集合与半径为1的封闭圆相交的弧的长度。 类似地,立体角可以表示三维空间中连续的方向集合的大小,测量单位为球面度(steradians,缩写为sr),其定义为和半径为1的封闭球体相交斑块的面积。 立体 角是由符号ω表示。
现在我们可以介绍 辐射强度(radiant intensity,I) ,是 辐射 通量 对方向 , 更准确地说 是 立体角(dΦ/ dω) 的 密度 。它的单位是瓦特每球面度。
最后, 辐射率(radiance,L)是单一射线中电磁辐射的量度 。 更准确地说,它被定义为 辐射通量 对单位面积和单位立体角的密度:
这个面积是在垂直于射线的平面上测量的, 如果测量的其他方向的表面上的辐射率,那么必须要使用余弦校正因子。 可能会遇到术语“投影面积”来定义辐射率的情况。
辐射率(radiance)是传感器(如眼睛或照相机)测量的值(详细信息请参阅9.2节),所以它对于渲染来说极为重要。 计算着色方程的目的是为了计算沿着给定射线(从着色表面点到摄像机)的辐射率。辐射率的公制单位是瓦特每平方米每球面度。
环境中的辐射可以看作是5个变量的函数 (或6个,包括波长),称为 辐射分布(radiance distribution) 。 其中三个变量指定位置,另外两个指定方向。这 个函数描述了所有的光在空间中移动。 渲染过程可以理解为,眼睛和屏幕定义一个点和一组方向(例如,通过每个像素的射线),然后在眼睛处对每个方向进行计算。
在着色方程中,辐射率通常用 Lo(x,d) 或 Li(x,d)表示, 这意味着从x点发出的光或者进入x点的光。 方向向量d表示射线的方向,根据惯例,它总是指向远离x的方向。 然而这种惯例在Li的情况下会有些令人困惑, 因为d指向光传播的相反方向,因为 对于点积之类的计算这很方便。
辐射率的一个重要特性是它不受距离的影响, 忽视大气影响,如雾。 换句话说, 不管与观察者的距离有多远,一个表面都会有相同的亮度 。 距离越远,表面覆盖的像素越少,但每个像素处的表面辐射是恒定的。
这里需要画图理解:
首先radiance可以看成单位面积物体表面来自某单位立体角的辐射通量。
从上图我们可以看出,随着距离的增加,物体表面1比物体表面2的辐射照度要少,而且是以r^2衰减,但同时,你可以看到,这个时候的立体角,是从物体表面看到光源(有体积的)对应的立体角大小,距离越远,我们的立体角越小,那么作为分母,反而让整个值越大,
而我们可以发现,对于同样的dA,立体角也是随着r^2衰减。所以刚好抵消。
大多数光波是包含有许多不同波长的混合物。 最直观的是 光谱功率分布(spectral power distribution,SPD), 展 示了光的能量是如何分布在不同波长上的。图8.3展示了三个例子, 值得注意的是,尽管在图8.3中的中间SPDs和底层SPDs之间不同很大, 他们被认为是同样的颜色。 很明显,人类的眼睛对光谱仪不太敏感。我们将在8.1.3节中详细讨论颜色视觉。
图 8.3 三种不同光波的SPDs( spectral power distribution,光谱功率分布)。 最上面的SPD是一种绿色激光,它的光谱分布非常窄。 中间的SP是在相同的绿色激光基础上再加一个红色激光和一个蓝色激光组成的光。 底层的SPD是标准的D65光源,这是一个典型的中性白色参考,用来代表户外照明, 这样的spd是典型的自然光,它的能量连续分布在可见光谱上。
8.1.2 光度学(Photometry)
辐射度 学只研究了物理量,而没有考虑人的感知。 一个相关的领域, 光度学(photometry),类似辐射度学,除了它是通过人眼的敏感度来衡量一切的 。 辐射计算的结果通过乘以 CIE光度曲线(CIE photometric curve) 转换为光度单位,该曲线是一个以555 nm为中心的钟形曲线,表示眼睛对不同波长的光的响应。
8.1.3 色度学(Colorimetry)
在8.1.1节中,我们已经看到,我们对光的颜色的感知与光的SPD(光谱功率分布)密切相关。 我们也看到这不是简单的一对一对应。 图8.3中的底部的SPD和中间SPD完全不同,但被认为是完全相同的颜色。 色度学 研究的是光谱功率分布和人眼对颜色的感知之间的关系。
人类可以分辨大约 1000万种 不同的颜色。 人眼 对于颜色感知,是通过视网膜上三种不同类型的锥受体工作的,每种类型的受体对不同的波长有不同的反应。 其他动物有不同数量的颜色受体,在某些情况下多达15个。 因此,对于一个给定的SPD,我们的大脑只从这些受体接收到三种不同的信号。这也是为什么只用三个数字就可以精确地表示任何颜色刺激。
但是哪三个数字呢? CIE (Commission Internationale d 'Eclairage) 提出了一套测量颜色的标准条件,并使用它们进行了颜色匹配实验。 调色 时,三种不同颜色的光投射在白色屏幕上,使它们的颜色叠加在一起形成一个色块。 图8.5中展示了一组三种光(r、g和b)的测试结果。 这些光几乎是单色的,每一束光的能量分布都集中在一种波长附近:r为645 nm, g为526 nm, b为444 nm。 将每组匹配权值与测试波长相关联的函数称为 颜色匹配函数(color-matching functions) 。
这些颜色匹配函数将光谱功率分布转换为三个值。 对于任意的光谱分布,颜色匹配函数可以乘以每个结果曲线下的分布和面积(即,积分)给出相对的数值,设置光的颜色,以匹配由光谱感知到的颜色。 考虑到 不同的光谱分布可以分解为相同的三个权值, 在观察者看来它们是一样的。 给出匹配权值的光谱分布称为 条件等色(metamers) 。
三种加权的r、g、b光不能直接代表所有可见的颜色,因为它们的颜色匹配函数对不同的波长会有负的权值。 CIE提出了三种不同的假设光源,它们对所有可见波长的颜色匹配函数的权值都是正的。 这些曲线是原始的r、g和b颜色匹配函数的线性组合。 因为 这要求光源的光谱功率分布在某些波长上是负的,所以这些光是不可实现的数学抽象。他们的颜色匹配函数如图8.6所示。其中Y和光度曲线(图8.4)一样,因为 这条曲线将辐射率转换为了亮度。
总之,我们从一个实验开始,这个实验使用了三种单波长的光,并测量了每一种光需要多少来匹配其他波长的光。有时为了匹配,这些纯光必须添加到正在查看的样本中。这就给出了一组颜色匹配函数,将它们组合起来创建一组没有负值的新颜色匹配函数。 有了这组非负的颜色匹配函数,我们可以将任何光谱分布转换为定义颜色的色度和亮度的XYZ坐标,该坐标可以简化为xy来描述色度,而 亮度 保持不变。
给定一个颜色点(x,y),画一条线穿过白点和这个点到边界(光谱或紫色线)。 色点的相对距离与到区域边缘的距离之比即为颜色的 激发 纯度(excitation purity )。 区域边缘上的点定义了 主波长(dominant wavelength) 。 这些色度术语在图形中很少见, 取而代之, 我们使用的是 饱和度(saturation) 和 色调(hue) , 它们分别与激发纯度和主波长有宽松的相关性。
色度图描述了一个平面。 要完全描述一种颜色所需要的第三个维度是 Y值,即亮度 。 这些定义加在一起就是所谓的 xyY(xyY-coordinate system)坐标系 。 色度图对于理解在渲染中 如何 使用颜色以及渲染系统的限制非常重要。 电视或计算机显示器通过使用设置R、G和B颜色值来显示颜色。 每个颜色通道控制一个 显像原色(display primary) , 显像基色会 发出具有特定光谱功率分布的光。 三种原色的每一种都按其各自的颜色值进行缩放,并将它们叠加在一起,创建一个单一光谱功率分布(观察者感知到的只有一个) 。
色度图中的三角形表示标准电视或计算机显示器的 色域(gamut) 。 三角形的三个角是三原色,三原色是屏幕可以显示的最饱和的红色、绿色和蓝色。 色度图的一个重要特性是,这些有限的颜色可以用直线连接起来,以表示整个显示系统的极限。 这些直线代表了通过混合这三种三原色可以显示的颜色的界限。 白点表示当R、G和B的颜色值相等时,显示系统产生的色度。 需要注意的是,显示系统的全部范围是一个三维体。 色度图只显示了这个体积在二维平面上的投影。
在图8.9所示的三个RGB空间中,sRGB是目前为止实时渲染中最常用的。 值得注意的是,在本节中,我们使用“sRGB颜色空间”来表示具有sRGB三原色和白点的线性颜色空间,而不是在5.6节中讨论的非线性sRGB颜色编码。 大多数计算机显示器是为sRGB颜色空间设计的,同样的原色和白点也适用于Rec. 709颜色空间,它被用于 高清电视显示,因此对游戏机很重要。 然而,更多的显示器是用更广泛的色域。
从RGB空间到XYZ空间的转换是线性的,可以用RGB空间的原色和白点导出的矩阵来完成。 通过矩阵转置和结合,可以将矩阵从XYZ转换至任意 RGB空间,或者在两个不同的RGB空间之间。 注意,在这样的转换之后,RGB值可能为负,也可能大于1。 这些 颜色 超出了色域,在目标RGB空间中不可复制。可以使用各种方法将这些颜色映射到目标RGB色域中。
一种常用的转换是将RGB颜色转换为 灰度亮度值(grayscale luminance value) 。 由于亮度与Y系数相同,因此此操作只是RGB-to-XYZ转换的“Y部分”。 换句话说,它是 RGB系数和RGB-to- XYZ矩阵的中间行的点积。对于sRGB和Rec. 709空间,公式为:
这又把我们带到了光度曲线,如图8.4所示。 这条曲线表示了一个标准观察者的眼睛对不同波长的光做出的反应,它乘以了三个原色的光谱功率分布,每条结果曲线都被集成的。 这三个结果的权重构成了上面的亮度方程。 红色、绿色和蓝色的 灰度强度值不相等的原因是因为眼睛对不同波长的光有不同的敏感度。
色度学 能告诉我们两种颜色刺激是否匹配,但不能预测它们的外观。 给定的XYZ颜色刺激的外观在很大程度上取决于照明、周围颜色和先决条件等因素。
颜色外观模型是更广泛的视觉感知领域的一部分,包括 掩蔽(masking) 等效应。
8.1.4 用RGB颜色渲染(Rendering with RGB Colors)
严格地说, RGB值代表的是感知量,而不是物理量 。 使用它们进行基于物理的渲染在技术上是一个类别错误。 正确的方法是对光谱量进行所有的渲染计算,要么通过密集采样,要么在合适的基础上进行投影,最后才转换成RGB颜色。
例如,最常见的渲染操作之一是计算一个物体反射光。 物体的表面通常反射某些波长的光要比其他的多,这是由它的光谱反射率曲线(spectral reflectance curve)所描述的。 严格正确的计算反射光颜色的方法是将入射光的SPD乘以每个波长的光谱反射率,然后把得到的反射光SPD转换成RGB颜色。 在一个 RGB渲染器中将光和表面的RGB颜色相乘,得到反射光的RGB颜色。在一般情况下,这不会给出正确的结果。 为了说明这一点,我们将查看一个比较极端的示例,如 图8.10。
尽管峰值亮度和色域规范对于编码目的很重要,但就实际显示而言,它们多少还只是梦寐以求。 实际上,和 Rec. 2020相比, 显示色域更接近于 DCI-P3(显示在图8.12中)。 由于这个原因,HDR显示器的内部色调映射和色域映射从标准规范到实际显示性能都比较出色。
在应用程序端,有三种方法用于将图像转换到HDR显示,但根据显示和操作系统的不同,这三种方法并不都可用:
1. HDR10——广泛支持HDR显示器以及PC和控制台操作系统。 帧缓冲 格式是每像素32位,每个RGB通道有10个无符号整数位,alpha通道有2个无符号整数位。 它使用PQ非线性编码和Rec.2020颜色空间。 每个HDR10显示模型执行自己的色调映射,这些映射没有标准化或文档化。
2. scRGB(线性变体)—— 仅Windows操作系统支持。 名义上,它使用sRGB三原色和白电平(white level),但是支持RGB值小于0和大于1。帧缓冲格式是每个通道16位,存储线性RGB值。它可以和任何HDR10一起使用,因为会被驱动程序转换成HDR10。它主要是使用方便并且向后兼容sRGB。
3. 杜比视觉(Dolby Vision)——专有格式,还没有广泛被各种显示器支持或任何控制台(在撰写本文时)。它的帧缓冲格式是每个通道 自定义的12位 ,使用是PQ非线性编码和Rec.2020颜色空间。显示内置色调映射是标准叉乘模型(不是点乘)。
视觉系统弥补了绝对亮度的差异 ,这是一种 适应能力(adaptation) 。 由于这种能力,在昏暗的房间里,在屏幕上显示的户外场景的再现图像可以产生与原始场景相似的感觉,尽管再现的亮度小于原始场景的1%。 然而,适应机制提供的补偿机制并不完善。 在较低的亮度水平下,感知到的对比度会降低(史蒂文斯效应),感知到的“色度”也会降低 (亨特效应)。
然而,这种对比的增加加剧了现有的一个问题。 由于场景的动态范围通常比显示器的大得多,我们不得不选择一个狭窄的亮度值窗口来重现,窗口上方和下方的值被裁剪为黑色或白色。 增强对比会进一步缩小这个窗口。为了部分抵消暗部和亮部的剪裁,使用了一个柔软的衰减,将一些阴影和高光的细节带回来。
曝光( exposure )的概念对于色调映射至关重要。 在 摄影学中,曝光指的是控制落在胶片或传感器上的光量 。 然而,在 渲染中,曝光是在色调再现变换应用之前对场景参考图像执行的线性缩放操作 。 曝光的棘手之处在于决定使用什么比例因子。 色调的再现变换和曝光是紧密联系在一起的。
按曝光比例缩放,然后应用色调再现变换的过程是一种 全局色调映射(global tone mapping),相同的映射应用到所有像素上 。 相比之下,基于周围像素和其他因素, 局部色调映射(local tone mapping) 过程使用 不同的像素到像素的映射 。实时渲染应用中大部分使用的是全局色调映射。
需 要记住, 场景参考的图像和显示参考的图像从根本上是不同的 。 物理操作仅在操作场景参考的数据有效, 由于显示的局限性和我们讨论过的各种感知效果 ,这两种图像状态之间总是需要进行非线性变换。
色调再现变换(Tone Reproduction Transform)
色调再现变换通常表示为一维曲线,将场景参考的输入值映射到显示参考的输出值 。 这些曲线既可以单独应用于R、G和B值,也可以应用于亮度。 在前一种情况下,结果将自动出现在显示色域中,因为每个显示引参考RGB通道值都在0到1之间。 然而,在RGB通道上执行非线性操作(尤其是剪裁)可能会导致饱和度和色相的变化,以及 亮度的 期望变化。
通过将色调曲线应用于亮度,可以避免色相和饱和度的变化 (至少会减少),但是,显示参考颜色可能不在显示的RGB色域内,在这种情况下,需要将其映射回来。
色调映射的一个潜在问题是, 将非线性函数应用于场景参考像素颜色可能会导致某些抗锯齿技术问题 。这个问题(以及解决它的方法)在第5.4.2节有讨论。