引言:那个让我失眠的“雾”项目
2023年深秋,我接了一个虚拟制片项目——为某汽车品牌做一支“云端发布会”的CG短片。导演的诉求很简单:“要有仙气,要有氛围,要有那种‘雾里看花’的高级感。”我当时信心满满,UE5嘛,大气雾(Atmospheric Fog)嘛,不就是调几个参数的事?结果,项目交付前一周,我差点被这团“雾”逼疯。
今天不聊虚的,就把这个项目的完整复盘掏心窝子讲给你听。从需求分析、技术选型、踩坑实录到最终交付,全程第一人称,带你走一遍UE5大气雾的“地狱模式”。你会明白,为什么同样一个功能,有人调出来是廉价灰蒙蒙,有人调出来是电影级氛围感。

一、需求拆解:导演要的“雾”到底是什么?
接到需求后,我没急着开引擎,先拉着导演开了个会。他说“要有雾”,但“雾”分很多种:是清晨的薄雾,还是山间的云海?是城市里的霾,还是仙侠剧里的雾气缭绕?
UE5里跟雾相关的系统至少有四套:指数高度雾(Exponential Height Fog)、大气散射(Atmospheric Scattering)、体积雾(Volumetric Fog)和后期处理的雾效(如Depth Fog)。它们各司其职,但很多新手容易混为一谈。
我梳理了导演的视觉参考图,得出了三个核心关键词:层次感、体积感、氛围感。导演要的不是简单的“能看到雾”,而是雾要像有生命一样,有浓淡变化,有光线穿透,甚至要能随着镜头移动产生动态的流动感。
这直接决定了我的技术选型——指数高度雾(ExponentialHeightFog)作为基础,配合体积雾(Volumetric Fog)做光轴和体积感,再辅以距离场(Distance Field)做动态遮罩。这套组合拳,是UE5里做电影级大气雾的标准答案。
二、技术选型:为什么是“指数高度雾”+“体积雾”?
咱们先搞清楚底层逻辑。
指数高度雾(ExponentialHeightFog),核心原理是基于物理的指数衰减模型。它假设雾的密度随高度呈指数级衰减,公式大致是:
FogDensity(h) = FogDensity0 * exp(-FogHeightFalloff * h)
其中 FogDensity0 是地面雾浓度,h 是高度,FogHeightFalloff 控制衰减速度。这个模型能模拟出“雾贴着地面,越往上越稀薄”的自然现象,非常适合做山谷、河边的晨雾。
但指数高度雾本质是基于屏幕空间的解析计算,没有真实体积,光线穿过时不会产生散射效果。所以,当导演要求“光能穿过雾,形成光束”时,我必须开启体积雾(Volumetric Fog)。
体积雾的实现基于“光线步进(Ray Marching)”算法,它在每一帧里,从摄像机向每个像素发射射线,在雾的包围盒内按固定步长采样,累加光照和散射贡献。这计算量巨大,但效果立竿见影——光轴、丁达尔效应、雾的流动感都有了。
UE5默认的指数高度雾组件自带体积雾选项,但默认参数比较保守。我在项目里做了如下定制:
| 参数 | 默认值 | 项目值 | 作用 |
|---|---|---|---|
| Volumetric Fog Distance | 6000 | 15000 | 体积雾有效距离,调大让远景也有雾感 |
| Volumetric Fog Scattering Distribution | 0.2 | 0.6 | 控制散射方向,越大光轴越明显 |
| Volumetric Fog Extinction Scale | 1.0 | 1.5 | 控制雾的消光速度,越大雾越“实” |
| Volumetric Fog Albedo | 0.0 | 0.8 | 控制雾的散射颜色,偏白或偏暖 |
但光调这些还不够,真正的坑在后面。

