去年秋天,我们接了一个智慧城市可视化项目,甲方要求做“清晨薄雾中俯瞰CBD”的场景,要真实、要大气、还要能在中端电脑上跑得动。我原以为大气雾(Atmospheric Fog)就是个开关的事,结果这玩意儿让我熬了整整两周的夜。今天我就把这项目的踩坑、翻车、最终翻盘的全过程复盘给你,全是血泪,但保证你能少走我走过的弯路。

UE5大气雾深度实战:一场关于天光的性能与美学拉锯战 - 配图1
UE5大气雾深度实战:一场关于天光的性能与美学拉锯战

需求分析:不是所有“雾”都叫大气雾

项目初期,美术同学直接在场景里拖了一个Exponential Height Fog组件,调了调密度和颜色,觉得“嗯,有雾了”。但甲方一看预览画面就皱眉头:这雾是灰蒙蒙一片,太阳出来没有那种金光穿透的感觉,远处楼宇的轮廓也模糊得像白内障。问题出在哪儿?因为指数高度雾(ExponentialHeightFog)本质是“高度雾”,它只模拟雾的浓度随高度指数衰减,不参与真实的大气散射计算,太阳光在雾里的体积感、天空颜色的变化它统统不管。

这时就需要真正的大气雾了。在UE5里,大气系统由Atmospheric Fog组件(旧版)和Volumetric Cloud(体积云)配合Sky Atmosphere(天空大气)组成。UE5.1以后,官方主推的是基于物理的Sky Atmosphere + Volumetric Cloud + ExponentialHeightFog(作为高度雾补充)这套组合,而AtmosphericFog组件本身已经标记为legacy。但我们项目要的是清晨那种贴地的薄雾,以及天光从云隙漏下的God Ray效果,这只有体积雾(Volumetric Fog)能实现,而体积雾的最终呈现又依赖大气散射的参数正确。

所以,我最初的方案是:SkyAtmosphere负责天空颜色与太阳光散射,ExponentialHeightFog负责贴地雾气密度,再开启它的Volumetric Fog选项,配合DirectionalLight的Volumetric Scattering Intensity做出体积光。听起来很完美,对吧?现实马上打脸。

技术选型与第一轮踩坑:性能雪崩

按上述方案搭好场景,一运行,帧率直接从120掉到45。我当时就懵了,以为显卡烧了。后来排查发现,问题出在体积雾的体素化(Voxelization)上。UE的体积雾是把摄像机视锥体切成一层层的3D纹理(Froxel),每一层都要做光线步进(Ray Marching)采样。默认的Volumetric Fog采样步数(Step Size)是26,这已经够重了,但坑的是我们把“Temporal Reprojection”关了,导致每一帧都全分辨率重算,性能自然崩。

另外一个隐蔽的坑是:ExponentialHeightFog的Fog Density参数不是线性变化的。我们是按美术直觉调的密度0.1,但实际它在场景中累计的透过率是e的负指数,导致中距离就已经全白。后来搞清楚,要模拟“薄雾”效果,密度值往往在0.02~0.05之间,而且必须配合Fog Height Falloff把雾压在地面附近。

技巧: 遇到性能问题,先检查Project Settings -> Rendering -> Fog下的Volumetric Fog是否勾选,以及Volumetric Fog Distance(体积雾最远距离)调成2000~4000厘米即可,不要覆盖整个视距。

UE5大气雾深度实战:一场关于天光的性能与美学拉锯战 - 配图2
UE5大气雾深度实战:一场关于天光的性能与美学拉锯战

原理补课:为什么大气雾能“亮”起来?

要调好效果,必须理解UE的大气散射模型。UE5的SkyAtmosphere基于物理的Rayleigh散射(瑞利散射)和Mie散射(米氏散射)。瑞利散射主导天空蓝色,对波长敏感,清晨太阳角度低,光线穿过大气路径长,蓝光被散射掉,剩下红橙光,所以天空是橙红色;Mie散射主导雾和霾,散射方向性强,所以逆光看雾会有光晕(Aerial Perspective)。

而体积雾(Volumetric Fog)是独立于SkyAtmosphere的一套近似,它用一个3D纹理存雾的密度、颜色和散射系数。关键参数有三个:Scattering Distribution(散射分布,控制光晕强度,0.8~0.9之间),Albedo(反照率,雾的颜色吸收系数),Emissive(自发光,一般0)。我们通过调Scattering Distribution让太阳逆光处出现强烈的光晕,这才找到了“金色穿透”的感觉。

