中EN
概念页

多光源采样与光源 BVH

Many-Light Sampling & Light BVH

场景有成百上千个光源时,不可能在每个着色点对所有光源做直接光照。利用求和的蒙特卡洛估计 ∑ifi≈fj/p(j)\sum_i f_i\approx f_j/p(j),每次只随机选一个(或几个)光源并除以其概率即可无偏。选择概率可以均匀、按功率,或随着色点变化——后者需要一棵把光源聚合起来的层次结构(光源 BVH)。本页对应 PBRT 4e 12.6 节,并对照实时渲染的分簇/分块光源剔除。

离散蒙特卡洛估计

∑i=1nfi≈fjp(j),j∼p,fj≠0⇒p(j)>0(12.2)\sum_{i=1}^{n}f_i\approx\frac{f_j}{p(j)},\qquad j\sim p,\quad f_j\ne0\Rightarrow p(j)>0\quad(12.2) 这是积分蒙特卡洛估计的离散版本(见 蒙特卡洛积分与重要性采样)。理想的 pp 随位置、法线、BSDF 变化:背向或被遮挡的光源概率应为 0,又远又暗的光源概率应低,但小而暗的光源对紧邻它的点仍很重要。光源采样器还要提供 PMF(),供 BSDF 采样碰到光源时计算 MIS 权重;以及与着色点无关的采样,供双向方法从光源出发。

三种采样器

采样器概率效果(书中数据)
UniformLightSampler1/n1/n基线
PowerLightSampler∝Φ\propto\Phi(别名表 alias table;哈希表从光源映射到下标以求 PMF)Zero Day 场景(8,878 个光源,16 spp)MSE 比均匀低 12.4 倍
BVHLightSampler(默认)沿树按子节点重要性逐层随机选择比按功率 MSE 再低 2.37 倍,时间只多 5.8%,效率提高 2.25 倍;两个光源的简单场景 1 spp 也有 2.72 倍改善

按功率采样的缺陷:一个辐射亮度很低的巨大三角形光源,面积越大功率越大,但对任何一点最多只张满一个半球,按功率会给它过多样本。光谱尖峰(如荧光灯)可能让功率被低估,作者说实践中没遇到问题。

光源包围 LightBounds

对每个非无穷远光源记录:空间包围盒、功率 ϕ\phi、主法线方向 ω\omega、法线偏离角 θo\theta_o、在 θo\theta_o 之外仍可发光的附加角 θe\theta_e、是否双面。与 ω\omega 夹角超过 θo+θe\theta_o+\theta_e 的方向肯定收不到光。

  • 点光源:θo=π\theta_o=\pi,ω\omega 任意;聚光灯:ω\omega 为朝向,θo\theta_o 为内锥、θe\theta_e 为衰减带宽度;面光源:ω,θo\omega,\theta_o 来自 Shape::NormalBounds(),θe=π/2\theta_e=\pi/2。
  • 两个细节:聚光灯的 ϕ\phi 按各向同性点光源算(4πI4\pi I),不乘锥角,因为锥已经在重要性函数里计入——否则同样强度的窄锥灯会被少采样;双面面光源的 ϕ\phi 不乘 2,因为双面也已在重要性里计入(书中图 12.29:去掉这个多余的 2 后 MSE 改善 1.42 倍)。
  • 合并两个包围:任一方功率为 0 则直接返回另一方;方向锥取并集,θe\theta_e 取较大者(存余弦所以取较小的余弦)。
  • 存储:LightBounds 52 字节;CompactLightBounds 24 字节:八面体编码单位向量 4 字节(见 球面几何与方向参数化),两个余弦各量化为 15 位并与双面标志打包成 4 字节,包围盒每坐标 16 位共 12 字节,ϕ\phi 不压缩。量化都取保守方向:余弦向下取整(角度变大),包围盒下界向下、上界向上取整。

重要性函数

