材质问题

同一几何模型可以呈现陶瓷、金属、玻璃或布料的外观。差异不仅来自表面颜色,还来自光进入结构后如何反射、透射、吸收和散射。材质模型要把这些变化转成可以计算的响应。

海水是一个直观例子。同一片海面在深处偏蓝偏暗,浅处却接近透明,颜色和透明程度与光在介质中的传播距离、吸收和散射有关。洞穴中的光柱也说明了这一点:光通常沿直线传播,如果眼睛能在半空看见一束光,说明尘埃或雾把部分光重新导向了眼睛,这个过程称为散射 Scattering。

头发周围常有一圈透光的亮边。光线进入一根头发后,还可能在相邻的数百根、数千根头发之间反复传播,最后才到达眼睛。布料看起来不像金属,是因为纤维的排列、空隙和微表面方向不同;蝴蝶翅膀的鳞片本身可能几乎没有颜色,鳞片叠加后的结构却能选择性地反射不同波长。双彩虹和高阶彩虹则来自光在水滴中的多次折射与反射,出射能量随路径次数增加而减弱。

鱼肉、皮肤、蜡和玉石的光线还会进入材料内部,从一个位置进入后在内部散射,再从另一个位置离开。这是次表面散射 Subsurface Scattering,它超出了只描述同一点方向变化的表面 BRDF 范围,下一篇再展开。

同一个几何模型指定不同材质,就能得到陶瓷、玻璃、金属或木头的外观。自然界中可辨认的材质远多于任何渲染器能够列举的类型;课程所举的成熟电影渲染器约有 40 种材质模型;这个数量反映的是当时具体系统的实现,并非所有渲染器的固定上限。电影画面的细节还要依靠纹理、参数贴图和美术处理补足。解析模型负责提供物理上自洽的骨架,纹理负责描述模型没有显式表示的尺度。

BRDF

在表面光传输中,材质最核心的描述是双向反射分布函数 Bidirectional Reflectance Distribution Function,BRDF:

fr(ωi,ωo)=dLo(ωo)Li(ωi)cos⁡θi dωi.f_r(\boldsymbol\omega_i,\boldsymbol\omega_o) = \frac{\mathrm dL_o(\boldsymbol\omega_o)} {L_i(\boldsymbol\omega_i)\cos\theta_i\,\mathrm d\omega_i}.

其中 ωi\boldsymbol\omega_i 和 ωo\boldsymbol\omega_o 都从表面点指向外部,θi\theta_i 是入射方向与法线的夹角。分母是一个微分入射辐照度,分子是这部分入射光引起的出射辐亮度增量,因此 BRDF 是“辐亮度相对于辐照度的方向分配密度”,不能直接当作无量纲反射率。背面入射时 cos⁡θi≤0\cos\theta_i\le0,单面表面在该方向没有反射贡献。

把 BRDF 放回渲染方程:自发光项 LeL_e 描述表面自己发出的光,入射辐亮度和余弦项描述光如何到达表面,积分描述对所有入射方向累加。到达表面的能量究竟怎样分发到出射方向,唯一由 frf_r 决定。因此,在表面模型中描述材质,等价于给出它的 BRDF。

“微分”不可省略。Licos⁡θi dωiL_i\cos\theta_i\,\mathrm d\omega_i 只表示一个很小方向范围带来的辐照度,不能用总出射光除以总入射光强来替代 BRDF。辐亮度和辐照度的区别可复习辐射度量。BRDF 的单位是 sr−1\mathrm{sr}^{-1};它在很窄的镜面峰上可以大于 1,真正受约束的是乘以余弦后在整个半球上的积分。波长相关的 BRDF 也不能简单等同为材质的 RGB 颜色,因为入射光谱、界面反射和内部吸收都会共同决定最终颜色。

BRDF 可以按波长定义。实际 RGB 渲染通常对三个通道分别存储和计算;更高光谱分辨率则直接把波长作为变量。方向分布决定粗糙、抛光和拉丝等外观:分布越集中,反射越像镜面;分布越宽,高光越散。

Lambertian

理想漫反射的出射辐亮度与观察方向无关,因此 BRDF 是常数。设入射光在半球上均匀,常数 BRDF 为 cc,则

Lo=cLi∫Ω+cos⁡θi dωi.L_o=cL_i\int_{\Omega^+}\cos\theta_i\,\mathrm d\omega_i.

假设表面不发光、不吸收,并且入射与出射的辐照度相等,则 Lo=LiL_o=L_i。因此

c∫Ω+cos⁡θ dω=1.c\int_{\Omega^+}\cos\theta\,\mathrm d\omega=1.

