参与介质与体积散射
Participating Media & Volumetric Scattering
参与介质是充满粒子、通过吸收和散射参与光传输的体积,如空气、水、雾、烟、云;皮肤、蜡等致密材质也有强烈散射——"一切都是散射"。实时渲染主要考虑单次散射:沿视线积分透射率衰减后的内散射光,内散射由相位函数和对光源的可见性(不透明阴影 × 体积阴影)决定。通用实时方案把介质材质和散射结果体素化到相机视锥体素 (froxel) 中逐片累积(RTR4 14.1、14.3、14.8 节)。
介质材质
| 符号 | 含义 | 单位 |
|---|---|---|
| 吸收系数 | m⁻¹ | |
| 散射系数 | m⁻¹ | |
| 消光系数 | m⁻¹ | |
| 反照率,[0,1] | 无 | |
| 相位函数 | sr⁻¹ |
- 四类事件改变沿光线的辐射亮度:吸收(转为热)、外散射(按相位函数弹走)、发射(如火的黑体辐射)、内散射(其他方向的光散射进当前路径)。加入光子靠内散射与发射,移除靠消光。各系数是辐射亮度导数的系数,取值 。
- 反照率接近 0:多被吸收,介质浑浊(如黑色尾气);接近 1:多被散射,介质明亮(空气、云、大气)。牛奶散射高、反照率 > 0.999,显得白而不透明;红酒几乎不散射而吸收高,显得透明有色。
- 都与波长有关;实时(以及大多数离线)用 RGB,尽量由光谱数据经颜色匹配函数预计算。
单次散射积分
没有介质时可假设进入相机的亮度等于最近表面出射亮度;有介质时(点光源情况):
透射率(Beer-Lambert 定律):
光学深度 约去掉 60% 的光。例: 时穿过 1 m 得 。透射率要作用于 (i) 不透明表面亮度(雾状遮挡),(ii) 内散射光(体现介质厚度),(iii) 每个散射点到光源的路径(体积自阴影)。
内散射( 个点光源):
可见性 ,体积阴影项就是到光源的透射率。
- 光线步进:沿主光线用 个样本积分散射和透射,并从每个样本向各光源再步进一条阴影光线,复杂度 ,很快变贵;因此常用专门的体积阴影表示存储光源出射方向的透射率。
- 直觉:、 时,薄处内散射主导、显蓝色;越深透射率指数下降比散射线性增长快,红色(消光最小)占优。这正是天空白天蓝、日出日落红的原因。
相位函数
在单位球上积分必须为 1(能量守恒)。由相对粒径 区分: 瑞利散射(空气), 米氏散射, 几何散射。
| 相位函数 | 公式 | 说明 |
|---|---|---|
| 各向同性 | 理想但不真实 | |
| 瑞利 | 前后对称两瓣;,RGB 归一化到亮度 1 为 | |
| Henyey-Greenstein | 拟合米氏的主瓣; 后向、 各向同性、 前向,;雾中聚光灯光晕、云边银边 | |
| Schlick 近似 | , | 只有平方,更快; 恒定时 只需算一次;能量守恒的优秀近似 |
- 米氏散射与波长无关,单一粒径时有尖锐复杂的瓣,但介质粒径连续分布,平均后很平滑,所以可用平滑函数。可混合多个 HG/Schlick 同时表现强前向与后向瓣(如云)。
- 几何散射:粒子内折射反射,可能需要复杂相位函数,偏振也有影响;彩虹即水滴内反射在约 3° 的后向散射角内色散。可用 MiePlot 模拟。
体数据可视化
CT、MRI 等标量场(如 256³ 体素):实体可转为隐式表面多边形;半透明可用垂直视线的等距切片从后往前混合,密度超阈值视为实体,法线取密度梯度。传递函数:一维纹理把密度映射为颜色和不透明度;Kniss 等用以密度和梯度长度 为索引的二维传递函数,更好地区分材质过渡(如骨-空气与骨-软组织)。半角切片:切片朝向光与视线的中间方向,每片可用上一片的光源方向遮挡做体积阴影、用辐射亮度估计锥内前向多次散射,质量高,但每片都有光栅化带宽成本;着色器光线步进只付一次。
实时参与介质渲染
- 单光源大尺度阴影散射:Yusov 沿极线采样内散射,用光源深度图判断阴影,沿光线的 min/max 层次跳过空区,只在深度不连续处步进;也可在视空间渲染由光源深度图生成的网格,加正面、减背面的散射。都快且可高分辨率,但只支持均匀介质,不能表现介质自阴影或粒子的透明阴影。
- 溅射:Crane 等对流体模拟的烟、火逐像素步进收集颜色和遮挡,水在第一次击中表面时停止、法线取密度梯度、三立方插值平滑。Valient(《杀戮地带:暗影坠落》)把各光源的散射包围体渲染到半分辨率缓冲,步进起点逐像素随机偏移以消除条带,每帧换噪声并经重投影平均掉;非均匀介质把粒子体素化到 1/8 分辨率的视锥三维纹理;用双边高斯模糊 + 双边上采样合成到全分辨率。改用蓝噪声分布更均匀;也可四个随机样本上采样再交给 TAA。溅射细节锐利,但与其他透明表面的排序永远不完全正确,带宽也更高。
- 视锥体素 (froxel):Wronski 把散射体素化到映射在裁剪空间的三维纹理 (典型 x、y 为屏幕的 1/8,z 方向 64 片),存内散射 RGB 与 ;再从近到远逐片累积得到 。原式只用前面片的透射率 衰减本片内散射,忽略了本片内的消光。Hillaire 给出常数消光下的解析积分:本片贡献为 ,,透射率累乘为 。不透明表面最终 。 粗糙,相机运动和高频亮光/阴影会混叠,用指数滑动平均与上一帧重投影结果混合。
- Hillaire 的物理材质:、、、发射 存入视锥材质体积 (相当于体积版 G-buffer);美术放置的介质体积(带三维密度纹理)用计算着色器体素化进去。只考虑单次散射也接近路径追踪结果。虚幻引擎用粒子(球体)作为介质来源;材质体积也可用稀疏结构。缺点是分辨率低。
- 间接光:虚幻可烘焙体积光照贴图(存辐照度)让其散射回介质;也可用 LPV 实现动态 GI。
- 体积阴影:没有它,浓雾场景会太亮太平。Hillaire 把介质体积和粒子体素化到围绕相机、按 clipmap 分布的三级消光体积,作为统一数据源配合不透明度阴影贴图,使粒子与介质互相投影、自阴影,并给不透明和透明物体投影。高分辨率体积纹理受限时可用傅里叶或 DCT 等正交基表示透射率。
统一表示的展望
用很高的 配合复杂各向异性相位函数可以得到不透明表面,因此有望统一实体和体积材质。目前因 GPU 算力只能分开处理(不透明网格、alpha 混合网格、粒子公告板、光线步进)。Dupuy 等暗示可用 SGGX(GGX 的对称扩展)的微薄片 (microflake) 理论表示体积中有朝向的薄片粒子;LOD 变成对材质属性做体积过滤,例如用体积过滤的树表示森林,可消除网格 LOD 切换、平滑过滤细枝、避免混叠,并给出正确的背景遮挡。
GEA 的视角:参与介质与光线步进(卷 II 12.1.2.2、12.2.1、12.5.13)
- 不完全透明的介质会影响穿过它的光,所以叫参与介质。它们常是不同分子的混合物,例如烟就是空气加上悬浮的灰烬和煤烟颗粒;光子穿过时很可能被颗粒吸收、折射或反射,所以参与介质会散射并衰减光(卷 II 12.1.2.2)。
- GEA 把透光材质分为透明(空气、玻璃、清澈平静的水)与半透明(磨砂玻璃、蜡、皮肤、雾、烟)(卷 II 12.1.2)。
- 光穿过参与介质时能量和光谱分布沿路径变化,需要更复杂的计算;GEA 说明这超出本书范围,推荐 RTR4(卷 II 12.2.1)。在 GEA 的着色方程用法里,通常假设空间是真空或洁净空气,烟雾等用 alpha 混合和粒子卡片近似(卷 II 12.5.1)。
- 实时体积渲染靠光线步进,用于天空大气和体积云;吸收、外散射、内散射、消光、透射率和相位函数等概念 GEA 在大气部分给出,见 天空与云渲染 的「GEA 的视角」(卷 II 12.5.13)。这些与本页「介质材质」「相位函数」中的 RTR4 定义一致。
PBRT 的视角:离线渲染器中的体积散射(PBRT 4e 第 11 章)
基本过程与源函数(11.1)
- 吸收、发射、散射都按连续过程建模(与辐射度量学的假设一致);蒙特卡洛求解时落到具体点上,称为"散射事件"(也包括吸收)。所有模型都假设粒子位置不相关(白噪声分布),真实介质并不满足,相关介质见延伸阅读。
- 介质吸收系数 与导体复折射率里的吸收系数(9.3.6)是两回事;单位 m⁻¹,可以大于 1。pbrt 只让系数随位置变化,不随方向。
- 发射写成 (式 11.1): 因子来自"吸收越强、发射越强"(基尔霍夫,见 4.4.1),也让积分后的量纲是辐射亮度。PBRT 这里的 是单位辐射亮度,与 RTR4 直接把发射作为加项的写法差一个 因子,迁移参数时要注意。
- 平均自由程 ;单次散射反照率 。
- 源函数(式 11.3):,。它与散射方程相似,但没有余弦项,因为相位函数作用于辐射亮度而不是微分辐照度。
- "真实散射"(吸收之外的内/外散射)与 11.2.1 的"零散射"相对;透射率的无偏估计见 零散射与透射率估计。
透射率性质(11.2)
;真空中为 1; 方向对称时 ;任何介质中都满足乘性 ,所以可以沿光线逐段累乘。负指数即光学厚度 ;均匀介质为 Beer 定律 。阴影光线计入透射率后,纯体积物体也能在地面投下阴影(书中图 11.10)。
相位函数与方向约定(11.3)
- 自然介质的相位函数多是夹角的一维函数 ("各向同性/对称介质"),并满足互易;晶体、定向纤维等有序结构是 4D 函数。术语重载:"各向同性介质"可以有"各向异性相位函数";各向同性相位函数只有一个:。
- 方向约定:pbrt 的 、 都背离散射点(与 BSDF 相同),散射文献中入射方向指向散射点。因此 pbrt 的 HG 写作 分母是 ;上文 RTR4 的写法是 。两者不矛盾,只是 的定义差了 :(前向散射)时 pbrt 中 , 处取峰值。混用两套代码时最常见的错误就是 的符号反了。
- 是平均余弦 ;同一个 可对应无数相位函数,复杂分布可用权重和为 1 的多个 HG 加权和(pbrt 未实现)。pbrt 要求 ,上文 RTR4 写的是 ( 时 HG 退化为 delta)。
- 精确采样: 均匀,, 时 ;PDF 等于相位函数值。笔者对 采 200 万样本,经验 CDF 与解析 CDF 在 4 个检查点上相差 ,数值积分得归一化 1、平均余弦 0.7。
- 延伸阅读:Gkioulekas 等 2013a 用 HG 与 von Mises–Fisher 瓣的和描述半透明外观;van de Hulst 1981 有米氏与瑞利散射的完整讨论。
介质在场景中的表示(11.4)
- 相机和光源各存一个
Medium(nullptr为真空);图元存MediumInterface(内、外两个介质)。只有真正的介质过渡才写入交点,否则沿用光线的介质,所以"充满薄雾的场景"只要给相机和光源指定介质即可。不一致的配置(例如相机与图元外侧介质不同又没有界面)不做检查,交给用户保证。 - 只用来界定介质范围、本身不可见的边界(如包住云的盒子)用空材质 (
nullptr),GetBSDF()返回未设置的 BSDF,积分器只切换当前介质;理论上也可以用两侧折射率相同的完美镜面透射 BTDF,但会加重积分器负担。书中图 11.16:同样的介质,带电介质外壳的版本更暗。 Medium接口三个方法:IsEmissive()(仅用于检查场景是否有光源)、SamplePoint()(返回 与相位函数,默认值表示无散射)、SampleRay()(返回 majorant 迭代器)。各介质用MajorantIterator类型别名声明自己的迭代器,让调用方把它放在栈上(便于放进寄存器,见第 14、15 章);类型未知时借TaggedPointer分派和ScratchBuffer分配。- 五种实现:
HomogeneousMedium、GridMedium、RGBGridMedium(书中讲解),CloudMedium(仅在线版),NanoVDBMedium(不讲第三方 API)。- Homogeneous:常数系数与 ;光谱转成
DenselySampledSpectrum(每个约 1 KB,换取无需二分查找);单段 majorant 。 - Grid:密度网格三线性插值后缩放基准 ;发射可以是黑体温度网格或单一光谱,再乘
LeScale网格;majorant 用MajorantGrid+ DDA。 - RGBGrid:网格里存
RGBUnboundedSpectrum而不是 RGB。原因:RGB→光谱(4.6.6)不保证光谱值不超过 RGB 分量最大值,而且两个 RGB 线性插值后的光谱也不是两条光谱的线性插值,所以按 RGB 求的上界不是光谱的上界;存光谱再插值光谱才能保证 majorant 有效。 与 的界分别求,若二者相关(如 )则界偏松。sigmaScale可整体调密度。
- Homogeneous:常数系数与 ;光谱转成
与上文(RTR4、GEA)的对照与分歧
| 话题 | RTR4 / GEA(上文) | PBRT 4e |
|---|---|---|
| 目标 | 单次散射为主,多次散射近似 | 完整的多次散射(第 14 章),本章只给介质描述与透射率 |
| 透射率求法 | 光线步进黎曼和、froxel 逐片解析积分(有偏) | 零散射 + 比率追踪(无偏);书中明确说估计 τ 再取指数有偏 |
| HG 分母 | (散射文献约定) | (两方向都背离散射点) |
| 范围 | ||
| 体积发射 | 加项 | |
| 颜色 | RGB | 光谱;RGB 介质要专门处理 majorant |
| 存储 | froxel、clipmap 消光体积 | 规则网格(+ majorant 网格)、NanoVDB;延伸阅读:VDB(Museth 2013)、Field3D |
| 运动模糊 | — | 延伸阅读:网格顶点变形(Clinton–Elendt 2009)、欧拉运动模糊(Kulla–Fajardo 2012)、时变函数(Wrenninge 2016) |
| 重建滤波 | — | 书中承认三线性(三角滤波)插值密度不理想;见 Marschner–Lobb 1994;Hofmann 等 2021 的随机采样滤波在非线性(如透射率)下有偏 |
本章未涉及与延伸
本章不讲光照计算与多次散射,它们在第 14 章。介质参数获取见 Jensen 等 2001b、Narasimhan 等 2006(稀释法)、Gkioulekas 等 2013b、Frisvad 等 2020 综述;密度获取见 Atcheson 等 2008、Gu 等 2013a。
原书问题(第 11 章)
- 11.2 节称"估计光学厚度再取指数"会低估透射率,按 Jensen 不等式应为高估(数值验证见 零散射与透射率估计)。
- 11.4.2 节说每个
DenselySampledSpectrum约占"一千字节左右",12.1.2 节说覆盖可见光波段约 2 KB。按 pbrt 的 360–830 nm、1 nm 间隔计算为 471 个 float ≈ 1.9 KB,12.1.2 的数字正确,11.4.2 偏低(前后不一致)。 - 11.4.3 节在线版 DDA 的一处旁注文字损坏("…DDA.6.1.4 and carefully consider how the components of rayGrid are initialized."),引用的章节号与 HTML 标签混在一起(网页排版问题)。
- 11.4 节说 "The Medium interface is also defined in the file base/media.h"。pbrt-v4 源码中
Medium与PhaseFunction接口都在src/pbrt/base/medium.h(不存在base/media.h;media.h是不在 base 下的实现文件,见 GitHub mmp/pbrt-v4),应为 base/medium.h(11.3 节对相位函数的说法是对的)。 - 11.2.1 节推导 delta 追踪时说把俄罗斯轮盘的 termination probability 设为 ,但紧接着的式 (11.18) 是以概率 继续递归、否则返回 0;权重恰好抵消的也是继续概率。应为"继续(存活)概率",终止概率是 (措辞问题,公式正确)。
PBRT 的视角:体积光传输与体积路径追踪(PBRT 4e 14.1–14.2)
传输方程 (equation of transfer)
把第 11 章的四种过程合起来: 加上"光线在 处碰到表面 "的边界条件,得到积分形式 表面光传输方程(渲染方程)是它在真空中的特例。上文 RTR4 的单次散射积分就是把 (14.2) 的源函数 只保留"光源直接照射 × 相位函数"一项、并忽略介质发射得到的近似。
零散射形式与体积路径追踪
用 代入,得到 低估真实透射率,差额由 的第三项(零散射)补回。按 采样距离 :(概率恰为 )时取表面项 ,否则取 ;再以 与 之比为概率选一项——吸收返回发射并终止,真实散射按相位函数采样新方向并递归,零散射从原方向继续。这就是常说的"用 delta 追踪解传输方程"。分段 majorant 下的采样细节见 零散射与透射率估计。
- 关于网站 issue #27(读者问 (14.7) 的介质项为什么没有 ): 的联合密度是 ,它在 上积分正好是 ,所以"选介质项的概率 × 条件密度"直接等于 ,与被积函数的同名因子相消,只剩 ;书中的式子没有错,只是省略了这一步。
广义路径空间(14.1.4–14.1.5)
路径顶点可以是表面 、真实散射介质点 或零散射点 ,按配置向量 取并集,测度是各配置下面积/体积测度之和(零散射测度含 delta,限制在两个真实顶点的连线上)。广义吞吐量 ,其中 在表面为 BSDF、在介质中为 、在零散射点为 (Heaviside 保证零散射顶点沿直线有序); 只在真实顶点之间计算,介质端的"余弦"取 1;终点发射在介质中带 因子。把 delta 追踪的三种采样概率代入路径积分估计,所有 、、、 都相消,只剩"发射 × 相位函数与其采样 PDF 之比"(14.19)。这一框架(Miller 等 2019)让 MIS 和双向方法能用于非均匀介质。
两个积分器
SimpleVolPathIntegrator:不到 100 行,只用 delta 追踪,不直接采样光源、不支持散射表面(场景含 delta 光源或非零 BSDF 的表面时报错;面光源须配零值 BSDF,纯介质边界用SkipIntersection()跳过),只算第一个波长。适合当作调试复杂算法时的参考真值。书中图 14.6 爆炸场景 256 spp 仍有亮点噪声,VolPathIntegrator的 MSE 低 1,288 倍。VolPathIntegrator(pbrt 默认积分器,也是第 15 章波前积分器的模板)的三项改进:- 表面散射:按 (14.7) 在介质与表面之间选择;
- 有色介质 (chromatic media) 的光谱 MIS:距离和事件类型都按第一个波长 采样;若直接对其他波长求值,会出现可任意大的 因子。用单样本 MIS(平衡启发式)把估计改为 (14.20),书中图 14.7 MSE 降低 149 倍。若改用覆盖所有波长的 majorant,又会在低消光波长上产生大量零散射;
- 直接光照 MIS:两种技术——单向路径采样 (delta 追踪 + BSDF/相位函数采样)与光源路径采样 (光源选方向 + 阴影光线上比率追踪)。两者在最后一个真实顶点之前完全相同;零散射段概率 ,比率追踪段 。平衡启发式同时对两种技术和所有波长求和(14.25)。
- 数值稳定:不单独存 和 (镜面链或大量零散射会上溢/下溢),而存 与重缩放概率 、,MIS 权重为 。
- 细节:介质发射在每个采样点都累加(不只在选中吸收时),对应 ,再按波长做单样本 MIS;阴影光线遇到有材质的表面立即返回 0,遇到介质边界则继续;阴影光线上的俄罗斯轮盘只作用于透射率很低的光线,因为若以透射率为存活概率,比率追踪就退化成了 delta 追踪;
LayeredBxDF返回的 BSDF/PDF 只成比例正确,此时用BSDF::PDF()另估 PDF(pdfIsProportional)。
与上文(RTR4、实时)的对照
| 话题 | RTR4 / 实时 | PBRT 4e |
|---|---|---|
| 散射阶数 | 单次散射为主,多次散射用近似(Wrenninge 等 2013 的"逐次降低 与 "也被 PBRT 延伸阅读收录) | 任意阶,无偏 |
| 光源采样 | 每个步进点对光源做阴影查询(阴影贴图/体积阴影) | 光源采样 + 比率追踪透射率,与相位函数采样 MIS |
| 有色介质 | RGB 三通道独立 | 光谱点采样 + 单样本光谱 MIS |
| 体积发射 | 直接累加 | 随机游走碰到才计入,没有专门的发射采样(练习 14.4;Villemin–Hery 2013、Simon 等 2017) |
延伸阅读要点:Lommel 1889 首先推导传输方程,Khvolson 1890 独立得到;Kajiya–Von Herzen 1984 引入图形学;Rushmeier 1988 首次用蒙特卡洛解一般体积传输;Kulla–Fajardo 2012 针对介质内光源的采样(中子输运领域 Kalli–Cashwell 1977 已有);体积路径引导 Herholz 等 2019;乘积采样 Wrenninge–Villemin 2020、Villeneuve 等 2021;大气与天空模型 Preetham 等 1999、Hošek–Wilkie 2012/2013、Bruneton 2017 的 8 种晴空模型评测、Wilkie 等 2021(见 天空与云渲染);光子映射在介质中的推广 Jensen–Christensen 1998、光束辐射估计 Jarosz 等 2008b;非指数介质 Bitterli 等 2018b、d'Eon 2018、Jarabo 等 2018a;微薄片 Jakob 等 2010、SGGX(Heitz 等 2015,上文"统一表示的展望"中提到的就是它)。
原书问题(第 14 章)
- 式 (14.8) 与紧随其后的概率陈述(已解码网页 SVG 并数值验证):分段改写中第 2、3 项多乘了 ,第 3 项还缺 ;正确为 。正文说 " 的概率等于 ",应为 (概率无量纲,不能带 )。两处错误恰好互相抵消,所以"估计量化简为 "的结论和代码都正确。笔者用两段 majorant(,)数值积分:原积分 1.4815,正确改写 1.4815,书中写法 1.3191。
- 路径测度: 的求和范围应为 ,与上一行 的定义和被积式中 的分支一致(SVG 已核对)。
- 式 (14.7) 表面项写作 ,与 (14.3) 的 符号不一致,应为 。
- 式 (14.31)(14.3.1 一维传输方程)积分号内漏了 :应为 ,与 (14.2) 一致( 按 14.33 已除过 )。
LayeredBxDF取 ,所以实现不受影响(SVG 已核对)。 - 小笔误(网页原文已核对):14.1.3 正文 "the probability that " 的 应为 ;式 (14.22) 括号后多了一个逗号(,SVG title 可见);14.2.1 "BDSF" 应为 BSDF;图 14.7 图注 "Scene courtesty" 应为 courtesy。
- 参考文献:Jakob 等 2010 的末位作者写成 "M. Steve",应为 S. Marschner(Steve Marschner);延伸阅读中 "multiple importance scattering" 应为 multiple importance sampling(笔误)。
出处
- realtime_rendering_4ed.pdf 第 14 章 Volumetric and Translucency Rendering
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.1.2.2、12.2.1、12.5.13 节
- PBRT 4e source excerpt: chapter 11 (Volume Scattering)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 11 章 11.1–11.4 节、延伸阅读、练习,pbr-book.org/4ed/Volume_Scattering
- PBRT 4e source excerpt: chapter 14 (Light Transport II Volume Rendering)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 14 章 14.1–14.2 节、延伸阅读,pbr-book.org/4ed/Light_Transport_II_Volume_Rendering