中EN
概念页

渲染方程

Rendering Equation

渲染方程 (Kajiya, 1986) 把"某点接收到的光就是其他点发出或反射的光"写成递归积分,概括了光从光源出发经任意次反弹到达眼睛的所有路径。反射方程是它的受限特例。离线用辐射度 (Radiosity) 或蒙特卡洛路径追踪求解;实时渲染则靠简化和预计算逼近它(RTR4 第 11 章)。

从反射方程到渲染方程

前面各章用的反射方程把入射辐射亮度 LiL_i 当作已知:

Lo(p,v)=∫l∈Ωf(l,v) Li(p,l) (n⋅l)+ dlL_o(\mathbf{p},\mathbf{v})=\int_{\mathbf{l}\in\Omega} f(\mathbf{l},\mathbf{v})\,L_i(\mathbf{p},\mathbf{l})\,(\mathbf{n}\cdot\mathbf{l})^+\,d\mathbf{l}

渲染方程加入自发光项 LeL_e,并把入射亮度替换为另一点的出射亮度:

Lo(p,v)=Le(p,v)+∫l∈Ωf(l,v) Lo(r(p,l),−l) (n⋅l)+ dlL_o(\mathbf{p},\mathbf{v})=L_e(\mathbf{p},\mathbf{v})+\int_{\mathbf{l}\in\Omega} f(\mathbf{l},\mathbf{v})\,L_o(r(\mathbf{p},\mathbf{l}),-\mathbf{l})\,(\mathbf{n}\cdot\mathbf{l})^+\,d\mathbf{l}