用立体角微元

dω=sin⁡θ dθ dϕ\mathrm d\omega=\sin\theta\,\mathrm d\theta\,\mathrm d\phi

得到

∫Ω+cos⁡θ dω=∫02π∫0π/2cos⁡θsin⁡θ dθ dϕ=2π[12sin⁡2θ]0π/2=π.\begin{aligned} \int_{\Omega^+}\cos\theta\,\mathrm d\omega &=\int_0^{2\pi}\int_0^{\pi/2} \cos\theta\sin\theta\,\mathrm d\theta\,\mathrm d\phi\\ &=2\pi\left[\frac12\sin^2\theta\right]_0^{\pi/2} =\pi. \end{aligned}

若表面反照率为 ρ∈[0,1]\rho\in[0,1],总反射能量只占入射能量的 ρ\rho,所以 Lambertian BRDF 为

fr=ρπ.f_r=\frac{\rho}{\pi}.

1/π1/\pi 来自半球的余弦积分,不是经验着色中可以省略的常数。ρ=1\rho=1 时表面完全不吸收,但 BRDF 仍是 1/π1/\pi,而不是 1。把 ρ\rho 写成一个数得到灰度漫反射,写成 RGB 三个数就能表示颜色;如果要描述光谱,则按波长记录反照率。

推导中假设入射辐亮度均匀,只是为了把 LiL_i 从积分中提出。fr=ρ/πf_r=\rho/\pi 的结论不依赖均匀入射;它表示 BRDF 对入射方向和出射方向都是常数,而表面接收的辐照度仍然会随入射方向的余弦改变。换句话说,“漫反射出射辐亮度与观察方向无关”不等于“表面接收的能量与入射方向无关”。

Lambertian 只表示方向上没有可见高光的近似。粗糙墙面、粉笔和未抛光纸张可以使用它,真实材料仍可能包含高光、次表面散射和微小遮挡。仅凭“微表面方向很乱”不能自动推出 ρ/π\rho/\pi,漫反射的常数 BRDF 还需要能量分配约束。

反射与折射

理想镜面反射只在一个方向上离开。沿用方向都从表面指向外部的约定,入射光实际沿 −ωi-\boldsymbol\omega_i 传播,反射方向是

ωo=2(n⋅ωi)n−ωi.\boldsymbol\omega_o =2(\mathbf n\cdot\boldsymbol\omega_i)\mathbf n-\boldsymbol\omega_i.

把入射方向分成法向与切向分量,反射保持法向分量、翻转切向分量,就得到上式。反射方向和法线与入射方向共面,满足入射角等于反射角。用球面坐标表示时,θo=θi\theta_o=\theta_i,而方位角满足

ϕo=ϕi+π(mod2π).\phi_o=\phi_i+\pi\pmod {2\pi}.

理想镜面的 BRDF 是反射方向上的 Dirac delta,不能当作普通有限峰值。表面粗糙后,能量在理想反射方向附近形成一段反射瓣,这就是 glossy 外观。古代铜镜经过打磨可以照出模糊影像,正是因为反射瓣比理想镜面更宽。双向透射分布函数 Bidirectional Transmittance Distribution Function,BTDF 描述光传到界面另一侧的方向分布。反射和透射合起来称为双向散射分布函数 Bidirectional Scattering Distribution Function,BSDF;它们必须共享同一份入射能量预算。

镜面表面把环境反射到相机,透明球还会改变穿过它的视线方向。玻璃球中棋盘格的变形是折射改变视线的结果;带颜色的玻璃还可能在内部选择性吸收,透射光因此变色。

理想镜面的反射瓣和光滑折射方向都是 delta 分布。它们在半球上的普通点值没有有限峰宽,正确实现应直接沿唯一方向采样;普通半球随机采样命中该方向的概率为零。焦散正是由多个镜面事件把能量集中到漫反射表面的狭小区域,难点来自路径结构而不只是“光很亮”。

理想镜面的极角与方位角

左图沿入射面观察,法线平分两条向外方向,两个极角相等;右图从上方看,两方向在切平面中的投影相反,因此方位角相差 π。两幅图分别说明反射定律在两个角参数上的约束。

反射与折射材质分别沿镜面方向和透射方向传输能量

光从折射率为 ηi\eta_i 的介质进入 ηt\eta_t 的介质时,Snell 定律为

ηisin⁡θi=ηtsin⁡θt.\eta_i\sin\theta_i=\eta_t\sin\theta_t.

常见折射率是真空 1、水约 1.333、玻璃约 1.5、钻石约 2.42。令 η=ηi/ηt\eta=\eta_i/\eta_t,则

