从小我就觉得粒子特效是门“骗术”:喷泉喷的是水,火焰烧的是粒子,但只要观感对了,没人会在意那是不是真的流体。喷泉那一篇发出来后,不少人问我能不能把发射器关掉重力、换个橙色贴图,直接当火焰用。我的回答是:能,但做出来更像“被风吹歪的橘子汽水”,一眼假。这次我把喷泉思路升级成火焰的完整过程拆出来,核心就落在三件事上:噪声、颜色曲线、透明淡出。
这篇不是从零教Niagara基础,而是默认你已经会拖发射器、会开材质、能在系统里加模块。目标很明确:让一批普通的上升粒子,变成有舌头、有温度、有消散感的火焰。适合刚学Niagara两三天、想跳过喷泉直接做火焰的朋友,也适合那些做完火焰总觉得“硬邦邦”的老手对照自查。
1. 先复盘喷泉粒子,找出火焰必须反着来的三条设置
喷泉粒子看起来和火焰粒子很像:都是从底部向外喷,靠重力下坠或靠初速飞散,最后淡出消失。但如果你把喷泉参数原样拷过来改个色,会发现火焰跑不起来。本质上,喷泉和火焰对粒子的“运动期望”完全相反。
1.1 喷泉的核心参数长什么样
上一篇里我给喷泉用的套路是:粒子在PersonSpawn阶段生成,初速比较大,方向向上或呈锥形散开,Particle Update里挂一个朝下的重力,粒子寿命一般在1到3秒,颜色基本固定,透明度通过Alpha曲线缓慢衰减。这套组合好在稳定,水花不管怎么飞,最终都会被重力拉回地面,视觉重心始终集中在下半段。
喷泉的透明度衰减也很典型:它是“喷到最高点然后消失”,所以Alpha从头到尾衰减得比较均匀。水是连续体,掉下来的时候你还能看见水珠,所以粒子寿命长、尺寸大,颜色只用调水的质感和反射就好。
1.2 火焰和喷泉真正差在哪三处
把火焰放进同一套逻辑里检查,就能发现三处根本差异:
第一,运动方向。喷泉靠重力制造抛物线,火焰却必须抵抗重力向上飘。而且火焰不是均匀上升,它要有点摇曳、有点颤抖,像被空气吸着往上走。第二,颜色变化。喷泉颜色从头到尾基本一致,火焰则会从白色过渡到黄色、橙色、暗红,这是燃烧温度的视觉表达。第三,淡出方式。喷泉的淡出是“越来越透明直到看不到”,火焰则更像是“烧完的余烬散开”,粒子在生命后期会膨胀、变疏、崩解。
这三点正好对应今天要讲的噪声、颜色曲线、透明淡出。别急着去材质里把粒子变红,先把运动逻辑改对,火焰的味道就出来一半了。我把喷泉和火焰的对照列在下面,方便你直接对比找问题:
| 参数维度 | 喷泉策略 | 火焰策略 | 原因 |
|---|---|---|---|
| 重力 | 开启,向下 | 关闭,或给极小的向上浮力 | 火焰是热空气上升,不是被外力顶上去 |
| 噪声扰动 | 基本不用 | 必须用,且要叠加多层 | 火焰需要舌状舔舐感,不是抛物线 |
| 颜色 | 固定颜色 | 寿命映射颜色曲线 | 燃烧温度从白到红递减 |
| Alpha | 平滑降低 | 中后期急促淡出,伴随尺寸膨胀 | 模拟余烬崩解散开 |
| 粒子寿命 | 1~3秒 | 0.5~1.5秒 | 火焰更新快,太长的粒子会糊成一条线 |
如果你的火焰做出来仍然像水柱,九成是这三条有一条没改。
2. 从空发射器搭起火焰骨架:寿命、初速与上升运动
改材质前,先把发射器重新搭一遍。我习惯从空发射器开始,不保留喷泉的预设,因为喷泉里的SpawnRate、Drag、Collision这些模块会残留干扰。下面这组参数是我反复调过的基础值,版本差异可能让具体数值略有不同,但逻辑方向没问题。
2.1 发射器类型和Sprite渲染器选型
火焰用Sprite渲染器最省事,别一开始就上Mesh粒子。Sprite配合Noise扰动,视觉上足够做出火焰的层次感。只要你不是摄像机怼到粒子脸上数像素点,Sprite完全能应付。
创建发射器时选Empty Type,然后手动加渲染器。注意渲染器里的材质先用最普通的半透明材质占位,后面会详细说材质侧设置。Sprite渲染器的两个细节:一个是Alignment要设成Camera Facing,保证粒子始终面向摄像机;另一个是SubImage参数,如果你的火焰贴图有序列帧,可以留到后期再调,第一版直接用单帧贴图,省得把问题搞复杂。
2.2 关键参数表:初速、寿命、拖拽
初始化粒子模块里,我给火焰设置的是锥形初速,点和方向都从发射器位置往上。给你一组可以直接抄的初始参数:
| 参数名 | 推荐值 | 说明 |
|---|---|---|
| 粒子寿命 | 0.6 ~ 1.2 随机 | 火焰更新快,寿命短才不拖沓 |
| 初速大小 | 60 ~ 120 | 给粒子一个向前的趋势 |
| 锥角 | 15° ~ 30° | 控制火焰的扩散范围 |
| 初速方向 | 正Y轴(或你的向上轴) | 确保粒子向上走 |
| Drag | 0.8 ~ 1.2 | 模拟空气阻力,让粒子越飞越慢 |
| 重力 | 0 | 关闭,不要让粒子下坠 |
拖拽并不是越小越好,相反,火焰需要一定拖拽,才能让粒子在初速的基础上逐渐减速、拉长轨迹。如果拖拽太小,粒子会保持高速直冲,像一排火箭。拖拽配合后面的噪声,才会出现火舌前段有力、尾段飘散的效果。
2.3 为什么不要直接给粒子加负重力
很多新手会把“火焰向上飘”理解成“把重力设成负值”。理论上重力设成-几百确实能让粒子向上加速,但出来的运动是均匀、匀速的上升,没有衰减也没有扰动,像一股稳定的气柱。
火焰的真实运动是:底部燃烧时能量高、速度快,往上走的过程中能量衰减、速度降低、方向被周围气流干扰。所以正确做法是保留初速,用拖拽减速,再用噪声打乱方向。负重力可以加一点点,比如设成负的20到40,用来模拟热空气的浮力,但千万别让它成为主导力。我把氛围值控制在初速的1/3以下,这样粒子能保持“努力向上但逐渐乏力”的观感。
调完这一层,粒子已经会向上飘了,但还很直、很机械。下一节就是火焰的灵魂:噪声扰动。
3. 给火焰注入“舔舐感”:噪波节点到底在扰动什么
这个部分就是标题里“噪声”的核心。很多人加了噪声但火焰还是死板,是因为把噪声当成随机速度了。随机速度是每一帧重新抽乱数,结果粒子抖动得厉害却看不出规律;噪声则是基于连续空间采样的平滑值,它会让粒子之间有相关性,形成连片摆动,这才是火焰晃动感的来源。
3.1 火焰的噪声和“随机扰动”的区别
随机扰动解决的是“散乱”,噪声解决的是“摇曳”。你可以把噪声想象成风拂过火苗时,空气在空间里形成连续的气流波。粒子在这个波里被推来推去,相邻粒子受到的影响相近,所以会集体摇摆而不是各自乱飞。火焰需要的是这种集体摇摆。
Niagara里最常用的是Curl Noise,也叫旋度噪声。它生成的向量场天然无散度,也就是说粒子不会突然往一个方向堆积,运动方向会呈现出旋转、环绕的感觉。Perlin Noise也能用,但Curl Noise对火焰的舌状效果更友好。如果你已经装了引擎自带的各种Noise节点,优先选带Curl字样的。
3.2 在Niagara里接噪声的两种常用方式
第一种方式:在Particle Update里加一个模块,用Sample Noise节点采样向量场,把输出加到Particles.Force上。采样坐标用Particles.Position乘以一个频率系数,时间输入用Emitter Age,这样噪声会随时间变化。
第二种方式:直接用Niagara里的“Noise Force”或者“Sample Curl Noise”模块,它会把噪声转成力,施加到粒子速度上。区别在于你需要控制噪声强度,也就是力的大小。我的习惯是第一版先用第二种方式,把强度拖进效果里看,调顺了再改成更精细的Noodle连接。
连接大逻辑是:噪声模块 → 输出Force或Velocity → 叠加到现有速度上。注意一定要加在速度/力的节点上,不是直接写Particles.Position。如果你直接改位置,粒子的运动轨迹会变成生硬的抖动,不会有平滑的飘摇感。
3.3 一版能直接用的噪波参数
我给火焰做的噪波参数大概是这样的:
| 参数名 | 推荐值 | 说明 |
|---|---|---|
| 噪声类型 | Curl Noise | 旋度噪声,适合火焰气体扰动 |
| 频率 | 1.2 ~ 2.5 | 控制舌头的粗细,越低越粗,越高越碎 |
| 强度 | 20 ~ 80 | 控制扰动量,太大火焰会炸开 |
| 时间尺度 | 0.8 ~ 1.5 | 控制火焰摆动的快慢 |
| 空间坐标 | 世界坐标 | 让不同位置的粒子受同一片风场影响 |
如果你的火焰像一团雾,就把频率调高、强度调低,让它碎一点;如果火焰像一条直线,就把频率调低、强度调高,让它左右摆起来。我建议你先用强度50、频率1.5跑一遍,再根据观感微调。
噪波对火焰的另一个贡献是“底部稳、顶部散”。底部粒子刚出生,速度大,噪声对它的影响相对小;顶部粒子速度已经慢下来,噪声会把它的方向扯得乱七八糟,自然形成火舌分叉、卷曲、散开的样子。如果你发现顶部还不够散,可以把噪声强度跟粒子寿命做成曲线,越老越受到噪声影响。
4. 颜色曲线的正确打开方式:粒子不是变色,是在升温
颜色部分的关键词是“颜色曲线”。火焰不是从橙色变成黄色那么简单,它必须顺着温度递减的方向走:白色中心 → 亮黄 → 橙 → 红 → 暗红 → 透明。如果你只用静态的橙色贴图,粒子像一块块固体在飘,完全没有燃烧的层次。
4.1 从“0到1的变色”到“温度映射”
Niagara里的颜色曲线通常挂在Particle Update阶段,输入是粒子的相对寿命(0到1),输出是颜色。曲线里的横轴不是时间,而是寿命百分比。所以粒子0闪亮登场,0.5时烧得正旺,1.0时彻底熄灭。这个映射关系本质上是把“粒子的年龄”翻译成“火焰的温度”。
很多新手把曲线关键点加错地方,比如只在曲线末尾放一个深红色,导致前面全是白色,后面突然变红。正确的做法是让色彩在寿命区间内连续过渡,关键点放在0、0.15、0.4、0.7附近,而不是两头。
如果Niagara里没有现成的Color Over Life模块,可以手动创建CurveVector,再用Sample Curve节点采样。曲线类型选择Linear或者Cubic都行,Cubic过渡更柔和,但关键点太多容易过冲。第一版建议用Linear,好控制。
4.2 颜色曲线关键点参考表
这是一组我实测下来比较顺眼的颜色关键点,RGB值基于线性空间,sRGB下看可能会略有偏差,但你可以在材质或Gamma设置里调整:
| 相对寿命 | 颜色 | RGB参考值 | 透明度 |
|---|---|---|---|
| 0.0 | 白炽白 | (255, 240, 200) | 255 |
| 0.15 | 亮黄 | (255, 220, 80) | 255 |
| 0.4 | 橙色 | (240, 120, 30) | 230 |
| 0.7 | 赤红 | (180, 50, 10) | 180 |
| 0.9 | 暗红 | (100, 20, 5) | 80 |
| 1.0 | 黑红余烬 | (30, 0, 0) | 0 |
注意透明度也要放进曲线里。我见过有人只在曲线里配了RGB,然后单独用Opacity模块做淡出,结果颜色和Alpha不同步,火焰熄灭了还带着橙红色残影。把Alpha做进同一根颜色曲线的优点是,颜色和透明永远同步,不容易错位。
4.3 材质侧如何接住粒子颜色
Niagara输出的粒子颜色不是直接变成屏幕上的颜色,需要材质端配合。最保险的做法是:材质Blend Mode选Additive或Translucent,Shading Model选Unlit,然后用一个Multiply节点把Particle Color乘进Emissive Color。
如果是Additive混合,颜色越亮的地方叠加越强,火焰中心会自然发白,这个效果很讨喜。材质里的贴图采样出来是一个径向渐变带Alpha的火焰贴图,你需要让贴图的Alpha乘到Opacity里,RGB乘到Emissive里。别用默认的常量颜色,否则粒子颜色曲线全部白搭。
材质里还有一个坑:如果贴图是sRGB格式而粒子颜色在线性空间,会出现颜色整体偏灰或偏亮。我一般把贴图设置成线性空间,让粒子的RGB直接相乘。不同引擎版本的设置入口不同,但只要偏色了,第一个就该查贴图的色彩空间。
5. 透明淡出不是简单调低Alpha:排序、边缘与材质混合
标题里“透明淡出”看起来最简单,做起来最容易翻车。很多人直接把粒子的Opacity从255拉到0,发现火焰到后面变成一团半透明色块,边缘还有黑边。问题不在淡出本身,而在淡出过程里还要同时处理尺寸、排序和混合模式。
5.1 淡出的本体是“曲线”,不是把Opacity调低
火焰粒子生命后期的观感不是“变透明”,而是“变散”。我的做法是在粒子更新里加一个Size Curve:粒子初始尺寸25左右,中期膨胀到50到70,末期甚至可以再缩小或者保持不变但Alpha归零。尺寸增大的同时Alpha下降,看起来就是一团火焰越飘越薄、最后消失,而不是一个火球慢慢透明。
Size Curve和Alpha Curve的配合关键点在节奏:Alpha不应该均匀下降,应该前段保持较高,中段开始衰减,后段骤降。如果曲线太平,粒子像玻璃碎片一样透亮;如果曲线太陡,火焰会变成一阵烟。
5.2 为什么火焰用Additive比Translucent省心
半透明粒子最头疼的是排序。普通Translucent模式下,引擎要按粒子到摄像机的距离排序,火焰粒子叠在一起,排序不稳定就会闪烁、穿插。Additive混合模式则比较宽容,因为它只是把颜色加亮,不太在意谁在前面谁在后面。
做火焰我强烈建议先用Additive材质。它的缺点是火焰重叠区域会过曝、发白,但这个缺点在火焰里反而像高温区,视觉上更容易接受。如果非要用Translucent表现浓烟那种遮挡感,再单独考虑排序问题,不要一上来就和排序死磕。
5.3 贴图Alpha边缘和防黑边技巧
透明淡出的另一个坑来自贴图。火焰贴图如果边缘Alpha不是平滑降为零,而是硬切,淡出时就能看到方形的粒子边界。制作贴图时,要确保贴图中心是亮色、边缘Alpha渐变为0,最好是径向渐变。
有些引擎里还把Opacity和Depth做个Fade,让粒子靠近遮挡物时自动降低透明度,防止火焰碰到地面时看到硬切边。这个功能一般叫Depth Fade,推荐打开,数值按场景调个10到30左右。火焰如果靠墙太近,你会明显看到不打开深度淡出时的黑圈,打开后就不存在了。
6. 照这套思路调参时,最常见的五种翻车现场
前面几节是正向搭建,最后一个大节专门讲我在实操里反复遇到的翻车情况。因为很多人不是不会搭,而是搭完之后不知道怎么调参,只能凭感觉乱拖。
6.1 火焰像水柱,怎么看怎么不对
水柱感的本质是粒子运动太“直”。第一检查重力模块,关掉或只给极小的浮力;第二检查拖拽,如果粒子从头到尾速度都不减,水柱感很强;第三检查噪声,是不是还没接到力或速度上。如果这三个都改了还是直,就把锥角调大一点,让初速方向有更多随机。
6.2 火焰像烟花,炸得到处都是
烟花感通常是噪声强度过大,或粒子寿命太短。噪声强度超过100以后,粒子的轨迹会被扯得很散,像爆炸后的火星。把噪声强度降到20到40,同时稍微提高寿命,给粒子一个从膨胀到收敛的过程。记住火焰是连成一片的,不是一颗一颗飞出去的。
6.3 颜色只有红和橙,没有白色高温区
如果火焰从头到尾都是橙色,说明颜色曲线的关键点没有把白色放在寿命0的位置。去看看颜色曲线横轴,是不是曲线只在0.2之后有值。如果用的是CurveVector,确认采样输入是0到1的相对寿命,而不是实际秒数。用秒数做输入会导致所有粒子都落在高寿命区间,颜色根本变不过来。
6.4 粒子边缘发黑,像烧焦的纸片
黑边基本固定在两个地方:贴图Alpha不是渐变,或材质用了Standard Transparent但没有Depth Fade。先换一张边缘柔和的贴图,然后把混合模式改成Additive,黑边会直接消失。如果你必须用Translucent,再把Depth Fade拉高一点。
6.5 粒子在某个角度看突然消失或闪烁
这个一般不是材质问题,而是粒子排序或贴图压缩问题。Additive已经解决大半。如果还闪,检查Sprite渲染器的Sort Order,或者把粒子的离屏剔除关掉。个别情况下是贴图用了压缩格式导致Alpha不舒服,换成高精度Alpha贴图就能解决。
最后分享一个我自己的调参顺序:先把初速和拖拽调出上升趋势,再开噪声,让粒子学会摇晃;然后上颜色曲线,确认白黄橙红层次出来;最后才做透明淡出和材质混合。这个顺序能帮你快速定位问题在哪一层——如果火焰还是假,翻车点大概率在运动层,而不是材质层。你按这个顺序从前往后排查,比在材质里反复改混合模式有效得多。我做火焰最大的经验就是:素材用最简单的贴图,运动用噪声和曲线撑起来,别一上来就堆一堆模块。火焰不是靠复杂,是靠配合。