词汇表已校准,本节把整章、乃至整册最重要的一台仪器搬上台面:渲染方程。它的名声常吓退初学者,实际拆开只有五件套,且每一件都能翻译成一句日常话。本节的读法是"逐项过堂"——每个符号先问它是什么物理量,再问它在代码里长什么样,最后问丢掉它会看见什么。读完后,渲染方程应当从"公式"降维成"一张你每天都会对账的记账规则"。
把方程翻译成一句话:某点沿某方向出射的亮度,等于它自己发的光,加上从半球各个方向来的光经材质重新分配后落到这个方向的份额。用符号写出来就是——
L_o(x, wo) = L_e(x, wo) + ∫ over Ω of f_r(x, wi, wo) · L_i(x, wi) · (n·wi) └──┬──┘ └──┬──┘ └────────────────┬────────────────────┘ 我出射多少 我自己发光 半球所有来路按材质与夹角折算后累加
五个部件逐个过堂。第一件 L_o:x 点沿出射方向 wo 的辐射亮度,最终写进像素的东西,也是方程要求解的目标。第二件 L_e:自发光项,x 自己是光源时贡献的亮度;灯管、屏幕、岩浆靠它出场,普通表面此项为零。第三件 积分号与半球 Ω:入射光可能来自上半球的任何方向,必须把所有来路累加——注意是上半球,从表面背后来的光不参与。第四件 f_r:双向反射分布函数,材质的身份证明,回答"从 wi 方向来的光有多少、以什么方向分布被转投到 wo 方向";第 5 章整章都在讲它。第五件 余弦因子 n·wi:2.1 的余弦定律,斜入射按投影摊薄。
陷阱一:递归。右端的入射亮度 L i,是"别处"沿相反方向出射的亮度 L o——也就是说,求一点的答案需要别处的答案,而别处的答案又需要更别处的答案。方程实际上是一个无穷嵌套的方程组:直接光依赖光源,一次弹射依赖直接光,二次弹射依赖一次弹射,层层相扣。这个结构解释了两个事实:其一,为什么第 1 章 Whitted 递归恰好是方程的深度截断近似——他只解了镜面方向那一小部分嵌套;其二,为什么渲染问题没有"一步算完"的解析解,任何求解器都在处理"嵌套深度截到哪里"的取舍。
陷阱二:积分维度。半球积分是对方向的二重积分,若把间接光展开,每多一层弹射就多一层半球积分——k 次弹射的完整路径积分维度是 2k 量级。高维积分是解析方法与数值网格方法的共同坟场,却恰好是蒙特卡洛方法的主场:积分维度再高,随机采样的收敛速度都只由样本数决定(误差按样本数平方根的倒数衰减),与维度关系不大。这就是为什么 1986 年之后,整条技术史都围着蒙特卡洛转。

半球积分必须数值求解,蒙特卡洛的思路朴素到近乎直白:想算一群方向贡献的总和,就随机抽 N 个方向,把每个方向的贡献除以"抽到它的概率密度",再取平均。写成代码只有一行核心:
function estimate_Lo(x, wo): wi = sample_direction_on_hemisphere() # 按某概率密度 pdf 抽一个入射方向 pdf = pdf_of(wi) # 这个方向被抽中的概率密度 f = bsdf_eval(x, wi, wo) # 材质函数取值 return f * radiance_in(x, wi) * dot(n, wi) / pdf
除以 pdf 这一步是全部魔法的所在:如果某些方向被抽得更频繁,它们的每次贡献就按比例变小,N 次平均的期望恰好等于真实积分——无偏。若抽样分布的形状恰好与被积函数形状相似(比如按余弦分布抽方向去积余弦加权的积分),方差急剧下降,同样样本数下噪声更小——这就是"重要性采样"四个字的一切。记住这条规则,第 6 章路径追踪的每一步都只是在回答"下一跳按什么 pdf 抽、怎么补偿"。
现象一,为什么阴天影子边缘很软。太阳被云层糊成一个大面积光源,半球的入射亮度来自一大片立体角;影子本缘处仍有部分立体角能看到太阳,本影区完全看不到,过渡带即半影——本质是半球积分在遮挡边界处的连续过渡。点光源把立体角压缩成一点,过渡带消失,阴影硬如刀切。现象二,为什么白墙上的绿裙倒影偏绿。绿裙把入射光染绿后向半球出射(f r 的漫反射项),白墙的半球积分把这些绿色来路累加进去——这是方程间接项的直系产物,也是第 1 章光栅化清单里"颜色溢出"的物理出处。变式自查:把两个现象里的光源换成窄谱激光、白墙换成黑丝绒,各自哪一项变化最大?能答出"立体角项"与"材质反照率项",说明方程确实长在你脑子里了。
逐项拆完,趁热用三问三答把方程的边界钉牢。这三问在讨论区与面试里出场率最高,答案全部能从五件套结构直接推出来——推一遍胜过背十遍。
第一问:方程里为什么没有雾和烟? 因为它默认光做的是表面到表面的直线旅行,途中空气不参与交易。雾、烟、海水这类参与介质会让亮度在传播途中被吸收与内散射,方程要为整条传播路径补上传输积分,升级成体渲染方程——第 6 章末的体积光与第 10 章的云海都从那里展开。表面方程是零厚度特例,先学特例不是偷懒:最难的高维积分先在二维域上练熟,再上体积才不慌。
第二问:BRDF 与 BSDF 什么关系? BRDF 只描述反射半球内的方向分布;BSDF 把透射半球的分布也并进来,是"反射加透射"的全家福。玻璃、水面这类会把光改道进介质内部的材质必须用 BSDF 才能写全。方程本身不挑名词:积分域从半球扩成完整球面,材质函数换成 BSDF,等式依然成立——改的是记账范围,不是记账规则。
第三问:积分域为什么是半球而不是全球? 因为不透明表面下方来路的贡献被自身挡死,物理上恒为零,把积分域切半球是免费的计算减半。渲染透明体时积分域要恢复全球,或者按折射方向单独开一条路径记账,两种写法等价,工程上选实现简单的那种。顺带一提,半球积分的"余弦加权"意味着法线附近的来路天然权重更高——这不是数值技巧,是投影的物理事实,第 5 章按余弦分布采样时会正面利用它。
三问答完,方程的适用边界画清了:表面、全球来路、材质全函数。此后的一切技术——路径追踪、光子映射、实时光追——都只是在这三条边界之内回答同一件事:怎么把半球积分估得又快又稳。
补充一条写实现的纪律:五件套在代码里应有各自的函数或数据结构——发射项、材质函数、来路亮度、余弦权重、采样分布,任何一项被"顺手内联"进主循环,第一次换算法时就会爆炸。第 9 章的分层铁律在方程上的投影就是这条小纪律:方程的项即代码的模块。顺带一个课堂练习收尾:把 2.1 的三个日常现象(黄昏变暗、远处灯变小、镜面高光移动)分别对应到五件套上——各对应哪一项、动了哪个字母?能脱口而出,说明方程已从公式长成思维工具,这正是本章的全部目的。
方程立起来了,剩下的问题是求解策略:从眼睛那头开始记,还是从光源这头开始记?下一节把三种追踪范式摆上同一个案板。