cos⁡2θt=1−η2(1−cos⁡2θi).\cos^2\theta_t=1-\eta^2(1-\cos^2\theta_i).

根号内为负表示不存在实数折射方向,发生全内反射。光从高折射率介质进入低折射率介质时才可能出现这种情况。水下观察到的 Snell window 是可透过水面看到的空气区域,角度约为 97.2∘97.2^\circ;超过边界后只能看到水下的反射景象。

水下观察到的 Snell window 与全内反射边界

球形玻璃体的对称性使进入的光线通常能够从另一侧射出,但任意形状的玻璃兔子可能在内部多次全反射。实现折射时必须判断介质两侧并处理反射分支,不能假定“折射进来就一定折射出去”。

折射率随波长变化时会产生色散。棱镜把不同波长分开,雨滴把阳光分成彩虹;多次内部反射对应更高阶彩虹,能量更弱,也更难看见。水面起伏把光聚焦到池底形成焦散。对相机端来说,水面—池底—水面是一条 specular–diffuse–specular 路径,普通从相机随机采样很难命中。

若法线朝向入射介质,令 η=ηi/ηt\eta=\eta_i/\eta_t,折射方向可写为

ωt=−ηωi+(ηcos⁡θi−cos⁡θt)n,\boldsymbol\omega_t=-\eta\boldsymbol\omega_i+ (\eta\cos\theta_i-\cos\theta_t)\mathbf n,

其中 cos⁡θt\cos\theta_t 由上面的平方根决定。切向分量按折射率比缩放,法向分量由单位长度约束确定。实现时必须先判断光线位于表面的哪一侧,再交换 ηi,ηt\eta_i,\eta_t 并翻转法线;根号因舍入出现的微小负值可以在物理判断之后按容差钳为零,真实负值则必须走全反射分支。

Fresnel

菲涅耳反射率 Fresnel Reflectance 描述反射比例随入射角和介质变化的规律。车窗正视时主要看到外景,视线接近平行于玻璃时,玻璃会变成明显的镜子。反射比例由入射角和两侧介质决定,这就是 Fresnel 项。电介质通常用实折射率近似,导体需要复折射率,因而金属反射通常更强,并且可能带有颜色。

入射面由入射方向和法线张成。s 偏振垂直入射面,p 偏振平行入射面。非偏振光通常取两种反射率的平均。对无吸收电介质,精确反射率为

Fs=(ηicos⁡θi−ηtcos⁡θtηicos⁡θi+ηtcos⁡θt)2,F_s=\left( \frac{\eta_i\cos\theta_i-\eta_t\cos\theta_t} {\eta_i\cos\theta_i+\eta_t\cos\theta_t} \right)^2,

Fp=(ηtcos⁡θi−ηicos⁡θtηtcos⁡θi+ηicos⁡θt)2,F=12(Fs+Fp).F_p=\left( \frac{\eta_t\cos\theta_i-\eta_i\cos\theta_t} {\eta_t\cos\theta_i+\eta_i\cos\theta_t} \right)^2, \qquad F=\frac12(F_s+F_p).

这两个式子分别对应电场在入射面外的 s 偏振和入射面内的 p 偏振;它们的平方是功率反射率。非偏振光才取二者平均,不能把某一条偏振曲线直接当作所有光的 Fresnel 反射率。

空气到折射率 1.5 的电介质,垂直入射时反射率约为 4%;接近掠射角时反射率趋近 1。图中的 p 偏振在 Brewster 角附近可以降到 0,红色曲线是非偏振光的平均反射率。

Fresnel 反射率随入射角增大而接近 1 的曲线

实时渲染常用 Schlick 近似:

F(θ)=F0+(1−F0)(1−cos⁡θ)5,F(\theta)=F_0+(1-F_0)(1-\cos\theta)^5,

其中

F0=(ηi−ηtηi+ηt)2F_0=\left(\frac{\eta_i-\eta_t}{\eta_i+\eta_t}\right)^2

是垂直入射反射率。导体的 F0F_0 通常是 RGB 向量,不能用单一实折射率解释。反射能量按 FF 分配,透射能量按 1−F1-F 分配;全内反射时 F=1F=1。

导体的电磁响应通常用复折射率 η~=η+iκ\tilde\eta=\eta+i\kappa 描述:实部控制相位传播,虚部描述在导体中的衰减。工程着色常把测得或拟合的垂直入射反射率直接存成 RGB 的 F0F_0,这比把金属硬套成单一无色电介质更符合铜、金和铝等材料的颜色。

