《Fundamentals of Computer Graphics》第五版 第五章 表面着色

248 阅读4分钟

基于物体形状和物体间方位关系对表面着色,是呈现 3D 视觉效果的关键。在真实物理世界中,光的反射强依赖于物体几何,光反射所产生的信息会帮助人眼视觉系统充分理解物体形状。计算机图形学中的着色就是为视觉系统提供这些信息,尽管具体目标因应用而异。计算机辅助设计(computer-aided design)和科学可视化(scientific visualization)更加关注成像的清晰度(clarity)。视觉效果(visual effects)和广告(advertising)更关注与真实物体的相似度(resemblance)。在动画、虚拟环境(virtual environments)和游戏中,成像目标介于两者之间,着色是为了实现艺术设计,而不必与真实世界完全一样。

用于计算着色的方程称为着色模型(shading model)。不同的应用需要不同的着色模型。通常从简单模型开始,为光反射提供一个有用的近似,然后增加、修改或移除部分功能以满足设计。

着色模型一般独立于整个渲染系统的其它部分。本章所要介绍的是表面不透明的物体在点状光源照射下的基础着色模型。

点状光源(point-like light sources)

真实世界中照在物体表面上的光来自各个方向。但是,作为一种理想模型,当光源尺寸相对于到物体的距离足够小时,可以将光源近似为一个点,称为点状光源。这可能是因为光源本身比较小,如 LED 灯;也可能是因为离物体比较远,如太阳。按照光源到场景的距离与场景自身的相对大小,点状光源又可以分两种:

  1. 点光源(point source),它本身足够小,但又离场景较近,可以沿不同方向发出光线。比如 LED 灯。
  2. 平行光源(directional source),它离场景足够远,可以看作是点状的,但由于场景相对于到光源的距离也足够小,因此只能接收到来自一个方向的光线。比如太阳。

点源光照

点光源由光源位置和光强(intensity)决定。可以是各向同性的(isotropic),也可以是像聚光灯(spot light)这样各向异性的。

辐射源/光源在单位时间内发射出的总能量称为辐射功率(radiant power)。点辐射源/点光源在单位立体角内的辐射功率称为辐射强度/光强(intensity)。被照射物体表面上单位面积、单位时间所接收到的能量称为辐(射)照度(irradiance)。面辐射源在垂直出射方向的单位面积上、沿出射方向单位立体角内的辐射功率称为辐(射)亮度(radiance)。辐照度用于描述物体表面接收的光亮度;辐亮度用于描述物体表面出射的光亮度。

由能量守恒和球对称性可知,各向同性的点光源所发出的到达半径为 rr 的球面上的辐照度为:

E=P4πr2=Ir2E = \frac{P}{4\pi r^{2}} = \frac{I}{r^{2}}

其中,PP 是光源辐射功率,I=P/4πI=P/4\pi 是光强,平方反比项(inverse square term)r2r^{-2} 刻画了辐照度随距离 rr 的衰减规律。

inverse-square.png