其中 r(p,l)r(\mathbf{p},\mathbf{l}) 是光线投射函数,返回从 p\mathbf{p} 沿 l\mathbf{l} 射出的光线击中的第一个表面点。z-buffer 实际上就在为从眼睛出发的光线计算它。唯一的新东西是递归项 Lo(r(p,l),−l)L_o(r(\mathbf{p},\mathbf{l}),-\mathbf{l}):要算它又需要在 r(r(p,l),l′)r(r(\mathbf{p},\mathbf{l}),\mathbf{l}') 处再积分,无穷无尽。

关键性质:渲染方程对发光量是线性的——光源加倍,结果加倍;各光源对材质的作用互不影响。这条性质是预计算辐射传输的基础。

局部光照与全局光照

GPU 最擅长的是局部光照:图元独立处理、光栅化后丢弃,算点 b 时拿不到点 a 的光照结果。透明、反射、阴影都是需要其他物体信息的全局光照算法,能大大增加真实感和空间关系线索,但往往需要预计算或多遍渲染。

Heckbert 光路表示法

把光子从光源 (L) 到眼睛 (E) 路径上的每次交互标为漫反射 (D) 或镜面 (S),可再加"光泽"(glossy) 等类型,用正则表达式概括算法模拟了哪些路径:

运算符含义例子
*零次或多次S* 零或多次镜面反弹
+一次或多次D+ 至少一次漫反射
?零或一次S?
|二选一D|SS
()分组(D|S)*
系统光路
基本 z-bufferL(D|S)E
光源有几何体(可直接看到)L(D|S)?E
加入环境贴图L((S|D)?S|D)?E,即 L(D|S)?S?E;生成环境贴图编码 L(S|D),访问它是 SE
辐射度LD*E
渲染方程本身L(D|S)*E
漫反射全局光照 / 镜面全局光照L(D|S)*DE / L(D|S)*SE

书中建议从眼睛往回推更容易写出表达式。实时全局光照最常用的两种策略是简化(比如假设到达眼睛前的反弹都是漫反射)和预计算(离线把光照存进纹理等)。

为什么实时渲染也要了解离线算法

  1. 静态或部分静态场景可以把它们当预处理运行(烘焙),游戏中很常见;
  2. 它们有严格的理论基础,近似都经过分析。设计实时方案时也应知道捷径的后果和正确做法是什么。

辐射度 (Radiosity)

  • 第一个模拟漫反射表面间光线反弹的图形学技术,可计算面光源的相互反射和软阴影。假设所有间接光来自漫反射表面(抛光大理石、大镜子会失效,建筑场景通常可接受),可跟踪实际上无限次漫反射反弹。
  • 表面分成若干面片,每片一个平均值;面片要小到能捕捉阴影边缘等细节,但不必与三角形一一对应或等大。

Bi=Bie+ρss∑jFijBjB_i=B_i^e+\rho_{ss}\sum_j F_{ij}B_j

BieB_i^e 为面片 ii 的辐射出射度(只有光源非零),ρss\rho_{ss} 为次表面反照率,FijF_{ij} 为形状因子:

Fij=1Ai∫Ai∫AjV(i,j) cos⁡θicos⁡θjπdij2 dai dajF_{ij}=\frac{1}{A_i}\int_{A_i}\int_{A_j}V(i,j)\,\frac{\cos\theta_i\cos\theta_j}{\pi d_{ij}^2}\,da_i\,da_j

VV 为可见性(0/1),θ\theta 为两面片法线与连线的夹角,dijd_{ij} 为距离。形状因子是纯几何量:面片 ii 均匀漫射出的能量落到 jj 上的比例,所有比例之和为 1。所有方程组成线性系统求解;面片增多后求解代价极高,所以经典辐射度很少再用,但"预计算形状因子、运行时传播光"的思路仍是现代实时 GI(如 Enlighten)的基础。

光线追踪与路径追踪

  • 经典光线追踪:从相机穿过像素发射光线找最近交点,向各光源发射阴影光线(不透明物体遮挡、透明物体衰减),光滑表面沿反射方向、透明体沿折射方向递归。只能做锐利反射/折射和硬阴影。
  • Kajiya 意识到发射光线可以用来计算渲染方程积分:蒙特卡洛方法在定义域随机点上评估被积函数来估计积分,只需要点评估,样本越多越准。每条光线就是对被积函数的一次点采样,交点处的积分不必求出最终值,再点采样即可;光线在场景中弹跳形成一条路径,这就是路径追踪。
  • 路径追踪能处理光泽和漫反射材质、软阴影、透明与焦散;扩展到体积采样后还能处理雾和次表面散射。
  • 缺点:只得到估计值,路径太少时方差高,表现为图像噪点;电影级画面可能需要数十亿条路径(书中示例:每像素两千多条、每条最多 64 段,渲染两小时仍有少量噪点)。重要性采样在光多的方向多发光线,可大幅降低方差。
  • 离线 GI 中光线追踪远比辐射度流行:能在同一框架里处理一般光传输(包括体积散射),也更易扩展和并行。

统一方法:实时路径追踪的前景

  • 各种实时 GI 技术组合起来能出好图,但每部分都有不同折中,许多情况下幻觉会破灭,缺少路径追踪的优雅。
  • 实时路径追踪已用于建筑漫游和电影预览(可接受较低帧率、相机静止时渐进细化、多 GPU);游戏需要每帧在预算内给出最终质量,GPU 还要做粒子模拟等工作,书中认为纯路径追踪当时尚不实用。圈内俗语:"光线追踪是未来的技术,而且永远都是!"——GPU 为光栅化而设计,缺少光线追踪的固定功能支持。
  • 更现实的是混合:光栅化主可见性,用路径追踪做反射、面光源阴影等光栅化难处理的效果。"帧率不可妥协",为几毫秒牺牲一些优雅是正确选择。
  • GPU 上 BVH 遍历要减少 warp 内分支分歧、复用提前结束的线程;每像素一条路径的噪声图可用降噪算法(如时空方差引导滤波 SVGF)得到接近 2048 spp 参考的结果。PowerVR Wizard GPU (2014) 已含构建和遍历加速结构的硬件单元。

GEA 的视角:光照问题、渲染方程的推导与辐射度方法(卷 II 12.1、12.2.1.1、12.3、12.6.1)

光照问题、直接与间接光照

  • GEA 把渲染问题拆成可见性问题和光照问题:先找到每个虚拟传感器能直接看到的表面点 {xj}\{\mathbf{x}_j\}(发射光线或深度缓冲光栅化),再求这些点送到传感器的光的颜色和强度(卷 II 12.1,见 图形栈与渲染引擎架构)。
  • 直接光照指光子从光源发出、恰好在一个表面反射一次后进入相机;间接光照指进入相机前反射多于一次。间接光要递归计算、还要考虑来自所有方向的入射光,代价高得多。实践中可以忽略间接光或粗略近似它来得到"可信但不照片级"的图像,追求真实感的历史,主要就是不断改进间接光近似的历史(卷 II 12.1.3)。
  • 只考虑直接光源叫局部光照模型,同时考虑间接光的叫全局光照模型;全局光照模型通常还包括次表面散射和参与介质中的散射与吸收。照片级真实感只能靠全局光照(卷 II 12.1.4)。这与本页上文 RTR4 从"GPU 擅长局部光照"角度的说法一致。

光路表示法:GEA 的写法

GEA 用的符号是 L(光源)、D(漫反射)、G(半漫反射或光泽反射)、S(镜面)、E(眼睛或相机),并只用 * 和 +。所有光路为 L(D|G|S)*E;直接光照为 L(D|G|S)E 或 LE;间接光照为 L(D|G|S)+E;辐射度方法只能处理 LD*E(卷 II 12.2.1.1)。

原书问题(12.2.1.1):按正则表达式语义,L(D|G|S)+E 也匹配只反弹一次的 L(D|G|S)E,与同一句里的"直接光照"重叠,并非"其余所有光路"。按 GEA 自己在 12.1.3 的定义(间接光照=反弹多于一次),间接光照应写成 L(D|G|S)(D|G|S)+E(即 L(D|G|S){2,}E)。+ 表示"一次或多次"的含义见 Heckbert, "Adaptive Radiosity Textures for Bidirectional Ray Tracing", SIGGRAPH 1990 引入的光路正则表示法,以及任一正则表达式规范(如 POSIX ERE)。与上表 RTR4 的 Heckbert 表示法相比,GEA 把光泽反射提升为基本符号 G,RTR4 只说可以"再加光泽类型"。

推导:从"魔法因子"到 BRDF

GEA 的推导路线是:出射亮度 = 自发光 + 反射(L=Le+LrL=L_e+L_r);反射部分必须对半球上所有入射方向积分,先写成 Lr≈∫ΩF L(x←Ψ) dωΨL_r\approx\int_\Omega F\,L(\mathbf{x}\leftarrow\Psi)\,d\omega_\Psi。从单位分析可知 FF 的单位是 sr⁻¹。把 BRDF 定义为反射亮度对入射辐照度的导数 fr=dLr/dEf_r=dL_r/dE,再代入 dE=Lcos⁡θ dωdE=L\cos\theta\,d\omega,就得到 F=frcos⁡θF=f_r\cos\theta 和完整的渲染方程(卷 II 12.3.1–12.3.2):

L(x→Θ)=Le(x→Θ)+∫Ωfr(x,Ψ→Θ) L(x←Ψ)cos⁡θ dωΨL(\mathbf{x}\to\Theta)=L_e(\mathbf{x}\to\Theta)+\int_\Omega f_r(\mathbf{x},\Psi\to\Theta)\,L(\mathbf{x}\leftarrow\Psi)\cos\theta\,d\omega_\Psi

渲染方程由 Immel 等与 Kajiya 在 1986 年独立提出,是线性积分方程(卷 II 12.3)。本页开头只提 Kajiya,GEA 补充了 Immel 等的同期工作。

各种写法其实是同一个方程

GEA 专门对比了文献中的写法(卷 II 12.3.3):

  • 向量形式:方向写成单位向量,出射方向为视线向量 v\mathbf{v}、入射方向为光照向量 ℓ\ell,两者都约定背离表面(对 ℓ\ell 来说与光子行进方向相反);余弦写成 (n⋅ℓ)+(\mathbf{n}\cdot\ell)^+,即 HLSL 的 saturate。(原书问题:GEA 说 HLSL 提供 sat() 或 saturate();HLSL 内建函数表中只有 saturate,没有 sat(MS Learn "Intrinsic Functions (HLSL)")。另外 saturate 钳到 [0,1][0,1],对单位向量点积而言上限无影响,等价于 max⁡(0,⋅)\max(0,\cdot)。)ℓ\ell 不一定真指向光源,v\mathbf{v} 也不一定指向观察者。
  • RTR4 的写法 Li(c,−v)=Le(p,v)+∫f(l,v)Li(p,l)(n⋅l) dlL_i(\mathbf{c},-\mathbf{v})=L_e(\mathbf{p},\mathbf{v})+\int f(\mathbf{l},\mathbf{v})L_i(\mathbf{p},\mathbf{l})(\mathbf{n}\cdot\mathbf{l})\,d\mathbf{l}:左边是相机成像面点 c\mathbf{c} 收到的亮度,等价于可见表面点 p\mathbf{p} 的出射亮度,与本页上文一致。
  • Kajiya 原文用"传输强度"(对源点面积和目标点面积的二阶导数),配几何项 gg、发射项 ϵ\epsilon 和类似 BRDF 的 ρ\rho,作用与辐射亮度相同。Kajiya 的原式是 I(x,x′)=g(x,x′)[ϵ(x,x′)+∫Sρ(x,x′,x′′) I(x′,x′′) dx′′]I(x,x')=g(x,x')\left[\epsilon(x,x')+\int_S\rho(x,x',x'')\,I(x',x'')\,dx''\right]。 注意几何项 gg(不可见为 0,可见为 1/r21/r^2)乘的是发射与散射两项之和(Kajiya, "The Rendering Equation", SIGGRAPH 1986 式 (1);Wikipedia "Path tracing")。GEA 电子版文本层中此式没有方括号,看起来像 g ϵ+∫ρIg\,\epsilon+\int\rho I;由于积分号、ϵ\epsilon、ρ\rho 等数学字体字符在文本层中同样缺失,无法确认是排版丢失还是原书漏写,阅读时以 Kajiya 原式为准。
  • 面积形式(Dutré 等):对场景所有表面积分,G(x,y)=(nx⋅ℓ)(ny⋅−ℓ)rxy2G(\mathbf{x},\mathbf{y})=\dfrac{(\mathbf{n}_x\cdot\ell)(\mathbf{n}_y\cdot-\ell)}{r_{xy}^2},再乘可见性 VV。单位分析:dωℓ=(ny⋅−ℓ) dAy/rxy2d\omega_\ell=(\mathbf{n}_y\cdot-\ell)\,dA_y/r_{xy}^2,所以 G dAyG\,dA_y 的量纲仍是 sr,与 BRDF 的 sr⁻¹ 相消。面积形式是辐射度方法的基础,也适合光线追踪,因为 y=R(x,ℓ)\mathbf{y}=R(\mathbf{x},\ell) 正是光线投射函数(本页上文的 r(p,l)r(\mathbf{p},\mathbf{l}))。

光度学 RGB 形式与颜色向量

  • 把方程拆成 R、G、B 三个独立方程,用光度学量(流明为基础的单位)计算,是"物理上可信但不严格正确"的近似;严格做法要把波长 λ\lambda 作为额外自变量(卷 II 12.3.4)。
  • 颜色像向量一样可以相加、数乘,但:模长不是亮度,sRGB 下灰度亮度 Y=0.212639R+0.715169G+0.072192BY=0.212639R+0.715169G+0.072192B(系数只适用于线性 sRGB 分量,即解码 gamma 之后的值,见 显示编码与 sRGB);GEA 说分量不能为负(物理上可信的颜色必在颜色空间第一卦限)——这只对谱色都在 sRGB 色域内的情况成立:sRGB 原色三角形之外的真实颜色(例如高饱和的青绿色谱色)换算成线性 sRGB 时必然有负分量(IEC 61966-2-1 色域;Wikipedia "sRGB"/"Gamut"),这也是宽色域渲染改用 ACEScg 等工作空间的原因;可以大于 1(HDR),最终写入帧缓冲前要色调映射或钳制到 [0,1][0,1];颜色之间不做点积叉积,相乘是逐分量的 Hadamard 积。严格地说颜色相乘应乘光谱功率分布再转回 sRGB,但逐分量相乘的精度损失可以忽略(卷 II 12.3.4.1)。
  • 因为积分没有闭式解、且递归可能成环,GEA 在下一节做两条简化得到着色方程,见 着色方程与经典光照模型。

辐射度方法:GEA 的补充

  • 辐射度方法源自辐射传热的有限元方法,与视角无关,计算一次后相机移动时可以重复使用,但几何一变就要重算,不适合动态场景;它假设表面都是朗伯面,只能处理 LD*E,做不了镜面反射和硬阴影。PRT 和光照贴图都是受它启发的混合用法(卷 II 12.6.1,见 预计算辐射传输、预计算光照与光照贴图)。
  • 只有朗伯面时,面积形式可以写成辐射度形式 B(x)=Be(x)+fdiff(x)∫AV G B(y) dAyB(\mathbf{x})=B_e(\mathbf{x})+f_{\text{diff}}(\mathbf{x})\int_A V\,G\,B(\mathbf{y})\,dA_y,离散成面片后 Bi=Be,i+fdiff,i∑jFjiBjB_i=B_{e,i}+f_{\text{diff},i}\sum_j F_{ji}B_j(卷 II 12.6.1.1)。
  • 形状因子可以用半立方体 (hemicube) 计算:把单位半球换成以面元为中心的半个立方体,划分成方形"像素",把远处面片投影上去,统计各自可见的比例。

原书问题(12.6.1.1):GEA 把 V(x,y)G(x,y)V(x,y)G(x,y) 称作形状因子 FxyF_{xy},再把积分直接改写成 ∑jFjiBj\sum_j F_{ji}B_j。但 G=cos⁡θxcos⁡θy/r2G=\cos\theta_x\cos\theta_y/r^2 的量纲是 m⁻²(乘 dAydA_y 才无量纲),离散求和时必须乘面片面积 AjA_j(或在面片上积分)才能代替 ∫dAy\int dA_y;书中的离散式漏了这一项。标准写法里形状因子是无量纲的面积平均量 Fij=1Ai∫Ai∫AjVcos⁡θicos⁡θjπr2dAj dAiF_{ij}=\frac{1}{A_i}\int_{A_i}\int_{A_j}\frac{V\cos\theta_i\cos\theta_j}{\pi r^2}dA_j\,dA_i,满足互易关系 AiFij=AjFjiA_iF_{ij}=A_jF_{ji},离散方程为 Bi=Ei+ρi∑jFijBjB_i=E_i+\rho_i\sum_j F_{ij}B_j(Cohen & Wallace,《Radiosity and Realistic Image Synthesis》第 2、4 章;Wikipedia "Radiosity (computer graphics)" 数学推导一节)。按 GEA 的 fdiff=ρ/πf_{\text{diff}}=\rho/\pi 写法,应为 Bi=Be,i+fdiff,i∑jBj∫AjVG dAyB_i=B_{e,i}+f_{\text{diff},i}\sum_j B_j\int_{A_j}VG\,dA_y。

  • 线性系统通常迭代求解:收集法 (gathering) 每次迭代从其他面片收集辐射度来更新一个面片,属于 Gauss-Seidel 松弛;发射法 (shooting) 把一个面片的辐射度发射给所有其他面片,属于 Southwell 松弛,适合渐进细化,每次迭代后都能输出一张图,质量随纳入的反弹次数逐步提高。
对照RTR4(本页上文)GEA
反射系数ρss\rho_{ss}(次表面反照率)fdiff=Cdiff/πf_{\text{diff}}=C_{\text{diff}}/\pi(漫反射 BRDF)
形状因子FijF_{ij},含 1/π1/\pi 与 1/Ai1/A_i,表示 ii 发出的能量落到 jj 上的比例把 V⋅GV\cdot G 称为形状因子并记作 FxyF_{xy},离散式里写 FjiF_{ji},未显式出现 1/π1/\pi

两者的 π\pi 因子放的位置不同:GEA 的 fdifff_{\text{diff}} 已含 1/π1/\pi,RTR4 把 1/π1/\pi 放进形状因子,下标顺序也不同;读公式时要按各自的定义对应,不能直接混用。另外 GEA 正文把 fdifff_{\text{diff}} 称为"漫反射反射率",按它自己 12.4.3.2 的定义,fdifff_{\text{diff}} 是 BRDF,反射率是 Cdiff=πfdiffC_{\text{diff}}=\pi f_{\text{diff}}。

PBRT 的视角:光传输方程的三种形式(PBRT 4e 13.1)

PBRT 把渲染方程称为光传输方程 (Light Transport Equation, LTE),本节暂不考虑参与介质(第 14 章再加)。

由能量平衡推导(13.1.1)

宏观上 Φo−Φi=Φe−Φa\Phi_o-\Phi_i=\Phi_e-\Phi_a;在表面上就是"出射 = 自发光 + 散射",散射项即散射方程(见 双向反射分布函数)。真空中辐亮度沿光线不变,定义光线投射函数 t(p,ω)t(p,\omega) 为从 pp 沿 ω\omega 打到的第一个表面点(场景不封闭时返回特殊值 Λ\Lambda,规定 Lo(Λ,ω)=0L_o(\Lambda,\omega)=0),则 Li(p,ω)=Lo(t(p,ω),−ω)L_i(p,\omega)=L_o(t(p,\omega),-\omega),于是

L(p,ωo)=Le(p,ωo)+∫S2f(p,ωo,ωi) L(t(p,ωi),−ωi) ∣cos⁡θi∣ dωi(式 13.1)L(p,\omega_o)=L_e(p,\omega_o)+\int_{S^2}f(p,\omega_o,\omega_i)\,L(t(p,\omega_i),-\omega_i)\,|\cos\theta_i|\,d\omega_i\quad(\text{式 13.1})

方程里只剩一个未知量:表面的出射辐亮度。

解析解与诺伊曼级数(13.1.2)

一般情况只能数值求解,但简单场景的解析解可用来调试积分器。例:球内表面处处是常数 BRDF f=cf=c 的朗伯面,且发射常数辐亮度 LeL_e。由对称性各点各方向的 LL 相同,LTE 化为 L=Le+cπLL=L_e+c\pi L;令 ρhh=πc\rho_{hh}=\pi c,反复代入得

L=Le+ρhh(Le+ρhh(Le+⋯ ))=∑i=0∞Leρhhi=Le1−ρhhL=L_e+\rho_{hh}(L_e+\rho_{hh}(L_e+\cdots))=\sum_{i=0}^\infty L_e\rho_{hh}^i=\frac{L_e}{1-\rho_{hh}}

这是诺伊曼级数 (Neumann Series),ρhh<1\rho_{hh}<1 保证收敛;第 ii 项就是散射 ii 次的光。本页用一个 60 次反弹的随机游走模拟(ρ=0.6\rho=0.6、Le=1L_e=1、20 万条路径)得到 2.501,理论值 2.5。只代入一次(LiL_i 换成 Ld(p,ωi)=Le(t(p,ωi),−ωi)L_d(p,\omega_i)=L_e(t(p,\omega_i),-\omega_i))就是只算直接光照。

面积形式 / 三点形式(13.1.3)

把 t(p,ω)t(p,\omega) 的几何关系显式写进被积函数:记 L(p′→p)L(p'\to p) 为 p′p' 射向 pp 的辐亮度,f(p′′→p′→p)f(p''\to p'\to p) 为 三点形式 BSDF,把立体角换成面积(雅可比 ∣cos⁡θ′∣/r2|\cos\theta'|/r^2,见 辐射度量学与光度学 的 PBRT 小节),与原有的 ∣cos⁡θ∣|\cos\theta| 和二值可见性 VV 合成几何耦合项

G(p↔p′)=V(p↔p′)∣cos⁡θ∣ ∣cos⁡θ′∣∥p−p′∥2(式 13.2)G(p\leftrightarrow p')=V(p\leftrightarrow p')\frac{|\cos\theta|\,|\cos\theta'|}{\|p-p'\|^2}\quad(\text{式 13.2})

L(p′→p)=Le(p′→p)+∫Af(p′′→p′→p) L(p′′→p′) G(p′′↔p′) dA(p′′)(式 13.3)L(p'\to p)=L_e(p'\to p)+\int_A f(p''\to p'\to p)\,L(p''\to p')\,G(p''\leftrightarrow p')\,dA(p'')\quad(\text{式 13.3})

两种形式等价,但对应两种蒙特卡洛做法:式 13.1 采样方向再投射光线;式 13.3 在表面上按面积采样点,再追踪光线判断 VV。

路径积分形式(13.1.4)

把式 13.3 反复代入自身,得到按路径长度展开的和:

L(p1→p0)=∑n=1∞P(pˉn),P(pˉn)=∫A ⁣⋯ ⁣∫A⏟n−1Le(pn→pn−1) T(pˉn) dA(p2)⋯dA(pn)L(p_1\to p_0)=\sum_{n=1}^\infty P(\bar p_n),\qquad P(\bar p_n)=\underbrace{\int_A\!\cdots\!\int_A}_{n-1}L_e(p_n\to p_{n-1})\,T(\bar p_n)\,dA(p_2)\cdots dA(p_n)

路径 pˉn=p0,p1,…,pn\bar p_n=p_0,p_1,\dots,p_n 有 n+1n+1 个顶点,p0p_0 在胶片或镜头前片上,pnp_n 在光源上;路径通量 (throughput) T(pˉn)=∏i=1n−1f(pi+1→pi→pi−1) G(pi+1↔pi)T(\bar p_n)=\prod_{i=1}^{n-1}f(p_{i+1}\to p_i\to p_{i-1})\,G(p_{i+1}\leftrightarrow p_i)(式 13.6),即光源辐亮度经各次散射后到达相机的比例。估计时只需按某个密度采样路径并计算 P(pˉn)/p(pˉn)P(\bar p_n)/p(\bar p_n);路径从相机、从光源、从两端还是从中间生成,只影响 p(pˉn)p(\bar p_n) 怎么算。这种"测量值 = 路径空间上的显式积分"的写法比式 13.1 的递归定义更自由,是双向方法的基础。路径长度的记法与 Heckbert 表示法(上文)对应:n=1n=1 是直接看到光源(LE),n=2n=2 是直接光照(LDE 或 LSE)。

被积函数中的 δ 分布(13.1.5)

点光源、方向光以及完美镜面 BSDF 在被积函数里引入 δ 分布。随机方向永远打不到点光源,必须显式选指向光源的方向;但它也把对应的积分降成直接求值:例如单个点光源时 P(pˉ2)=δ(plight−p2)Le(plight→p1)p(plight)f GP(\bar p_2)=\frac{\delta(p_{\text{light}}-p_2)L_e(p_{\text{light}}\to p_1)}{p(p_{\text{light}})}f\,G,分子分母的 δ 抵消,无需蒙特卡洛。BSDF 中的每个 δ 分量也消掉一重面积积分。

拆分被积函数(13.1.6)

不同算法各擅长 LTE 的一部分(Whitted 光线追踪只处理 δ 镜面 BSDF,忽略漫反射与光泽面的多次散射)。为了"不漏也不重复",可以把 LTE 拆开:

  • 按路径长度:P(pˉ1)P(\bar p_1) 直接取自发光,P(pˉ2)P(\bar p_2) 用精确的直接光照,∑i≥3\sum_{i\ge3} 用快而粗的方法;后者必须忽略前两项。
  • 按光源:Le=Le,s+Le,lL_e=L_{e,s}+L_{e,l}(小光源/大光源)分别估计,每个光源只能归入一类。
  • 按 BSDF 分量:f=fΔ+f¬Δf=f_\Delta+f_{\neg\Delta};由于路径上有 n−1n-1 个 BSDF 因子,像 fΔf¬Δf¬Δf_\Delta f_{\neg\Delta}f_{\neg\Delta} 这样的混合项都要计入。pbrt 的 BxDFFlags 分类(9.1.2)正是为此。 游戏中的对应:烘焙光照贴图存间接光、运行时算直接光,就是按路径长度拆分;拆分时最常见的 bug 正是重复计算或漏算某一类路径(如自发光面既进了光照贴图又被当作动态光源)。

PBRT 的视角:传输方程是更一般的形式(PBRT 4e 14.1)

有参与介质时,光传输方程推广为传输方程(体积光传输方程):沿光线的亮度 = 表面出射亮度 × 透射率 + 沿途各点源函数(介质发射 + 内散射)× 透射率的积分(式 14.2)。真空中透射率恒为 1、源函数为 0,就退化为本页的表面形式。路径积分形式也随之推广:顶点可以在表面、介质内的真实散射点或零散射点,几何项中介质端的余弦取 1。详见 参与介质与体积散射 的「PBRT 的视角:体积光传输与体积路径追踪」。

  1. realtime_rendering_4ed.pdf 第 11 章 Global Illumination
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.1、12.2.1.1、12.3、12.6.1 节
  4. PBRT 4e source excerpt: chapter 13 (Light Transport I Surface Reflection)
  5. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 13 章 13.1 节,pbr-book.org/4ed/Light_Transport_I_Surface_Reflection
  6. PBRT 4e source excerpt: chapter 14 (Light Transport II Volume Rendering)
  7. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 14 章 14.1 节,pbr-book.org/4ed/Light_Transport_II_Volume_Rendering

相关页面

图形学辐射度量学与光度学Radiometry & Photometry辐射度量学精确度量电磁辐射,是基于物理渲染的第一步;光度学用人眼灵敏度对它加权。渲染中最重要的量是辐射亮度 L:眼睛和相机测的就是它,着色方程要算的也是沿视线的辐射亮度。图形学双向反射分布函数BRDFBRDF f(\mathbf{l},\mathbf{v}) 量化局部反射:只依赖入射方向 \mathbf{l} 和出射(观察)方向 \mathbf{v},涵盖表面反射与局部次表面散射。它通过反射方程把入射辐射亮度转换为出射辐射亮度,物理上需满足 Helmholtz 互易性与能量守恒,用方向反照率检验。方向光和精确光源可从小面光源的极限推导,使积分变为对光源的求和。本页对应 RTR4 9.3–9.4 节。图形学环境光遮蔽Ambient Occlusion环境光遮蔽 (AO) 是余弦加权后半球上未被遮挡的比例,用来在光照缺乏方向变化时仍给出形状线索(缝隙变暗)。它由 Landis 在 ILM 为《珍珠港》开发,可离线烘焙,也可在物体空间或屏幕空间动态计算(SSAO、HBAO、GTAO 等)。AO 适合漫反射和平滑环境光,不适合点光源或小面光源的可见性(RTR4 11.3 节)。图形学方向遮蔽Directional Occlusion方向遮蔽用比单个 AO 标量更有表现力的方式记录"哪些方向被挡住",例如地平线角、可见性锥(环境孔径)、球面有向距离或球谐。它主要用于面光源和环境光照的软遮蔽,以及凹凸细节自阴影、超大地形等阴影贴图分辨率不够的场合;对点光源,专门的阴影技术质量更好(RTR4 11.4 节)。图形学预计算光照与光照贴图Precomputed Lighting & Light Maps烘焙 (baking) 是把辐射度或路径追踪等离线 GI 结果预先算好存起来,运行时直接查询。静态几何参与预计算并完整交互,动态物体只作接收者。数据可以是辐照度,也可以带方向(SH、H 基、AHD、球面高斯、环境立方体等),存储在光照贴图、顶点或体积/探针中,各有接缝、漏光、内存等取舍(RTR4 11.5.1、11.5.2、11.5.4 节)。图形学预计算辐射传输Precomputed Radiance Transfer预计算传输 (PRT) 假设几何不变、只有光照变化,预先计算"输入光照 → 场景辐射亮度分布"的传输函数,运行时注入直接光再应用传输。它依赖光传输的线性性:各"基础光源"的单位响应按当前强度加权求和即得完整反弹光照。变体包括 Sloan 的 SH 环境光 PRT、点光源簇 PRT,以及 Enlighten 一类的表面间传输(RTR4 11.5.3 节)。图形学动态漫反射全局光照Dynamic Diffuse Global Illumination烘焙动辄数小时,拖慢美术迭代,几何在运行时变化或由用户创建时甚至无法预计算。动态漫反射 GI 方法无需预处理或预处理快到每帧可做,主要有:基于虚拟点光源的反射阴影贴图 (RSM)、光传播体积 (LPV)、体素锥追踪 (VXGI) 以及屏幕空间补充(RTR4 11.5.5–11.5.9 节)。图形学局部反射探针Localized Reflection Probes镜面全局光照需要高角分辨率但只关心反射方向附近的小立体角。实时中最流行的方案是在场景中稀疏放置局部环境贴图(反射探针),配合反射代理体做视差校正;它实现简单、快、美术可控,但有拉伸和漏光问题。另有体素锥追踪和平面反射等替代方案(RTR4 11.6–11.6.4 节)。图形学屏幕空间反射Screen-Space Reflections屏幕空间反射 (SSR) 沿反射方向在深度缓冲中步进求交,命中后从颜色缓冲读取入射辐射亮度。由于镜面瓣窄、只需反射方向附近的光,屏幕数据比漫反射情况更可能包含所需信息。它最早由 Sousa 等提出,常作为镜面 GI 的第一层,失败时退回反射探针和全局探针(RTR4 11.6.5 节)。游戏数学光线求交测试Ray Intersection Tests光线求交用于拾取、光线追踪、地面高度查询等。本页给出四类经典测试:光线-球(代数解与带早期拒绝的几何优化解)、光线-盒(平板法与光线斜率法)、光线-三角形(Möller-Trumbore,直接从顶点求重心坐标与距离)、光线-多边形(先求平面交点,再投影到二维做交叉数测试)。共同思路是先做便宜的拒绝测试、推迟除法与开方、必要时降维。游戏开发 · UE5Lumen 全局光照与反射Lumen Global Illumination & ReflectionsLumen 是 UE5 默认的全动态全局光照 (Global Illumination, GI) 与反射系统:先做屏幕空间追踪,未命中再对"Lumen 场景"做软件光追(有符号距离场)或硬件光追,命中点的光照从按网格离线放置的卡片 (Card) 构成的表面缓存 (Surface Cache) 中查询,表面缓存的直接与间接光照分摊到多帧更新,从而得到无限次漫反射弹射和全粗糙度范围的反射。游戏开发 · UE5硬件光线追踪与路径追踪器Hardware Ray Tracing & Path TracerUE5 的硬件光线追踪 (HWRT) 大部分功能都集成在 Lumen 里;也有光追阴影等独立功能。Lumen 在显卡、RHI 和操作系统支持时使用 HWRT,否则回退到软件光追;反射光线可以用表面缓存(快)或命中点光照(质量高)来着色;实例超过 10 万时,HWRT 的场景更新开销很大。路径追踪器 (Path Tracer) 是渐进式、硬件加速的无偏渲染模式,用作 ground truth 参考和影视级最终输出,与 Sequencer/Movie Render Queue 集成。图形学图形栈与渲染引擎架构Graphics Stack & Rendering Engine Architecture渲染引擎要解决的"渲染问题"是:给定由场景元素、虚拟光源和虚拟相机组成的虚拟世界,生成相机看到的二维彩色图像。GEA 把它拆成可见性问题和光照问题,按解法把引擎分为光线追踪、深度缓冲光栅化、辐射度和混合四类;光栅化引擎通常采用立即模式的两层结构:下层是图形管线,上层是负责剔除、提交几何和设置着色器参数的应用层。本页讲这套整体架构,管线内部见 渲染管线。图形学硬件光线追踪管线Hardware Ray Tracing Pipeline高端 GPU 提供硬件加速的光线追踪,它像 GPU 中独立于光栅管线和计算管线的另一条管线,但能与它们协调同步。场景几何要先组织成两层加速结构(TLAS 实例层与 BLAS 几何层),光线发射后由 any-hit、closest-hit、miss 等着色器处理结果。由于还不够快,GPU 光追通常与光栅化结合成混合渲染:先光栅化 G-buffer,再对镜面、反射和间接光发射光线。图形学着色方程与经典光照模型Shading Equation & Classic Lighting ModelsGEA 把渲染方程在两条简化假设下化成的求和式称为着色方程:只有理想化的点光源和方向光,间接光只用一个环境光项粗略近似。配上 Lambert、Phong、Blinn-Phong 这类简单 BRDF,它给不出照片级真实感,但能产生可信的画面,是早期游戏的全部光照,也是理解 BRDF 用法的最好入门(GEA4 卷 II 12.4、12.5.1)。图形学蒙特卡洛积分与重要性采样Monte Carlo Integration & Importance Sampling渲染方程里的半球积分没有闭式解,只能数值积分。蒙特卡洛积分在定义域里随机取样、按概率密度加权求平均,期望值正好等于积分真值,误差随样本数 N 按 1/\sqrt{N} 下降,而且与积分维数无关,所以成了光线追踪类渲染的数学基础。降低误差的主要手段是让采样分布接近被积函数的形状,也就是重要性采样(GEA4 卷 II 12.6.2、12.6.4)。图形学随机光线追踪与路径追踪Stochastic Ray Tracing & Path Tracing光线追踪用投射光线同时解决可见性问题和光照问题。GEA 从最简单的"眼睛光线 + 着色方程"讲起,逐步加入阴影光线、透射光线、用蒙特卡洛估计渲染方程的随机光线追踪、递归间接光照,再到每次只走一条路径的路径追踪、双向路径追踪和 Metropolis 光传输,最后讨论降噪与光线投射效率(GEA4 卷 II 12.6.3–12.6.5)。游戏开发三维音频渲染3D Audio Rendering3D 音频渲染引擎要尽可能可信地重现"玩家若真在游戏世界里会听到什么"。它的输入是世界里大量的 3D 声音,输出是少数几路扬声器声道;主要任务是合成、空间化(距离衰减 + 声像定位)、声学建模(混响、遮挡、衍射)、多普勒和混音。GEA 给出了恒功率声像律、聚焦角、混响区域交叉混合、遮挡/阻挡/排除的分析方法,以及顽皮狗《最后生还者》的随机传播建模和声音门户(GEA4 卷 II 15.4)。图形学显示编码与 sRGBDisplay Encoding & sRGB光照、纹理等计算假设数值是线性的,但显示缓冲和纹理使用非线性编码。简短的回答是:着色器输出 [0,1] 的颜色要取 1/2.2 次幂(gamma 校正),读入的纹理和颜色做相反的变换,多数情况下可以让 GPU 自动完成。忽略它会导致画面偏暗、色相偏移、光照叠加错误和抗锯齿边缘"绳索化"。图形学参与介质与体积散射Participating Media & Volumetric Scattering参与介质是充满粒子、通过吸收和散射参与光传输的体积,如空气、水、雾、烟、云;皮肤、蜡等致密材质也有强烈散射——"一切都是散射"。实时渲染主要考虑单次散射:沿视线积分透射率衰减后的内散射光,内散射由相位函数和对光源的可见性(不透明阴影 × 体积阴影)决定。通用实时方案把介质材质和散射结果体素化到相机视锥体素 (froxel) 中逐片累积(RTR4 14.1、14.3、14.8 节)。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原