微表面

理想镜面只有一条反射方向,真实表面却由无数微小起伏组成。远处看到的是一个略粗糙的宏观平面,近处才看见凹凸几何。微表面模型把宏观表面视为平面,把微观起伏视为许多朝向不同的理想小镜面。

微面法线越集中,高光越窄,外观越接近镜面;法线分布越宽,高光越宽。给定入射方向和出射方向,能把前者反射成后者的微面法线必须沿半程向量

h=ωi+ωo∥ωi+ωo∥.\mathbf h=\frac{\boldsymbol\omega_i+\boldsymbol\omega_o} {\lVert\boldsymbol\omega_i+\boldsymbol\omega_o\rVert}.

常见微表面 BRDF 为

fr(ωi,ωo)=F(ωi,h)D(h)G(ωi,ωo)4(n⋅ωi)(n⋅ωo).f_r(\boldsymbol\omega_i,\boldsymbol\omega_o)= \frac{F(\boldsymbol\omega_i,\mathbf h)D(\mathbf h)G(\boldsymbol\omega_i,\boldsymbol\omega_o)} {4(\mathbf n\cdot\boldsymbol\omega_i)(\mathbf n\cdot\boldsymbol\omega_o)}.

DD 是法线分布函数,决定朝向正确的微面有多少;FF 是单个微面的 Fresnel 反射比例;GG 是 shadowing/masking 几何项,表示这些微面是否同时能被光源和观察者看见。掠射角时自遮挡更严重,漏掉 GG 会使球体边界异常发亮。

微表面模型用法线分布、菲涅耳项和几何项描述粗糙反射

法线分布可以按投影面积归一化:

∫Ω+D(m)(n⋅m) dωm=1.\int_{\Omega^+}D(\mathbf m)(\mathbf n\cdot\mathbf m)\,\mathrm d\omega_{\mathbf m}=1.

DD 本身是按微面法线方向给出的面积密度,不是可以直接拿来采样的普通立体角 PDF;只有乘上投影余弦并在上半球归一化后,才得到常用的 NDF 采样分布。若使用可见法线分布,还要进一步排除从观察方向被遮挡的微面。

从半程方向到出射方向的变量替换带来 Jacobian

dωo=4∣ωo⋅h∣ dωh.\mathrm d\omega_o=4|\boldsymbol\omega_o\cdot\mathbf h|\,\mathrm d\omega_h.

这也是分母中 4 的来源之一。工程材质通常在微表面高光之外再组合 Lambert/Oren–Nayar 漫反射、透射、清漆和次表面分量,并用 Fresnel、金属度或其他权重避免重复使用同一份能量。Cook–Torrance、Ward 等模型属于微表面模型家族的不同具体形式。

法线分布的具体选择也会改变高光尾部。Beckmann 适合高斯斜率,GGX(Trowbridge–Reitz)具有更长的尾部。各向同性 GGX 的一个常用形式是

D(h)=α2π((n⋅h)2(α2−1)+1)2.D(\mathbf h)= \frac{\alpha^2} {\pi\left((\mathbf n\cdot\mathbf h)^2(\alpha^2-1)+1\right)^2}.

α\alpha 越小,峰越高越窄;峰值变高并不意味着总能量增加,DD 仍须满足投影面积归一化,并与相容的 GG 项配对。粗糙度贴图改变微表面分布宽度,法线贴图改变局部宏观法线,二者属于不同尺度。

窄高光不适合均匀半球采样。可以按 D(h)(n⋅h)D(\mathbf h)(\mathbf n\cdot\mathbf h) 或可见法线分布采样半程向量,再由半程向量反射得到出射方向。半程 PDF 转为出射方向 PDF 时必须包含 Jacobian:

po(ωo)=ph(h)4∣ωo⋅h∣.p_o(\boldsymbol\omega_o)= \frac{p_h(\mathbf h)}{4|\boldsymbol\omega_o\cdot\mathbf h|}.

漏掉 Jacobian 会改变估计量;粗糙度极小时可以切换到理想镜面模型或使用系统约定的数值下限。

各向异性

各向同性 BRDF 绕宏观法线共同旋转入射、出射方向后保持不变,只依赖两个极角和方位角之差:

fr(θi,ϕi;θo,ϕo)=fr(θi,θo,ϕo−ϕi).f_r(\theta_i,\phi_i;\theta_o,\phi_o) =f_r(\theta_i,\theta_o,\phi_o-\phi_i).

