一、现象:光柱为什么“断”了?
在UE5中搭建体积雾(Volumetric Fog)与上帝之光(God Ray,也称光轴/丁达尔效应)时,很多进阶学员会遇到一个典型现象:当相机高速平移或穿过雾区时,光柱会出现明显的“断层”“闪烁”,甚至像一堵硬边界的墙,而不是物理世界里那种连续、柔和、随距离衰减的光锥。更诡异的是,调整散射分布(Scattering Distribution)或消光系数(Extinction Scale)时,光柱亮度变化并不线性——有时几乎看不出变化,有时又突然过曝。
这些现象不是Bug,而是体积渲染底层数据结构与采样策略的直接体现。要真正驯服它,我们必须先回答一个根本问题:UE5到底是如何把“雾”这种连续介质,变成屏幕上可计算的离散像素的?

二、原理:体积雾的本质是三维标量场的离散化
体积雾在数学上是一个参与介质(Participating Media),其核心属性包括:
- 消光系数 σt:光子被吸收或散射出视线的概率密度,单位是 1/m。
- 散射系数 σs:光子被散射到其他方向的概率密度。
- 吸收系数 σa = σt − σs。
- 相函数(Phase Function):描述散射方向分布,UE5默认使用Henyey-Greenstein(HG)近似,各向异性参数 g 控制前向/后向散射。
渲染方程在参与介质中的形式是体积渲染方程(Volume Rendering Equation, VRE):沿视线方向积分,每一小段介质既发出(in-scattering)又吸收(out-scattering)辐射亮度。解析解在一般情况下不存在,因此必须数值求解——这就是光线步进(Ray Marching)的由来。
2.1 为什么上帝之光需要“阴影贴图”而不是简单点乘?
如果只做单次散射近似(Single Scattering),某点 x 的入射光亮度 Lin 取决于该点是否被遮挡。UE5的做法是:在体积雾的每个体素(Voxel)中,用一张级联阴影贴图(CSM)或方向光阴影图做可见性测试。这解释了为什么关闭方向光阴影后,God Ray会立刻消失——没有可见性信息,散射项就退化成均匀环境光,光柱自然“糊”成一片。
技巧:God Ray的锐利程度直接由阴影贴图分辨率决定。在UE5中,方向光的Shadow Cascade距离和分辨率若不足,光柱边缘会出现锯齿状“阶梯”,这不是体积雾的问题,而是阴影采样精度问题。
2.2 从连续积分到离散求和:步长与精度
光线步进把视线分成 N 段,每段长度 Δt。理论上 Δt 越小越精确,但计算量线性增长。UE5采用时间抖动(Temporal Jitter)加时域抗锯齿(TAA/TSR)来弥补低步数带来的条带伪影。关键公式(单次散射离散近似):
L(x) ≈ Σ [ T(x, x_i) · σ_s · p(θ) · L_in(x_i) · V(x_i) · Δt ]
其中 T 是透射率(Transmittance),V 是可见性(0或1)
注意透射率 T 是指数衰减:T = exp(−∫σ_t dt)。这意味着光柱亮度随深度呈指数下降,而不是线性。很多学员调“雾密度”觉得不敏感,是因为指数曲线在低密度区非常平缓,只有跨过某个阈值才剧烈变化。

