约 18 分钟技术学习游戏引擎

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 沿相机射线积分,可得到体渲染方程。典型结构可以读作:

相机看到的光由远端光经过透射后的贡献,以及沿射线累积的内散射/发射贡献组成。

这里至少包含三件事:

  1. 路径积分:不是只在一个交点计算,而是考虑多个采样位置。
  2. 透射率:远处或后续样本的贡献会被前方介质削弱。
  3. 光照来源:每个样本点还要估计太阳光、天空光或其他方向的入射贡献。

这就是体积效果昂贵的原因:每个屏幕像素可能需要沿视线采样多次,而每次采样又可能需要考虑向光源方向的遮挡或散射。

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 概括为以下步骤:

  1. 对每个屏幕像素发射相机射线。
  2. 快速跳过不可能含云的空区域或包围体外区域。
  3. 进入云体后,以更密集步长采样密度。
  4. 在每个样本累积透射率与来自太阳/天空的散射辐射。

最终得到该像素方向上云对背景的遮挡和自身贡献。

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. 自测题

  1. 为什么天空和雾不能只按普通表面 BRDF 处理?
  2. 吸收、外散射、内散射分别如何影响相机看到的颜色和亮度?
  3. 透射率与内散射分别回答什么问题?
  4. 相函数在参与介质渲染中承担什么职责?
  5. Rayleigh 与 Mie 散射分别更接近哪些粒子尺度和视觉现象?
  6. 单次散射与多次散射的主要质量差异和性能差异是什么?
  7. 为什么大气散射适合使用 LUT?
  8. Transmittance LUT、Single-Scattering LUT 与 Multiple-Scattering LUT 分别存什么?
  9. 为什么完整预计算大气方案仍可能不适合低端平台或高动态天气?
  10. 网格云与体积云各自的适用场景是什么?
  11. Perlin、Worley/Voronoi 等噪声在体积云中通常承担什么层次的结构?
  12. Ray Marching 为何要区分空段跳跃与云内密采样?
  13. 云的光照计算为什么常比单纯密度采样更昂贵?
  14. 为什么天空、大气雾、云和太阳光需要共享环境状态?

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. 参考资料