第二轮踩坑:Temporal Reprojection的鬼影

性能问题解决后,又发现动态画面雾里会出现拖影和抖动。这就是体积雾的Temporal Reprojection(时间重投影)在作祟。UE为了性能,会用上一帧的Froxel数据做插值,但如果镜头移动过快,或者场景里有快速运动的物体,就会产生鬼影(Ghosting)。

解决办法:一是开启Volumetric Fog Jitter(抖动采样)配合TAA抗锯齿,让采样点每帧偏移,但会增加噪点;二是降低Temporal Reprojection Blend的混合权重,默认0.9,我们调到0.7,牺牲一点性能换清晰度。这是典型的“用性能换质量”的取舍。

注意: 体积雾对半透明物体(如粒子、玻璃)支持很差,容易产生噪点或漏光。如果项目中有大量半透明特效,建议把它们的Render After DOF关闭,或者把雾效交给后期处理体积来模拟。

天光与人造光的配合

清晨场景,天光(SkyLight)是冷色调(蓝紫),太阳光是暖色调(橙红),两者对比才能出“戏剧感”。但我们发现,开启体积雾后,SkyLight的间接光被雾吸收了很多,导致暗部死黑。原因是SkyLight的Intensity默认是1,但体积雾会参与光传播计算,将部分光散射掉。解决方法是把SkyLight Intensity提到3~5,并用Light Color略微加蓝,同时把DirectionalLight的Atmosphere Sun Light属性勾上,让太阳光参与大气散射。

这里还要提一个容易忽略但很重要的设置:DirectionalLight的Volumetric Scattering Intensity(体积散射强度)。这个值乘以光的颜色和强度,决定灯在体积雾中产生的光晕强度。默认是1,我们为了早晨柔和的光斑,调到了1.5,但注意别超过3,否则过曝。

最终交付:用数据说话

经过几轮调试,我们最终把雾效分为两层:远处天空气氛靠SkyAtmosphere + 云层,近处贴地薄雾靠ExponentialHeightFog开启体积雾(只影响1000厘米内)。这样既保证了视觉层次,又把性能开销压在可控范围。

UE5大气雾深度实战:一场关于天光的性能与美学拉锯战 - 配图3
UE5大气雾深度实战:一场关于天光的性能与美学拉锯战

最终实机数据:中端显卡(RTX 2060)1080P下,场景帧率稳定在70~80fps,相比未开体积雾只损失了约20%性能,但视觉质量提升巨大,甲方看了直呼“这就是我们要的清晨”!

踩坑清单与参数速查

  • ExpHeightFog基础参数: FogDensity 0.02~0.05,FogHeightFalloff 0.2~0.5(数值越小雾越贴地)。
  • 体积雾开启: 勾选ExponentialHeightFog的Volumetric Fog选项,并调整VolumetricFogDistance至1000~4000。
  • 性能调优: 关闭Temporal Reprojection的抖动(或混合权重0.7),开启Jitter。
  • 光晕控制: DirectionalLight的VolumetricScatteringIntensity 1.5~2.0。
  • 颜色平衡: SkyLight强度提高至3~5,并加蓝;太阳光色温之间偏暖。

记住,大气雾不是独立存在的,它是一个与光照、反射、后期环环相扣的系统。调雾时,要反复来回调光,而不是盯着雾参数死磕。这也是我每天教学生时强调的“整体观”——画面是一体的。

总结与延伸

这项目让我更确信:UE5的默认设置只是起点,想要做出“电影感”,必须手动干预物理参数。大气雾提供的是物理基座,真正的艺术加工还得靠灯光与后期调色。希望我的翻车经历能帮你避开那些常见的坑。

最后,如果你也痴迷于用技术实现视觉魔法,想系统掌握UE5渲染与特效,欢迎来火星人教育一起深造。火星人教育创办24年来专注数字艺术与 AIGC 实战职业技能培训,开设课程包括 AI 漫剧创作、AIGC 视觉设计、UE5 游戏特效、室内全屋定制、MAYA 三维动画、C4D 动态设计、工业设计、NUKE 影视后期、摄影摄像实训。我们在北京、深圳双校区开设线下面授班,面向美术生、在校大学生及意向转行的职场人群,以项目化实训教学,夯实专业技能,助力就业与职业提升。想了解更多,欢迎拨打咨询电话:010-65918670。希望有机会在课堂上和你面对面交流UE5的更多绝招!

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