Games104学习笔记(7)
GAMES104:游戏中地形、大气和云的渲染(下)
第 6 讲(下)|本段重点:天空大气与体积云渲染
视频时长:约 59 分 38 秒
说明:本文根据本地视频课件与讲解脉络整理,不是逐字稿。
一句话理解
天空和云的真实感来自光在参与介质中的吸收、散射与多次传播。游戏引擎无法逐像素完整求解体渲染方程,因此通常把物理模型拆成可预计算的 LUT、可控的艺术参数与有限步的 Ray Marching,在可信外观、动态性和帧时间之间平衡。
本讲学习目标
- 用参与介质的概念理解天空、雾和云为何不同于普通表面着色。
- 区分吸收、外散射、发射、内散射与相函数的职责。
- 说明 Rayleigh 与 Mie 散射如何对应蓝天、日晕、雾感等现象。
- 理解单次散射、多次散射及其计算难度。
- 掌握大气散射 LUT 的拆分逻辑,以及量产渲染为何需要降维。
- 区分网格云与体积云,理解体积云中的噪声、密度场与 Ray Marching。
1. 天空不是一张背景贴图
从渲染视角看,天空、雾和云并非“遥远的表面”,而是相机视线穿过大量空气、水滴、尘埃或冰晶时,光在路径上不断变化的结果。
这带来两个根本区别:
- 普通不透明表面通常只需要在一个交点处求 BRDF;大气和云需要沿一段视线积分。
- 介质中的光会被削弱,也会从其他方向散射进视线,因此结果依赖观察方向、太阳方向、介质分布和路径长度。
所以本讲的核心不是“给天空调一种颜色”,而是如何近似光穿过介质的传输过程。
2. 参与介质:光在路径上会经历什么
课程以参与介质粒子为例,把光与介质的相互作用分为四类:
| 作用 | 含义 | 视觉影响 |
|---|---|---|
| Absorption(吸收) | 光能被粒子吸收并转换为其他能量 | 视线上的光逐渐变暗或改变颜色 |
| Out-scattering(外散射) | 原本沿视线传播的光被散射到别的方向 | 远处对比度降低、透射率下降 |
| Emission(发射) | 介质自身向外发光 | 火焰、发光雾、特定粒子效果 |
| In-scattering(内散射) | 其他方向的光被散射进当前视线 | 天空亮度、雾、云边缘亮光 |
2.1 消光与透射率
吸收与外散射都会让原视线上的光减少,二者常合并为消光系数。如果沿路径不断累积消光,得到的就是透射率:路径越长、介质越浓,来自远处的原始辐射就越难保留。
一个直观记忆方式:
- 透射率回答“原本的光还能剩下多少”。
- 内散射回答“沿途又加入了多少新光”。
雾使远景发白,并不只是物体颜色被调浅,而是原始光衰减,同时环境光沿视线散射进来。
2.2 相函数:光更愿意往哪边散射
**相函数(Phase Function)**描述入射光被散射后,朝各个出射方向分配的比例。它决定散射是近似均匀、强烈前向,还是偏向其他方向。
在渲染中,单有“介质密度”还不够;同样浓度的介质,如果相函数不同,面对太阳和背对太阳时的亮度分布会完全不同。
3. 从 RTE 到体渲染方程
3.1 Radiative Transfer Equation 的意义
课件给出辐射传输方程(RTE),它描述辐射沿路径传播时的变化:消光让当前方向上的辐射减少,发射和内散射则增加辐射。
不用把公式逐项硬背,但应理解它与表面渲染方程的关系:
- 表面渲染方程关心一个表面点如何反射入射光。
- RTE 关心一条射线在连续介质中每个位置如何交换能量。
3.2 Volume Rendering Equation
将 RTE 沿相机射线积分,可得到体渲染方程。典型结构可以读作:
相机看到的光由远端光经过透射后的贡献,以及沿射线累积的内散射/发射贡献组成。
这里至少包含三件事:
- 路径积分:不是只在一个交点计算,而是考虑多个采样位置。
- 透射率:远处或后续样本的贡献会被前方介质削弱。
- 光照来源:每个样本点还要估计太阳光、天空光或其他方向的入射贡献。
这就是体积效果昂贵的原因:每个屏幕像素可能需要沿视线采样多次,而每次采样又可能需要考虑向光源方向的遮挡或散射。
4. Rayleigh 与 Mie:为什么天蓝、日晕和雾的感觉不同
4.1 Rayleigh Scattering
Rayleigh 散射主要由尺寸远小于可见光波长的分子引起。它对短波长更敏感,因此在常见条件下,蓝光更容易在大气中向各方向散射,形成蓝天的主观印象。
当太阳接近地平线时,太阳光穿过更长的大气路径,短波成分被更多散射离开直射路径,剩余直射光偏向红橙色;这也解释了日出、日落色彩与白天蓝天的关联。
4.2 Mie Scattering
Mie 散射通常由尺寸与波长相近或更大的颗粒造成,例如气溶胶、水滴、尘埃等。它往往具有更明显的前向散射特性。
从视觉上,它与以下现象密切相关:
- 面向太阳时的日晕或强亮区域;
- 潮湿、雾霾、尘埃环境中的泛白感;
- 云边缘面对太阳时更明亮的轮廓。
4.3 两类散射的分工
| 散射类型 | 主要粒子尺度 | 方向特性 | 常见视觉线索 | | — | — | — | | Rayleigh | 远小于波长的分子 | 相对更分散 | 蓝天、日落色偏 | | Mie | 与波长接近或更大的颗粒 | 常强烈前向 | 日晕、雾感、云边缘亮光 |
不要把蓝天简单归结为“天空贴图是蓝色”。颜色与亮度来自粒子尺度、散射系数、相函数、太阳方向和观察路径的共同作用。
5. 单次散射与多次散射
5.1 Single Scattering
单次散射假设一束光从太阳或环境出发,在到达相机前只发生一次主要散射。它能捕捉很多重要的方向性现象,计算相对可控,因此是实时大气模型的基础。
5.2 Multiple Scattering
多次散射表示光在介质中多次改变方向后才进入相机。它对厚重大气、浓雾、云层内部和天空整体亮度很重要;忽略它往往会使大气显得过暗、层次单薄或与地面照明不一致。
困难在于:一次散射已经需要考虑入射光和视线积分,多次散射还会让这些路径彼此嵌套,直接实时求解成本很高。
5.3 一个实用的认知框架
- 单次散射提供主要方向性和快速响应。
- 多次散射提供更丰富、更柔和的整体能量回填。
- 实时引擎常将多次散射做成预计算近似、低频补偿,或以有限次数迭代处理。
6. 解析模型与预计算大气散射
6.1 解析大气外观模型
课程先展示解析式的优势:计算简单、效率高,适合快速得到天空的基本外观。
其限制也很明确:
- 常依赖较强的观察条件假设,例如主要面向地面视角。
- 参数与艺术控制未必能自由变化。
- 难以覆盖从晴天到暴风、地面到高空、不同星球大气等全部需求。
解析模型的价值是提供快速近似,而不是消除介质输运的复杂性。
6.2 为什么用 LUT
预计算大气散射的核心是:把运行时反复出现、维度较高的积分离线或后台求解,存成查找表(Lookup Table, LUT)。运行时根据高度、视线方向、太阳角度等参数采样 LUT,再组合得到天空颜色和透射率。
这与前一讲 IBL 的思路相通:将昂贵积分转化为较少的纹理采样和插值。
6.3 Transmittance LUT
Transmittance LUT 存储光在大气中沿不同几何路径传播时的透射率。它回答:从某个高度、某个方向看过去,光因吸收和外散射还剩多少。
在大气渲染中,它既用于相机视线,也用于计算太阳光到达某个散射点时的衰减。
6.4 Single-Scattering LUT
单次散射依赖的变量比透射率更多,例如观察高度、视线方向与太阳方向。课程展示了将高维信息编码到 3D Texture Array 等资源中的方式。
工程要点是:数学上的高维函数不一定要用“真正的高维纹理”存储;可以通过坐标重参数化、纹理阵列、切片与插值,映射到 GPU 可高效访问的数据布局。
6.5 Multiple-Scattering LUT
多次散射可在已有的透射率和单次散射基础上迭代近似,再存为相对低频的补偿数据。课件中的多次散射 LUT 正体现了“预计算 + 迭代”的思路:用更多离线成本降低运行时路径积分复杂度。
7. 预计算方案的难点与量产化降维
7.1 预计算并不自动等于易用
课件列出预计算大气散射的主要挑战:
- 多次散射迭代本身昂贵。
- 在低端设备或移动端生成/更新大型 LUT 困难。
- 内容团队很难自由、直观地调整所有环境参数。
- 运行时仍要采样多张高维 LUT,像素成本可能不低。
这提醒我们:离线复杂度、运行时成本、动态性和作者体验是四个不同维度,不能只看“画面像不像”。
7.2 Production-Friendly 的思想
课程展示了面向量产的快速天空/大气方案:固定或简化某些变量,例如将视点位置、太阳位置等部分维度约束到常用场景,从 LUT 中移除若干维度。
它的核心不是牺牲质量,而是问一个工程问题:游戏实际需要变化的自由度到底有哪些?
如果某些维度在单个关卡、单帧或某类平台上几乎不变,就没有必要为它维持完整高维数据和采样成本。
7.3 参数化与美术控制
一个可用于生产的天空系统,除了正确的散射模型,还需要:
- 可解释的晴朗度、雾度、太阳高度、地平线颜色等参数;
- 平滑的昼夜过渡;
- 与雾、云、太阳光、曝光和地面 GI 一致的结果;
- 在不同质量档和平台上可预测的性能。
这也是“学术模型”到“引擎系统”必须跨越的一步。
8. 云的表示:网格云与体积云
8.1 Mesh-Based Cloud Modeling
网格云用几何和半透明材质近似云块。它的优点是外观可直接控制,在固定镜头或远景中可以获得较高的艺术质量。
缺点也很明显:
- 复杂云形需要较多人工制作或几何资源。
- 对观察角度和近景穿行的适应性有限。
- 难以自然支持大范围、持续变化的天气。
8.2 Volumetric Cloud Modeling
体积云将云表示为三维密度场,在体积中计算光的吸收、散射和阴影。课程列出的优点包括:
- 云形更自然,能表达厚度、层次和柔软边界。
- 更适合大尺度云层。
- 可支持动态天气、体积光照与云影。
代价是效率必须精心控制,因为它同样需要沿射线采样,并且常包含向太阳方向的额外可见性/透射计算。
8.3 二者的选择
| 方法 | 适合场景 | 主要限制 |
|---|---|---|
| 网格云 | 远景、固定艺术形状、成本可控的云块 | 动态性与近景体积感有限 |
| 体积云 | 大范围天气、云层穿行、云影和强光照互动 | 采样和光照成本高,需大量优化 |
9. 用噪声构建云的密度场
9.1 噪声不是最终外观,而是密度的原料
体积云通常不直接存储整片天空的高分辨率三维纹理,而是使用程序化噪声构建或扰动密度场。课件展示了 Perlin、Worley、Voronoi 等噪声。
它们可组合出不同尺度的结构:
- 低频噪声决定云团的宏观形状与覆盖范围。
- 中频噪声制造团块、卷积和层次。
- 高频噪声侵蚀边缘,避免云团像平滑棉花。
9.2 Worley / Voronoi 的视觉作用
Worley 或 Voronoi 类噪声常产生细胞状、空洞状结构,适合用来雕刻云的孔隙和边界。与连续、柔和的噪声组合时,既能保留大块云团,也能产生更有层次的破碎细节。
9.3 密度字段要可控
噪声只提供随机性;真正可用的云系统还需要由天气图、风向、湿度、云底/云顶高度、覆盖率、侵蚀阈值等参数约束。否则云虽“复杂”,但没有可控的天气逻辑和艺术方向。
10. Ray Marching:在体积中寻找并累积云
10.1 基本流程
课程将云的 Ray Marching 概括为以下步骤:
- 对每个屏幕像素发射相机射线。
- 快速跳过不可能含云的空区域或包围体外区域。
- 进入云体后,以更密集步长采样密度。
- 在每个样本累积透射率与来自太阳/天空的散射辐射。
最终得到该像素方向上云对背景的遮挡和自身贡献。
10.2 空段跳跃与密段采样
若整条射线都使用细步长,成本会非常高。课程展示的“big step marching until hitting cloud”与“dense step sampling inside cloud”体现了常用的自适应采样思想:
- 空介质区域用大步快速前进。
- 有效密度区域用小步近似积分。
这与地形 LOD 的精神类似:计算预算应集中在屏幕真正能看到、且变化重要的部分。
10.3 光照采样为何昂贵
相机射线上的每个云样本,若要判断它是否被云自身遮挡太阳光,可能还要沿太阳方向做一次积分或近似查询。这会形成“每个像素多步、每步又可能多次采样”的乘法成本。
常见优化方向包括:降低阴影射线步数、复用低分辨率结果、时域重投影、分辨率分级、蓝噪声抖动与近似相函数等。优化的目的不是消灭物理模型,而是在可接受误差内减少采样量。
10.4 云的视觉重点
体积云不需要在每一处都精确模拟所有多次散射,但应优先稳定以下线索:
- 太阳侧更亮、背光侧更暗的体积关系。
- 云边缘的透光和前向散射亮边。
- 云内部密度变化带来的层次。
- 与天空、大气雾和地面阴影一致的光照方向。
- 移动时不闪烁、不出现明显采样条带或体积边界。
11. 本讲的系统性结论
11.1 从物理到实时的降维链条
参与介质的光传输是高维、路径相关的问题
→ 用散射系数、相函数和透射率建立可解释的模型
→ 将重复积分预计算为 Transmittance / Scattering LUT
→ 对生产需求不重要的维度进行约束或降维
→ 云用程序化密度场避免存储整片体数据
→ Ray Marching 集中采样有效区域
→ 通过时空复用、步长控制和质量档把结果纳入帧预算。
11.2 天空、雾、云必须协同
大气和云若各自独立调色,常会出现太阳方向、地平线亮度、远景雾色、云影与曝光互相矛盾的问题。更好的引擎设计会共享太阳/天空光照参数、颜色空间、透射率逻辑与时间变化输入,让多个系统表达同一套环境状态。
12. 复习用速记
| 问题 | 第一反应 |
|---|---|
| 远景为何更淡、更偏环境色? | 透射率下降,内散射累积增加 |
| 蓝天与日落为何相关? | Rayleigh 对短波更敏感,长路径改变直射光谱 |
| 日晕和雾感更接近哪类散射? | 常与强前向的 Mie 散射相关 |
| 为什么多次散射昂贵? | 散射路径嵌套,需要反复考虑来自各方向的光 |
| LUT 的核心价值? | 用存储/预计算交换帧内高维积分成本 |
| 为什么体积云昂贵? | 每个像素沿视线多次采样,光照还可能要再采样 |
| 云噪声做什么? | 构建可控的三维密度结构,不等同于最终颜色 |
| 量产天空系统的重点? | 外观、参数控制、动态性、性能和平台回退同时可控 |
13. 自测题
- 为什么天空和雾不能只按普通表面 BRDF 处理?
- 吸收、外散射、内散射分别如何影响相机看到的颜色和亮度?
- 透射率与内散射分别回答什么问题?
- 相函数在参与介质渲染中承担什么职责?
- Rayleigh 与 Mie 散射分别更接近哪些粒子尺度和视觉现象?
- 单次散射与多次散射的主要质量差异和性能差异是什么?
- 为什么大气散射适合使用 LUT?
- Transmittance LUT、Single-Scattering LUT 与 Multiple-Scattering LUT 分别存什么?
- 为什么完整预计算大气方案仍可能不适合低端平台或高动态天气?
- 网格云与体积云各自的适用场景是什么?
- Perlin、Worley/Voronoi 等噪声在体积云中通常承担什么层次的结构?
- Ray Marching 为何要区分空段跳跃与云内密采样?
- 云的光照计算为什么常比单纯密度采样更昂贵?
- 为什么天空、大气雾、云和太阳光需要共享环境状态?
14. 术语表
| 术语 | 含义 |
|---|---|
| Participating Media | 会吸收、散射或发射光的介质,如空气、雾、云、烟 |
| Absorption | 光被介质吸收造成的能量衰减 |
| Out-scattering | 光从当前传播方向被散射离开的过程 |
| In-scattering | 其他方向的光被散射进当前视线的过程 |
| Extinction | 吸收与外散射合并形成的消光 |
| Transmittance | 光沿路径传播后仍保留的比例 |
| Phase Function | 描述散射光在各出射方向上的分布函数 |
| RTE | Radiative Transfer Equation,描述介质中辐射传输变化的方程 |
| Rayleigh Scattering | 小分子主导、对短波敏感的散射类型 |
| Mie Scattering | 较大颗粒主导、常具有强前向性的散射类型 |
| Single Scattering | 光从光源到相机路径上只考虑一次主要散射的近似 |
| Multiple Scattering | 光在介质中经过多次散射后到达相机的贡献 |
| LUT | Lookup Table,将重复计算预先存入纹理/表格以供查询 |
| Volumetric Cloud | 用三维密度场和体渲染表示的云 |
| Ray Marching | 沿射线逐步采样并累积体积密度、透射率和辐射的方法 |
| Perlin / Worley / Voronoi Noise | 常用于构建程序化体积云密度结构的噪声类型 |
15. 参考资料
- B 站视频:06.游戏中地形大气和云的渲染(下)|GAMES104
- GAMES104 课程主页:GAMES104
- 课程讲义与视频索引:GAMES104 Slides