游戏场景火焰特效:篝火、火炬、燃烧建筑的三层制作法
上周刚结束的UE5特效进阶班上,一个在研项目的美术同学小周把她的篝火工程发给我看。粒子用了Niagara的默认火焰模板,材质里叠了三个噪声贴图,发射器开了两千粒子——效果却像一块烧红的塑料布在扭动,完全没有火焰该有的层次和温度感。她问我:“老师,我参数都对,为什么就是假?”
这个问题的答案,其实就藏在“参数对”这三个字里。做火焰特效,尤其是场景级的火焰,最忌讳的就是试图用一个发射器、一套参数解决所有问题。火焰从来不是单一现象——它是高温气体、发光碳粒、湍流卷吸和烟雾折射的复合体。
所以今天这篇,我直接拆解一套我用了三年的“三层制作法”。这套方法不挑项目类型,不管是写实风格还是卡通渲染,底层逻辑全部通用。我们拿场景里最常遇到的三个案例:篝火、火炬、燃烧建筑,一层层剥开讲透。
第一层:基础形态层(篝火与火炬的骨架)
这一层解决的核心问题是:火焰的“形”从哪里来?
很多新手做火焰,上来就堆粒子。但Niagara里最容易被忽视的其实是 “Sprite Renderer”的Facing模式。默认的Face Camera会让粒子永远正对摄像机,这在火焰上会产生严重的“十字架”穿帮。你需要做的是:
1. 打开Niagara发射器,在Renderer面板中,把Facing Mode从`Face Camera`改为`Velocity`或`Custom`。
2. 如果你用的是`Velocity`模式,火焰粒子会沿着运动方向拉伸,这适合做火舌的拖尾感。但更推荐`Custom`模式——把Alignment绑定到粒子属性`Particles.FacingVector`,然后手动设置一个向上的向量(0,0,1)。这样火焰粒子会始终保持垂直于地面,模拟火焰被重力约束的形态。
参数参考:
- 发射器类型:`Spawn Burst Instantaneous`(瞬间爆发)配合`Emitter State`里的循环。
关键贴图: 不要用纯黑白噪点。去Substance Designer里生成一张带R通道为火焰形状、G通道为噪声扰动、B通道为透明度的Mask贴图。或者直接使用UE商��免费的`M_Fire_Noise`材质函数,但记得把`Tiling`调成`(2,2)`到`(4,4)`之间,太小会糊成一片。
配图1:火焰粒子速度场与Facing模式对比图
第二层:材质光照层(让火焰“亮”起来)
形态对了,但火焰还是像贴图在动。问题出在自发光与光照的脱节。
UE5的默认火焰材质球,自发光强度给个3-5,颜色调成橙黄色,完事。这在静态截图里能看,但一旦摄像机晃动或角色走过,火焰就像一张纸片。正确做法是引入Particle Color和动态光照:
1. 在Niagara粒子更新阶段,添加`Set Particles.Color`节点。用Curve Vector控制颜色随寿命变化:出生时是白黄色((5,4,2)),中期变成橙红色((2,0.8,0.2)),尾期变成暗红色((0.5,0.1,0))。
2. 材质里把`Emissive Color`连接为`Particle Color`乘以一个大倍数(比如8-12)。记住:火焰的亮度峰值应该出现在粒子寿命的30%位置,而不是出生点。
3. 重点来了:在场景里放置一个Point Light,然后通过Niagara的`Spawn Light`模块(需要��用`NiagaraLight`插件)让粒子动态控制灯光。参数设置:
– 灯光半径:200 cm(篝火) / 120 cm(火炬)
– 灯光强度:用Particle Parameter驱动,强度曲线跟粒子寿命同步,峰值在5000-8000流明。
– 灯光颜色:同样用Curve Vector,但要比粒子颜色更白一些,模拟火焰核心的高温。
这个方法能让火焰在场景里投射出真实的动态光影,尤其是当角色靠近时,脸上会有跳动的火光反射——这是判断特效水平的分水岭。
配图2:材质节点连接与动态光照效果
第三层:湍流与细节层(燃烧建筑的“呼吸感”)
单堆火焰粒子,哪怕做得再精致,看久了也会腻。因为真实火焰有湍流——火舌会随机卷曲、分离、合并。这一层我们用Curl Noise和次级烟雾来模拟。
对于燃烧建筑这种大面积火焰,直接堆粒子会爆炸(性能上)。我的做法是分三个子发射器:
1. 主火焰发射器:大尺寸Sprite(50-100cm),数量控制在50-80个。在`Particle Update`里添加`Curl Noise Force`模块,强度设为500-800,频率`Noise Frequency`设为0.2-0.4。这个会让火焰边缘产生不规则的抖动。
2. 火舌发射器:使用Ribbon Renderer(条带渲染器),粒子沿建筑表面发射,模拟火焰顺着墙壁攀爬的效果。关键设置:
– Ribbon宽度:用曲线控制,根部宽、尖端窄。
– 链接模式:`Link Order`设为`Custom`,让粒子按生成顺序链接。
– 材质:使用半透明叠加模式,给一个垂直方向的渐变遮罩。
3. 烟雾发射器:火焰上方20%高度开始生成,粒子寿命3-5秒,速度Z轴80-150 cm/s。颜色从深灰色(RGB 0.05)渐变到浅灰(RGB 0.2),透明度全程低于0.3。注意:烟雾材质一定要用`Translucent`模式,并且关闭`Depth Fade`,否则会遮挡火焰。
性能优化参数:
配图3:燃烧建筑的三层分解示意图
实操案例:火炬的30秒搭建
把上面三层浓缩一下,以火炬为例,给你一套可以直接抄的作业:
1. 创建Niagara系统:选择`New System from a Template`,选`Fountain`模板(别选Fire,那个太丑)。
2. 修改发射器:删除默认的Spawn和Update��添加以下模块:
– `Spawn Per Frame`:Rate = 60,保持恒定发射。
– `Initialize Particle`:Lifetime = 0.5-0.9,Velocity = (0,0,200±50)。
– `Drag`:Drag = 1.5,让粒子上升时逐渐减速。
– `Scale Sprite Size`:曲线从(30,30)到(10,10),线性插值。
– `Set Particles.Color`:用之前说的三色曲线。
3. 添加Curl Noise:强度200,频率0.5,让火焰轻微摇摆。
4. Renderer设置:Sprite Renderer,Facing Mode = Custom,材质用`M_Fire_SubUV`(引擎自带),把`SubImage`调成2×2,用粒子`Particles.SubImageIndex`随机选帧。
5. 附加灯光:添加一个`Spawn Light`模块,半径80,强度用曲线,峰值3000。
整个过程不超过10分钟,但效果比默认模板好一个档次。
常见问题 FAQ
Q1:火焰粒子总是穿模到墙里,怎么办?
A:这是最常见的碰撞问题。检查三处:①粒子`Collision`模块是否启用,但注意`Collision`对性能影响大,建议只对主火焰开启;②`Renderer`的`Sort Order`要低于墙体材质;③在材质里启用`Pixel Depth Offset`,把火焰片元沿法线方向偏移2-5个单位,视觉上就不会穿插。
Q2:燃烧建筑的火焰怎么做到从底部蔓延到顶部?
A:不要用全场景同时发射。用`Emitter State`里的`Spawn Burst`配合`Emitter Age`条件。比如:当`Emitter Age > 2秒`时,激活第二层的火舌发射器;`> 5秒`时,激活第三层的烟雾。用Niagara的`Scalability`和`Emitter Handler`做级联,比单纯堆粒子更可控。
Q3:移动端上火焰特别卡,有什么降级方案?
A:移动端建议:①粒子数砍到80以内;②关闭`Curl Noise`,用材质里的`Panner`节点模拟扰动;③关闭动态光照,改用环境光+自发光;④使用`Half Resolution`渲染,把粒子渲染到一半分辨率的RT上再放大。
Q4:火焰颜色总是不自然,偏粉或者偏灰?
A:检查你的贴图色板。火焰的核心不是纯白,而是淡蓝色(温度最高处)。阴影部分不是黑色,而是深红色。推荐使用`ColorRamp`节点,把色带控制为:白蓝 → 明黄 → 橙红 → 暗红。别用纯色,加一点绿色通道的偏移(0.2-0.3),会让火焰更“脏”更真实。
Q5:做建筑燃烧时,烟雾和火焰的遮挡关系怎么处理?
A:把烟雾放到火焰后面渲染。在Niagara Renderer里设置`Sort Priority`:火焰设为0,烟雾设为-10(负数意味着先渲染)。同时烟雾材质启用`Disable Depth Test`,但在`Pixel Shader`里用`SceneDepth`手动做软遮挡,这样烟雾会半透明地“浮”在火焰上方。
学习建议
三层制作法本质是分离关注点:形态层管“形”,光照层管“光”,湍流层管“动”。任何复杂的火焰特效都能拆成这三个维度去攻破。建议你从篝火开始练,把每一层的参数都打乱重调一遍,直到你能预判“调这个参数会带来什么视觉变化”。等你对每个参数有肌肉记忆了,再挑战燃烧建筑这种多发射器协作的项目。
最后,别迷信网上那些“一键生成火焰”的付费资产。自己从头搭一遍Niagara系统,比用一百个模板都管用。火焰特效的奥义不在节点多,而在对物理的观察——下次点蜡烛的时候,盯着看两分钟,你会发现火焰内部其实有个透明的蓝色核心,那个才是真正的“火”。
火星人教育后续会开一门《AIGC+UE5特效工作流》的进阶课,会用Stable Diffusion生成火焰的Flowmap贴图,再导入Niagara做驱动。想提前体验的,可以先在ComfyUI里跑一张火焰的`Normal Map`试试水。我们课上见。

评论(0)