各向异性 BRDF 还依赖绝对方位角。拉丝金属、沿方向打磨的锅底、经纬线织物和被抚平的天鹅绒都有优先方向。高光会沿切线方向拉长,切线 t\mathbf t、副切线 b\mathbf b 和法线 n\mathbf n 需要组成正交坐标系。对照图中,上排随机法线产生近似圆对称高光,下排沿一个方向排列的法线产生细长亮带。

各向同性高光保持圆对称,各向异性高光沿切线方向拉伸

径向刷痕形成的方向性高光

锅底的亮带沿圆心向外展开。局部刷痕方向随位置改变,因此高光也随切向排列改变;这与给整个表面设置一个固定方向的各向异性不同。

各向同性只意味着绕宏观法线共同旋转后 BRDF 不变,并不意味着任意固定入射方向下的图像高光都一定是圆形。各向异性模型通常把半程向量投影到由 (t,b,n)(\mathbf t,\mathbf b,\mathbf n) 构成的切线空间,用两个粗糙度参数分别控制两个切向轴。UV 接缝处切线不连续会导致高光断裂;沿圆心一圈圈打磨的锅底则会产生径向展开的高光。

BRDF 性质

合理的被动 BRDF 至少应满足四条性质:

  • 非负性:fr≥0f_r\ge0,反射辐亮度不能为负;
  • 线性:不同入射光的贡献可以相加;
  • Helmholtz 互易性:fr(ωi,ωo)=fr(ωo,ωi)f_r(\boldsymbol\omega_i,\boldsymbol\omega_o)=f_r(\boldsymbol\omega_o,\boldsymbol\omega_i);
  • 能量守恒:固定入射方向时,总反射比例不超过 1。

能量守恒写成

∫Ω+fr(ωi,ωo)(n⋅ωo) dωo≤1.\int_{\Omega^+}f_r(\boldsymbol\omega_i,\boldsymbol\omega_o) (\mathbf n\cdot\boldsymbol\omega_o)\,\mathrm d\omega_o\le1.

线性使漫反射、镜面和环境项可以分别计算后相加;互易性意味着交换光源和相机后 BRDF 数值相同;能量守恒还决定了路径追踪多次弹射是否会收敛。BRDF 的逐点数值可以大于 1,真正受约束的是乘余弦后的半球积分。

若材质还会透射,则 BRDF 与 BTDF 必须共享同一份入射能量预算。对整个球面求和时,反射与透射比例之和不能超过 1;只把两个分量都按 1 归一化会凭空制造能量。白炉测试用均匀白环境检查这一点:无吸收、全反射的模型应与环境一致,结果比环境更亮通常说明能量增益或归一化错误。

测量与分层

解析模型不一定能精确表示真实材料。Gonioreflectometer 固定样本,分别改变光源和传感器方向,直接测量入射辐照度与出射辐亮度的比值。球面台架通常由两条机械臂承载光源和相机,样本置于球心,角度精度可到约 0.1∘0.1^\circ,设备直径约 2–3 m。

BRDF 一般有四个角度参数。各向同性假设可把共同绕法线的旋转消掉,降到三个参数;互易性还能进一步合并样本。实测数据通常需要插值、压缩或拟合成解析模型。MERL 数据库的各向同性版本常按 90×90×18090\times90\times180 的三维表格存储每种材质,原始数据量很大,镜面峰太窄时还会被采样步长低估。

测量值不能直接用照片像素代替。相机像素已经混入光源强度、镜头响应、曝光、几何衰减和色调映射;仪器需要先用标准板标定入射辐照度,再测量样本的出射辐亮度。把光源和相机各自遍历球面会产生四维采样的维度灾难,因此要利用各向同性、互易性、插值、图像式测量或更聪明的压缩方法。

球面台架上的材质测量

样本位于机械臂围绕的区域,照明和接收装置可以改变方向。固定样本,遍历入射与出射角度,就能把同一材质的方向响应记录为表格;实际测量还要标定光源和相机响应。

陶器的釉层是分层材质的例子。釉层先按 Fresnel 反射一部分光,未反射的部分进入底下的陶土,经过漫反射后再穿过釉层返回。最终外观同时有上层镜面反射和底层漫反射,不能把整件陶器压缩成一个未经说明的“颜色参数”。

测量表格可以理解为两个嵌套方向循环。Ei 是定向照明在样本处的校准辐照度,测到的是有限角度和面积范围内的平均响应:

1
2
3
4
5
6
7
对每个出射方向 wo:
将接收装置移动到 wo
对每个入射方向 wi:
将光源移动到 wi
标定样本处的 Ei
测量并扣除背景后的出射辐亮度 Lo
将 Lo / Ei 保存为该角度组合的 BRDF 样本