Unreal4 粒子系统的关键概念0042bate1
粒子系统的关键概念
在虚幻中使用粒子以及级联粒子编辑器时的一些关键概念.
粒子系统 和 级联 粒子系统编辑器都是灵活并强大的。然后,在开始真正动手干活前,有一些重要的概念需要预先了解。这篇文章的目的就是要介绍这些重要概念,为粒子系统如何工作提供扎实的原理基础,但并不讨论界面使用上的细节,也不对特定粒子效果如何制作进行说明。
粒子特效的模块化做法
关于级联的主要的概念就是对粒子系统进行模块化的设计。在一些其他软件的特效功能中,比如 Maya,一个粒子效果要创建的话需要先定义大部分行为的属性,然后用户再对这些属性进行修改来获得希望中的效果。
在级联中,则是另外一种做法,一个粒子系统创建后只有很少的 最基础 的属性,以及一些行为模块。
每个模块代表了粒子行为的一个特定方面,并只对行为的该方面提供属性参数,比如颜色、生成的位置、移动行为、缩放行为,及其他等。用户可以在需要的时候添加或者删除一个模块,来进一步定义粒子的整体行为。由于这里的结果中只有必要的模块才会被添加进来,因此并没有额外的计算,也没有不需要的属性变量的参与。
最棒的是,模块可以很容易的被添加、删除、拷贝,甚至在一个粒子系统中从其他发射器实例化过来,一旦用户熟悉了有哪些可用的模块和它们的功能后,制作一个复杂的粒子系统也会变得非常容易。
默认模块
Required 必需和 Spawn生成 这两个模块是永久模块,无法从发射器内移除。其他一些模块都可以按需删除。有些模块在粒子发射器默认存在。在一个新的面片发射器 - 粒子系统的关键组件 - 被添加到粒子系统中,一下这几个 默认 模块都会随之创建:
Required - 这里包含了一些属性,都是对粒子系统绝对需要用到的属性,比如粒子使用的材质,发射器发射粒子的时间,以及其他。
Spawn - 这个模块控制粒子从发射器生成的速度,它们是否以 Burst 生成,以及其他和粒子发生时机有关的属性。
Lifetime - 这里定义了每个粒子在生成后存在的时间,如果没有这个模块,粒子则会一直持续下去。
Initial Size - 这里对粒子生成时的缩放比例进行控制。
Initial Velocity - 这里对粒子生成时的移动进行控制。
Color Over Life - 这个模块用于控制每个粒子的颜色在过程中如何改变。
模块分类
有很多模块可用于粒子发射器上。为了避免混淆,这些模块分为以下几种类别:
初始状态 vs. 生命周期
在使用粒子模块工作的时候要对两个概念有所了解,他们是 初始状态 和 生命周期 或者叫 每次生命 属性。
初始状态 的模块一般用于管理粒子被生成那一刻的各方面属性。
生命周期 或者 每次生命 的模块是为了对粒子的生命过程中对它们的属性进行修改的方面。
比如,初始颜色 的模块能够为粒子生成那一刻指定颜色属性,而 生命周期颜色 的属性则是用于在粒子生成后,直到被消亡前的这段过程中逐渐修改颜色的行为。
模块时间计算
如果将一个属性设置为 distribution 的类型,那么它就会在时间过程上发生变化,有些模块使用"相对时间"而有些模块使用"绝对时间"(下面的 distribution 部分有更多说明)。
绝对时间基本上就是外部发射器的计时。如果发射器的设置是每个循环 2 秒,一个三次循环,那么在这个发射器内的模块的绝对时间将是从 0 到 2,会运行 3 遍。
相对时间在 0 到 1 之间,表示每个粒子在生命周期中的时间。
发射器,粒子系统,以及发射器 Actor
在使用级联制作粒子效果的时候,需要始终记住每个对象之间的互相作用关系。在这篇文档中我们已经讨论了模块的概念,但模块只是粒子特效中的一个组件。总的来说,粒子系统的组件包括模块、发射器、粒子系统,以及发射器 Actor。可以用以下描述来记住这些概念之间的关系:
模块,定义粒子的行为,并且被放置在一个发射器中。
发射器,为展示效果发射特定行为的粒子,任意个发射器可以被同时放置在一个粒子系统内。
粒子系统,作为 内容浏览器 中的一个资源,可以被一个发射器 Actor 来引用。
发射器 Actor,是一个放置在关卡中的东西,用于定义粒子在场景中如何使用。
粒子的运算
当使用粒子系统时,了解运算的次序也是很重要的。在级联编辑器中,列表区域的每列都代表了一个发射器,一列中的每个块代表一个模块。运算时的次序如下:
发射器的运算是根据发射器的列表从左往右的。
模块的计算按照堆栈列表从上到下的。
发射器类型
正如特效本身有各种不同的类型一样,发射器也分为不同的类型来制作各种特效。下面是目前可用的发射器类型:
需要注意的是,无论什么类型,发射器默认都是面片发射器。可以添加不同的发射器 类型数据 模块,改变发射器的类型。
Sprite Emitters - 这是发射器的基本类型,也是用的最广泛的类型。使用始终朝向摄像机的多边形化的面片(2 个多变形组成)作为单个粒子发射。可以用来做烟雾、火焰特效,以及其他各种种类的效果。
AnimTrail Data - 用于创建动画的拖尾效果。
Beam Data - 用于创建光束效果,比如镭射光、闪电等类似的效果。
GPU Sprites - 这是特殊类型的粒子,在运行时大量计算交给 GPU 执行。这将 CPU 的粒子特效计算从几千的数量级提高到 GPU 计算特效的几十万的数量级,取决于具体的目标系统上 GPU 的类型。
Mesh Data - 不再发射一系列的面片,这个类型的发射器将会发射多边形模型。用于创建岩石块,废墟等类似的效果。
Ribbon Data - 这个会产生一串粒子附属到一个点上,能在一个移动的发射器后形成一个色带。
参数
特效系统中并不是每个部分都可以被预先定义下来。有时候,特效系统中一部分需要在运行时被控制及变化才能做到好的效果。比如,想要做一个魔法效果,该效果会随着能量的消耗而有变化,而能量消耗是基于施法行为的。在这种情形下,就需要向特效系统中添加参数。
一个 参数 是指一种能够将数据发送给其他系统,并从其他系统接受数据的属性,其他系统包括蓝图、Matinee、一个材质,或者其他来源。在级联中,几乎任何一个给定的属性都能够被设定到一个参数上,也就意味着属性能够从粒子系统外部来控制。
举个例子,将一个火焰特效的 Spawn Rate 设置成参数并在游戏中实时的根据玩家情况来增加或减小该数值,就能让玩家控制火焰特效的强度。
相反,在粒子系统中添加到模块中的参数,也能用来驱动其他系统。比如驱动一个在关卡中放置的给定材质的颜色。
在级联中,参数通常是通过 Distributions 的方式来建立的,这也是处理一个属性上数据的方式。
粒子的光照
粒子系统可以被设置为接受光照,这需要特别去设置。
要设置光照粒子的话:
材质要使用除 unlit 以外的 shading model。使用 DefaultLit 将能够处理法线贴图、高光等。
在级联的 LODSettings 中(在 LOD 属性中,可以看到这是所有模块和发射器都会处于非选中状态),每个 LOD 中有一个标记叫做 bLit。该标记需要被勾选。这个标记只能在级联中更新。
遵循这些过程将使粒子在游戏中以光照模式显示。它们从发射器的位置接受光照,因此要移动原始的位置观察一下光照效果,或者在附近放置动态光源。
细节级别(LODs)
粒子系统很轻易的变得非常消耗性能。即使是使用 GPU 粒子时,虽然已经将大量的粒子运算转移到 GPU 上,但仍然需要考虑不同的粒子离玩家的远近以及它们产生的实际效果。
比如,假设有一堆营火,如果靠近看的话,可能会看见火焰的余烬和火花在烟雾中显现。然后,如果观察点在几百米远处,余烬的效果会小到比任何显示器一个像素的尺寸还小,那何必还在这上面进行运算?
这时就需要细节级别(LODs)的介入。LOD 系统能够自定义距离范围,超过一定距离后粒子系统则会自动简化。每个距离范围对应一个 LOD。简化的介入就是使用较低的数值,禁用一些模块,甚至禁用一些发射器。比如上面举的营火的例子中,最好就是一旦玩家远离了一定的距离后就彻底的禁用那些创建火花的发射器。
粒子系统可以有任意数量的 LODs,并且可以为每个 LOD 设定距离范围。
Distributions
Distribution 是一组数据类型,以特殊的方式处理数据,比如为一个数值应用一个范围,或者使用曲线来对数值做插值操作。如果粒子系统需要任何随机属性,或者粒子需要随着时间进行变化时,就需要使用一个 distribution 来控制属性。
在级联中的很多模块的属性中都可以看到使用了各种不同的 distribution。属性的实际数值就是通过 distribution 来设置的。
有 5 种主要的 distribution 类型:
Constant - 这表示一个静态不变的常量。
Uniform - 一个 Uniform Distribution 提供了一个最小值和一个最大值,输出这两个值之间(包含这两个值)的随机数值。
Constant Curve - Constant Curve 提供了一个数值的简单曲线。在这个类型下,时间通常是指一个粒子从生成的消失的过程,或者说是粒子的起始时间和结束时间。
Uniform Curve - Uniform Curve Distribution 提供了最小曲线和最大曲线,最终数值在这两个曲线中间来选取。
Parameter - 这种类型的 Distribution 使得该属性参数化,以便于它能够被外部系统,诸如蓝图、Matinee 或者其他系统读取或改写。
这些 Distribution 的每种类型对浮点型和 Vector 型都单独存在。比如,这里有 Float Uniform Curve 和 Vector Uniform Curve 两种 Deistribution。然而无论是使用 Float 型还是 Vector 型的版本,Distribution 是由类型来决定,用户并没有选择。比如对于 Color(这是一个包含了 RGB 的 Vector)只能使用 Vector Uniform Distrution,但 Lifespan(单个 Float 变量)只能使用 Float Uniform Distrution。