除了距离之外,辐照度还依赖于入射角(angle of incidence)θ\theta,即光传播方向与表面法向之间的夹角。根据定义容易知道,辐照度正比于入射角的余弦 cosθ\cos\theta。由于这条规律最早在约翰·海因里希·兰伯特(Johann Heinrich Lambert)1760 年的书籍《Photometria》中出现,因此被称为兰伯特余弦律(Lambert's cosine law)。

incident-angle.png

将距离和角度结合起来可以知道,点光源辐照度的一般公式为:

E=Icosθr2E = I\frac{\cos\theta}{r^{2}}

其中,cosθ/r2\cos\theta/r^{2} 是点光源的几何因子(geometry factor),它只依赖于光源和被照物体表面之间的几何关系,而与两者的特性无关。

使用点乘可以更简单高效地计算入射角余弦:

cosθ=nl\cos\theta = \vec{n}\cdot\vec{l}

其中,n\vec{n} 是表面法向单位向量,l\vec{l} 是从着色点指向光源的光线方向单位向量。

平行光照

平行光源是点光源离场景非常远、又足够亮的极限情形。此时,I/r2I/r^{2} 变化缓慢可看作常数,平行光源辐照度:

E=HcosθE = H\cos\theta

其中 HH法向辐照度(normal irradiance)。

平行光源由光线方向和法向辐照度决定。平行光照是均匀的,不会随距离增加而衰减。

基础反射模型

物体如何反光取决于它自身的材质。本章给出一个基础模型,用于描述可带有光泽表面的彩色材质。材质的基底决定了整个物体的颜色,材质的表面提供了光泽的、类镜面的反射(shiny, mirror-like reflection)。

reflection.png

上图为镜面反射(specular reflection)和漫反射(diffuse reflection)的模型示意图。

兰伯特反射(Lambertian reflection)

最简单的光反射是理想漫反射(ideal diffuse reflection),即各方向的反射光亮度(辐亮度)均相同。此时物体颜色是视角无关的(view independent),完全由反射率(reflectance)RR 决定,它描述了物体总共反射多少比重的光。

根据物理量定义和兰伯特余弦律,易知:

Lr=RπEL_{r} = \frac{R}{\pi}E

其中,LrL_{r} 是反射光辐亮度,EE 是入射光辐照度。考虑到对光的颜色的依赖性,RGB 颜色系统需要红、绿、蓝三种颜色的光反射率。

由于理想漫反射着色中最主要的效应就是兰伯特余弦律,因此也称为兰伯特着色(Lambertian shading)。兰伯特着色可以为物体提供色彩单调的、粉质的外观,它可以很好地描述纸张、平光漆(flat paint)、泥土、树皮、石头和其它粗糙材料。

镜面反射(specular reflection)

许多材料自身有一定的光泽度(shininess),如:金属、塑料、有光漆(gloss paint)或半光漆(semi-gloss paint)、还有许多植物的叶子等。这些物体的颜色是依赖视角的(view-dependent)。依赖视角的那部分反射被称为镜面反射

完全光滑表面上的反射称为理想镜面反射(ideal specular reflection),此时只有服从反射定律的那个方向上才有反射光。然而许多物体表面都不是完全光滑的,计算机图形学中将这种更一般的反射称为光泽反射(glossy reflection),而理想镜面反射则需要作为一种特殊情形来处理。修正的 Blinn–Phong(布林-风)模型是一个简单而知名的光泽反射模型,最初由 Phong(裴祥风,越南人,美国犹他大学博士)在 1975 年首次提出,后经 James F. Blinn 等人发展,最终形成了现在最常用的形式。

Blinn-Phong.png

Blinn–Phong 着色模型的基本思想是,使用半向量(half vector)h\vec{h} 和表面法向量 n\vec{n} 的接近程度来决定反射光亮度。半向量 h\vec{h} 是平分了光的方向 l\vec{l}视向量(view vector)v\vec{v} 的单位向量,l\vec{l} 是着色点指向光源的单位向量,v\vec{v} 是着色点指向观察者的单位向量。

h=l+vl+v\vec{h} = \frac{\vec{l} + \vec{v}}{\|\vec{l} + \vec{v}\|}

h\vec{h}n\vec{n} 的接近程度可以用点乘来衡量,镜面反射部分的光亮度正比于:

(nh)p(\vec{n}\cdot\vec{h})^{p}

其中,Phong 指数 p (>1)p\ (>1) 刻画了物体表面的光泽度。典型的 pp 值有:

  • 10 “蛋壳”
  • 100 稍有光泽
  • 1000 有光泽
  • 10000 近乎镜面

把 Blinn–Phong 镜面反射和兰伯特漫反射同时考虑进来,反射光的辐亮度:

Lr=(Rπ+ksmax(0,nh)p)EL_{r} = \left(\frac{R}{\pi} + k_{s}\max(0, \vec{n}\cdot\vec{h})^{p}\right)E

其中,镜面反射系数(specular coefficient)ksk_{s} 决定了镜面反射部分的光亮度,它也有红、绿、蓝三个分量。对 nh\vec{n}\cdot\vec{h} 的截断是为了避免出现 n\vec{n}h\vec{h} 方向相反的情况。

联接辐亮度 LrL_{r} 和辐照度 EE 的系数称为双向反射分布函数(bidirectional reflectance distribution function, 简称为 BRDF),它依赖于 l\vec{l}v\vec{v} 这两个方向。而着色计算最终归结为:

  1. 计算辐照度(决定了有多少光可以被反射)
  2. 计算 BRDF(决定了物体表面如何反射光)
  3. 将辐照度和 BRDF 相乘

着色计算

着色计算需要光源、物体表面、视方向等相关信息。为了让代码更整洁,并同时支持点光源和平行光,可以将辐照度和反射光分开计算。

不管是哪种渲染系统,都可以完全相同的方式进行基础的着色计算,差别仅在于如何计算出所需信息。

计算辐照度需要如下信息:

  • 着色点 x\vec{x}
  • 表面法向量 n\vec{n}
  • 点光源的位置 p\vec{p} 或平行光的方向 l\vec{l}
  • 点光源的光强 II 或平行光的法向辐照度 HH,它们都是 RGB 颜色

点光源还需要计算出光源到着色点的距离和光的方向:

r=px,l=pxrr = \|\vec{p} - \vec{x}\|, \quad \vec{l} = \frac{\vec{p} - \vec{x}}{r}

不管是哪种光源,余弦因子都可以表示为:

cosθ=nl\cos\theta = \vec{n}\cdot\vec{l}

最终可计算出辐照度:

E={max(0,nl)r2I, 点光源max(0,nl)H, 平行光E = \left\{ \begin{aligned} &\frac{\max(0, \vec{n}\cdot\vec{l})}{r^{2}}I,\ \text{点光源} \\ &\max(0, \vec{n}\cdot\vec{l})H,\ \text{平行光} \end{aligned} \right.

nl\vec{n}\cdot\vec{l} 的截断是为了避免出现 n\vec{n}l\vec{l} 方向相反的情况。

计算 BRDF 所需信息如下:

  • 光的方向 l\vec{l}
  • 视方向 v\vec{v}
  • 物体表面材质中相关的属性参数,如:RRksk_{s}pp

获取这些信息的方式因渲染系统而异,但实际的着色计算仍然相同。

环境光照

像天空和反光墙壁这些扩展型光源都无法用点状光源来描述。下面的环境光(ambient light)假设给出了这类光源的一个简单模型:场景中任一位置所接收到的环境光亮度均相同,环境光是各向同性的且只能被漫反射。也就是说,环境光的反射光亮度是一个常数。

ambient.png

通常,环境光辐亮度可以表示为材质相关的环境光反射系数(ambient reflection coefficient)kak_{a} 与光源相关的环境光强度(ambient intensity)IaI_{a} 的乘积:

Lr=kaIaL_{r} = k_{a}I_{a}

实际上,kak_{a} 是反射率(reflectance),IaI_{a} 是辐亮度(radiance),但这套术语不太常用。

这种划分便于对整个场景的环境光着色和单个物体的环境光着色进行调整。为了描述彩色场景,上式中的 LrL_{r}kak_{a}IaI_{a} 均有多个分量。

这里的环境光模型虽然无法精确地刻画出扩展型光源的所有细节,但它仍然是简单着色模型中的一个重要组成部分。它可以避免完全黑暗的阴影,也提供了一种方式来调整整个场景的对比度。

有的系统把环境光作为一种特殊类型的光源来处理;而有的系统直接把环境光设置为场景的参数,不包含显式的环境光源,这其实相当于默认了场景中有一个环境光源。