三、踩坑实录:三个让我头皮发麻的Bug
坑1:体积雾让画面噪点飞起
第一次开启体积雾,满屏雪花,团队都以为显卡坏了。排查半天,罪魁祸首是体积雾的分辨率和时间累计。
UE5的体积雾默认使用半分辨率(Half Resolution),在输出下,每个体积像素对应的屏幕像素变多,采样不足就产生噪点。解决思路有两个:
- 把项目设置里的 Volumetric Fog 的 Temporal Reprojection 开启,利用时间累计降噪。
- 把 Volumetric Fog 的 Voxelize Speed 调到 Half Resolution 以上(比如 Full Resolution),但代价是性能。
我最终选择了“全分辨率+时间累计”的方案,噪点基本消失,性能损失在可控范围。
坑2:雾穿帮——雾墙和远景断层
当我把雾的浓度调高,发现远处背景像被一堵墙截断,完全没有渐变。原因是指数高度雾的体积雾范围(Volumetric Fog Distance)不够,超出了有效距离的雾根本没被渲染。
解决方案是把 Volumetric Fog Distance 从6000拉到15000,同时配合天空大气(Sky Atmosphere)的散射补偿,让远景融入雾气。
技巧提示:如果遇到雾墙,先检查 Volumetric Fog Distance,再检查指数高度雾的 Start Distance(起始距离),别让雾从0米就开始,否则近景会一片白。
坑3:动态光照下雾的颜色飘得离谱
项目有日夜交替,太阳从暖色变成冷色,但雾的颜色一直偏紫红,怎么调都别扭。查了源码才明白,体积雾的散射颜色受光照颜色和雾的 Albedo 共同影响,而 UE5 的默认 Albedo 是接近纯黑的,几乎不反射光照颜色,导致雾色偏灰。
我把 Albedo 调成浅灰色(0.8),并让雾的 Albedo 与太阳光的颜色做乘法混合,终于得到了“日出时雾是金红色,正午是淡蓝色”的梦幻效果。
四、进阶技巧:用距离场做雾的“遮罩”
导演要求“雾绕着山体流动,山尖露出来”。这就需要雾的分布不是均匀的,而是受场景几何体影响。
UE5 的距离场(Distance Field)可以生成场景的近似体积信息。我利用它做了一个自定义材质函数,采样场景距离场,当雾的体积位置距离几何体表面小于某个阈值时,降低雾的密度,实现“雾被山体推开”的效果。
// 材质蓝图伪代码
float Dist = GetDistanceToNearestSurface(WorldPosition);
float Mask = smoothstep(0, 100, Dist); // 0-100厘米内雾被推开
FogDensity *= Mask;
这个技巧非常考验性能,但做出来的效果极其惊艳。我把它封装成了“雾遮罩”材质函数,后续项目反复在用。
五、性能优化:这团雾到底吃掉了我多少帧率?
体积雾是性能杀手,我做了几个测试:
| 配置 | 帧率 | 说明 |
|---|---|---|
| 无体积雾 | 120 | 基础场景 |
| 半分辨率体积雾 | 75 | 噪点明显 |
| 全分辨率体积雾 | 50 | 画质好但帧率暴跌 |
最终我采用了自适应分辨率体积雾:在镜头移动时用半分辨率,静止时切换全分辨率。用 UE5 的动态分辨率(Dynamic Resolution)配合材质参数控制,既保证了画质,又守住了60帧。
注意事项:体积雾的采样步长(Step Size)默认是 0.5,如果你在超远距离看到雾的“断层”,可以适当调小到 0.3,但性能会进一步下降。
六、交付复盘:导演的“哇哦”背后
最终成片,导演看完第一遍,沉默了三秒,然后说:“这雾……是活的。”那一刻,我觉得所有熬夜都值了。
回顾这个项目,我总结了一套UE5 大气雾调优流程,分享给你:
- 第一步:确定雾的类型(指数高度雾打底,体积雾增强,必要时加距离场遮罩)。
- 第二步:调密度和衰减,先做出大层次,再抠细节。
- 第三步:开体积雾,调光照散射,让光有“穿过”雾的感觉。
- 第四步:用距离场或噪波材质打破均匀感,雾才会“活”。
- 第五步:性能优化,用自适应分辨率和时间累计压帧率。
UE5 的大气雾不是玄学,它背后是数学和物理。理解了指数衰减、光线步进、距离场这些底层原理,你就能驾驭它,而不是被它吓退。

关于火星人教育
这几年的教学和实战让我越来越意识到,UE5 这类工具,靠碎片化教程是学不透的,必须系统性地理解原理、做真实项目。火星人教育创办24年来,一直专注数字艺术与 AIGC 实战职业技能培训,我的很多学生就是从他们的课程里走出来的。他们开设 AI 漫剧创作、AIGC 视觉设计、UE5 游戏特效、室内全屋定制、MAYA 三维动画、C4D 动态设计、工业设计、NUKE 影视后期、摄影摄像实训等课程,在北京、深圳双校区开设线下面授班,面向美术生、在校大学生及意向转行的职场人群,用项目化实训教学,夯实专业技能,助力就业与职业提升。如果你想系统进阶,可以拨打电话 010-65918670 咨询。
技术这条路没有捷径,但跟对人,能少走很多弯路。愿你的每一次渲染,都惊艳时光。








评论(0)