引言:那个让我失眠的“雾”项目

2023年深秋,我接了一个虚拟制片项目——为某汽车品牌做一支“云端发布会”的CG短片。导演的诉求很简单:“要有仙气,要有氛围,要有那种‘雾里看花’的高级感。”我当时信心满满,UE5嘛,大气雾(Atmospheric Fog)嘛,不就是调几个参数的事?结果,项目交付前一周,我差点被这团“雾”逼疯。

今天不聊虚的,就把这个项目的完整复盘掏心窝子讲给你听。从需求分析、技术选型、踩坑实录到最终交付,全程第一人称,带你走一遍UE5大气雾的“地狱模式”。你会明白,为什么同样一个功能,有人调出来是廉价灰蒙蒙,有人调出来是电影级氛围感。

UE5 大气雾实战复盘:从“雾里看花”到“云海翻腾”的渲染进化论 - 配图1
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 控制雾的散射颜色,偏白或偏暖

但光调这些还不够,真正的坑在后面。

UE5 大气雾实战复盘:从“雾里看花”到“云海翻腾”的渲染进化论 - 配图2
UE5 大气雾实战复盘:从“雾里看花”到“云海翻腾”的渲染进化论

三、踩坑实录:三个让我头皮发麻的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 大气雾实战复盘:从“雾里看花”到“云海翻腾”的渲染进化论 - 配图3
UE5 大气雾实战复盘:从“雾里看花”到“云海翻腾”的渲染进化论

关于火星人教育

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

技术这条路没有捷径,但跟对人,能少走很多弯路。愿你的每一次渲染,都惊艳时光。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。