给定着色点 pp(介质中法线为 0):

  1. 距离:取包围盒中心的距离平方,但不小于包围盒对角线长度的某个比例,避免点在盒内时 1/r21/r^2 趋于无穷、两个子节点无法比较;
  2. 角度:θw\theta_w 为 ω\omega 与"盒中心→pp"的夹角,θb\theta_b 为盒子相对 pp 的张角,发光端的最小角 θ′=max⁡(0,θw−θo−θb)\theta'=\max(0,\theta_w-\theta_o-\theta_b);若 θ′≥θe\theta'\ge\theta_e,重要性为 0;
  3. 重要性 =ϕcos⁡θ′/d2=\phi\cos\theta'/d^2,表面上再乘入射余弦的保守上界 cos⁡max⁡(0,θi−θb)\cos\max(0,\theta_i-\theta_b)。 cos⁡(max⁡(0,θa−θb))\cos(\max(0,\theta_a-\theta_b)) 不调用三角函数:若 cos⁡θa>cos⁡θb\cos\theta_a>\cos\theta_b 返回 1,否则用 cos⁡θacos⁡θb+sin⁡θasin⁡θb\cos\theta_a\cos\theta_b+\sin\theta_a\sin\theta_b。这个重要性等于假设表面是漫反射的,不考虑 BSDF(练习 12.11;Liu 等 2019b 把 BSDF 纳入)。