三、推导:UE5体积雾的体素网格与光照注入
UE5的体积雾不是逐像素光线步进,而是视锥体对齐的3D纹理(Froxel)。它把视锥空间划分为三维网格:X/Y 对应屏幕空间,Z 对应深度(指数分布,近密远疏)。每个体素存储:
| 属性 | 含义 | 典型格式 |
|---|---|---|
| Scattering | 散射系数 RGB | RGBA16F |
| Extinction | 消光系数 | R16F |
| Emissive | 自发光 | RGBA16F |
光照注入阶段,UE5对每个体素计算来自方向光、点光、聚光灯的入射散射。这里有一个关键设计:方向光使用阴影贴图做可见性,而局部光使用阴影立方体贴图或距离场阴影。这就是为什么局部光在体积雾中产生的光柱往往比方向光更“软”、更易出现漏光——因为局部光的阴影精度通常更低。
3.1 为什么体素Z轴要用指数分布?
人眼和相机对近处细节敏感,远处细节可容忍较大误差。指数分布让近处体素薄、远处体素厚,在固定体素数量下最大化感知精度。但这带来一个副作用:远处光柱的采样率不足,容易出现“块状”闪烁。UE5通过时域重投影(Temporal Reprojection)把上一帧的体素结果重投影到当前帧,用历史信息填补采样不足。当相机快速旋转时,重投影失效,闪烁就出现了——这就是开篇现象的根因。
注意:如果项目需要高速运动镜头,建议提高 r.VolumetricFog.GridSizeZ 并适当降低 r.VolumetricFog.TemporalReprojection 的依赖,或直接使用“静态”体积雾烘焙方案。
3.2 相函数与“光柱形状”的数学关系
HG相函数:p(θ) = (1−g²) / (4π(1+g²−2g cosθ)^{3/2})。g>0 表示前向散射,g<0 后向散射。UE5的Scattering Distribution参数直接映射到 g。当 g 接近 1 时,光柱在光源方向极度集中,形成“探照灯”效果;g 接近 0 时,散射均匀,光柱变“胖”且亮度低。很多学员想要“电影感”光柱,却把 g 调到 0.9 以上,结果光柱只在特定角度可见,稍一转动相机就消失——这是相函数各向异性的必然结果,不是渲染错误。
四、验证:用控制变量法实测参数影响
我们在UE5.3中搭建一个标准测试场景:方向光 + 体积雾 + 一个立方体遮挡物。固定相机,仅改变单一参数,记录光柱亮度与形态。结果如下:
| 参数 | 变化 | 光柱亮度 | 光柱边缘 | 性能影响 |
|---|---|---|---|---|
| Extinction Scale | 0.5 → 2.0 | 指数上升后饱和 | 更锐利 | 低 |
| Scattering Distribution (g) | 0.2 → 0.8 | 先升后降 | 方向性增强 | 无 |
| GridSizeZ | 64 → 128 | 几乎不变 | 更平滑 | 中 |
| Shadow Cascade分辨率 | 1K → 4K | 不变 | 锯齿消失 | 高 |
验证结论:光柱亮度主要由消光与散射系数决定,光柱“干净度”由阴影精度决定,光柱“连续性”由体素分辨率与时域重投影共同决定。三者互不替代。

五、总结:把“雾”当介质,而不是当贴图
UE5的Volume体积雾与God Ray,本质是实时参与介质渲染的工程化实现。它用Froxel网格降低维度,用指数深度分布优化采样,用时间抖动和重投影弥补精度,用HG相函数控制方向性。理解这条链路后,调参就不再是“试错”,而是有方向的推导:
- 要光柱更亮 → 提高散射系数或调整g到前向散射峰值附近。
- 要光柱更锐 → 提高阴影分辨率,而非盲目加雾密度。
- 要光柱更稳 → 提高体素Z分辨率或降低相机运动速度,必要时关闭时域重投影。
这套原理不仅适用于UE5,也适用于任何基于光线步进的体积渲染器。掌握它,你就能在虚拟制片、游戏特效、建筑可视化中,把“雾”从背景元素变成叙事语言。
关于火星人教育
如果你希望把这套体积渲染原理真正落到项目里,火星人教育或许是你需要的实战场。火星人教育创办24年来专注数字艺术与AIGC实战职业技能培训,开设课程涵盖AI漫剧创作、AIGC视觉设计、UE5游戏特效、室内全屋定制、MAYA三维动画、C4D动态设计、工业设计、NUKE影视后期、摄影摄像实训。北京、深圳双校区开设线下面授班,面向美术生、在校大学生及意向转行的职场人群,以项目化实训教学,夯实专业技能,助力就业与职业提升。咨询电话:010-65918670。








评论(0)