构建与遍历

  • 构建沿用几何 BVH 的分桶 SAH 框架(见 空间数据结构),代价改为 ϕ⋅MΩ⋅Kr⋅表面积\phi\cdot M_\Omega\cdot K_r\cdot\text{表面积},其中方向测度 MΩ=2π(∫0θosin⁡θ′dθ′+∫θomin⁡(θo+θe,π)cos⁡(θ′−θo)sin⁡θ′dθ′),M_\Omega=2\pi\Big(\int_0^{\theta_o}\sin\theta'd\theta'+\int_{\theta_o}^{\min(\theta_o+\theta_e,\pi)}\cos(\theta'-\theta_o)\sin\theta'd\theta'\Big), KrK_r 惩罚细长包围盒。笔者对三组 (θo,θe)(\theta_o,\theta_e) 数值积分,与 pbrt 代码中的闭式完全一致。这里没有光线,表面积不再有几何概率的依据;作者认为体积更合理,但表面积实践中更好,因为它惩罚"两维很大、第三维很薄"的盒子,这类盒子张角大、重要性估计不确定。
  • 节点 LightBVHNode 28 字节,按 32 字节对齐,一条 64 字节 CPU 缓存行放 2 个、128 字节 GPU 缓存行放 4 个;第一个子节点紧跟父节点,只存第二个子节点的下标。
  • 采样:无穷远光源(含方向光)不进 BVH,"每个无穷远光源"与"整棵 BVH"等概率;进入 BVH 后在每个内部节点按两子节点重要性用 SampleDiscrete() 选一个,并把均匀样本重映射回 [0,1)[0,1) 继续使用。只走一条路径,不需要栈;叶子的概率是路径上概率的乘积。两个子节点重要性可能都为 0(越往下界越紧),此时不返回光源。
  • PMF:建树时为每个光源记录位轨迹 (bit trail)(Laine 2010),最低位表示根节点的选择;求 PMF 时按位确定性地走到叶子并累乘。

与实时渲染的对照与取舍

方面实时(分簇/分块着色,见 分簇着色)PBRT 光源 BVH
做法按屏幕/视锥体素确定性地列出影响范围内的光源,逐个累加随机选一个光源并除以概率
前提光源有有限影响半径(窗口函数截断)物理平方反比,不截断
结果无噪声,成本随每簇光源数线性增长无偏但有噪声,成本近似 O(log⁡n)O(\log n)
遮挡阴影贴图另算采样不考虑可见性;延伸阅读:ReSTIR(Bitterli 等 2020)时空重采样把可见性纳入,已用于实时光追

延伸阅读还列出:Ward 1991、Shirley 等 1996 的早期工作;Wald 等 2003 用低采样率预渲染统计光源贡献;Tokuyoshi–Harada 2016 随机光源剔除;Conty Estevez–Kulla 2018(pbrt 实现的直接来源,另有介质专用重要性和自适应分裂,pbrt 未实现);Iray 也用光源 BVH(Keller 等 2017);Vévoda 等 2018 贝叶斯回归、Guo 等 2020 体素间可见性缓存。

  1. PBRT 4e source excerpt: chapter 12 (Light Sources)
  2. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 12 章 12.6 节与延伸阅读,pbr-book.org/4ed/Light_Sources

相关页面

图形学着色模型与光源Shading Models & Light Sources着色模型描述物体颜色如何随表面朝向、观察方向和光照变化。光源通过两个参数与着色模型交互:指向光源的方向 \mathbf{l} 和光的颜色 \mathbf{c}{\text{light}}。方向光、点光源、聚光灯的区别就在于这两个量如何随场景变化;距离衰减和方向衰减函数的选择同时影响画面与性能。图形学面光源Area Lights真实光源从来不是点。面光源要求对光源所张立体角 \omegal 积分 BRDF,实时渲染倾向于用闭式解或近似而不是多条光线取平均。主要做法有:Lambert 表面的矢量辐照度与包裹光照、光泽表面的粗糙度修正和"最具代表性的点",以及最准确的线性变换余弦 (LTC)。图形学蒙特卡洛积分与重要性采样Monte Carlo Integration & Importance Sampling渲染方程里的半球积分没有闭式解,只能数值积分。蒙特卡洛积分在定义域里随机取样、按概率密度加权求平均,期望值正好等于积分真值,误差随样本数 N 按 1/\sqrt{N} 下降,而且与积分维数无关,所以成了光线追踪类渲染的数学基础。降低误差的主要手段是让采样分布接近被积函数的形状,也就是重要性采样(GEA4 卷 II 12.6.2、12.6.4)。图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。图形学分簇着色Clustered Shading分簇着色把整个视锥(而不只是屏幕平面)划分为三维单元——簇 (cluster),按簇建立光源列表。与依赖场景几何深度的分块着色不同,簇的划分与几何无关,可只由视图和光源计算,因此对相机位置的性能波动更小、对深度不连续更稳健,并为不透明、透明、体积物体提供统一的光照方案。它同样可配合前向或延迟着色,并衍生出 z-binning、光源树等更省内存的变体。本页还汇总了各类多光源方案的对比。图形学随机光线追踪与路径追踪Stochastic Ray Tracing & Path Tracing光线追踪用投射光线同时解决可见性问题和光照问题。GEA 从最简单的"眼睛光线 + 着色方程"讲起,逐步加入阴影光线、透射光线、用蒙特卡洛估计渲染方程的随机光线追踪、递归间接光照,再到每次只走一条路径的路径追踪、双向路径追踪和 Metropolis 光传输,最后讨论降噪与光线投射效率(GEA4 卷 II 12.6.3–12.6.5)。图形学基于图像的光照Image-Based Lighting用纹理数据(通常是相机拍摄的 360° HDR 全景)照明场景称为基于图像的光照。实时引擎常用预滤波的高光立方体贴图(配合 split-sum 近似)处理高光,用辐照度环境贴图或球谐系数处理漫反射。它们只依赖少量光照图元而不需要知道场景其他表面,因此仍属局部光照。游戏数学球面几何与方向参数化Spherical Geometry & Direction Parameterizations渲染中大量计算发生在单位球面上:方向就是球面上的点,一组方向就是球面上的一块区域。本页按 PBRT 4e 3.8 节整理立体角、球面多边形面积、三种球面参数化(球坐标、八面体编码、等面积映射)以及用于剔除光源的方向锥,并附原书一处公式问题。游戏数学别名法与水塘采样Alias Method & Reservoir Sampling从 n 个离散结果中按概率 pi 采样,线性扫描 CDF 每次 O(n),二分查找 O(\log n);别名法 (alias method) 预处理 O(n) 后每次采样 O(1):均匀选一个桶,再以桶内概率 qi 决定取桶本身的结果还是它唯一的"别名"。水塘采样 (reservoir sampling) 则不需要预先知道结果个数、也不需要把所有候选存在内存里:候选逐个流过,每个以"自身权重 / 已见权重和"的概率替换水塘中的样本,最终保留的样本恰好服从全部候选的分布;两个水塘还可以无偏地合并。前者用于按功率选光源、环境贴图采样等,后者是 ReSTIR 等方法的基础。

输入关键词开始搜索

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