虚幻引擎学习之路:粒子系统篇(二)

在上一篇虚幻引擎学习之路:粒子系统篇(一)中,UWA介绍了粒子系统的结构以及Type Data类型的Module。本文将继续介绍其他类型的Module以及LOD和Vector Field功能。

在此,特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核,并在UWA团队学习其引擎的道路上提供的大力支持。

一、Module 功能

1.1 Required

Required Module是粒子系统Emitter中默认添加且不能删除的Module。它包含了Emitter以及时间、渲染相关的设置,例如:材质、发射器的位置和朝向等,如下图所示:

设置不同的粒子系统材质能够渲染出不同颜色以及纹理的粒子。通常粒子系统材质采用的Blend Mode是Translucent。并且在编辑材质时,需要用到Particle Color节点来修改粒子颜色,如下图所示:

其中,上图红色框显示了材质设置中Blend Mode的设置,绿色框显示了使用Particle Color节点获取并修改粒子颜色。最终渲染结果如下图所示:

1.2 Light

类似于Unity引擎中粒子系统的Lights组件,Unreal 4引擎粒子系统同样支持为粒子系统添加光源来照亮场景,如下图所示:

其中,左图红框显示了Unreal 4引擎中Light Module的设置,右图红框显示Unity引擎中Light Module的设置。下图显示了具有光源属性的粒子系统渲染结果图:

需要说明的是,在Unreal 4引擎中,Light Module只能用于CPU粒子。GPU粒子暂时还不支持光源的功能。

1.3 Collision

类似于Unity引擎粒子系统中的Collision组件,Unreal 4引擎同样支持粒子的碰撞检测,如下图所示:

其中,左图红框显示了Unreal 4引擎粒子系统的碰撞设置,右图显示了Unity引擎粒子系统的碰撞设置。下图显示了带碰撞检测的粒子渲染结果:

其中,绿色粒子被发射出之后碰撞到地面和Box后会产生反弹。

1.4 Event

类似于Unity引擎中的粒子系统事件处理,Unreal 4引擎同样支持触发事件以及事件响应的功能,如下图所示:

其中,左图红色框显示了Unreal 4引擎中粒子系统触发事件的设置界面,右图红框显示了Unity引擎中粒子系统触发事件的设置界面。Unreal 4引擎支持不同类型的粒子事件,包括:粒子生成、发射、消失、碰撞时触发以及在Blueprint脚本中响应等,可以在左图中Type参数中设置。并且,可以通过Custom Name参数设置事件名称。在Event Receiver中可根据事件名称对不同事件进行处理。

左图中绿色框显示了粒子系统发射器中接收并处理事件的两个Module。其中,Event Receiver Kill All是用于在接收到事件时删除该Emitter的所有粒子,Event Receiver Spawn则是用于在接收到事件时生成新的粒子。其设置界面如下图所示:

其中,在Source参数列表中可设置事件的类型和名称,用于响应指定类型和名称的事件。一个Event Generator可以生成多个事件,一个Event Receiver只能处理一个事件。但一个Emitter支持添加多个Event Receiver来处理不同的事件,如下图所示:

Unity引擎也同样提供了三种事件响应类型:Kill,Ignore,Callback。其中,Kill表示事件触发时删除粒子,Ignore表示忽略该事件,Callback表示在C#脚本中对该事件进行处理。

1.5 Camera Offset

Unreal 4引擎中Camera Offset Module可以实现将粒子根据相机位置进行位移的功能。其设置界面如下图所示:

其渲染效果如下图所示:

其中,红色和绿色粒子大小相同,但红色粒子距离相机距离增加了30个单位。

1.6 Vector Field

Unreal 4引擎支持使用向量场驱动粒子运动。向量场由一组在空间中分布的向量表示粒子在该位置时的速度或加速度。Unreal 4引擎采用体素表示向量场,每个体素中保存了向量的x,y,z分量。引擎支持在Maya中制作向量场并导出成.FGA格式文件然后进行导入。FGA文件为纯文本文件,如果不想用Maya制作,仅仅做为测试使用,也可利用Github上的开源工具[1]自动生成。下图显示了将向量场导入Unreal 4引擎后的可视化结果:

其中,红色细线表示了空间中向量的方向。

Unreal 4引擎中向量场仅支持GPU粒子,因此在创建粒子系统时需将Emitter的Type Data设置为GPU Sprites。向量场的类型有两种,局部和全局。局部向量场只影响该Module所在的粒子系统,而全局向量场则会影响空间中所有粒子系统。本文以局部向量场为例,可在Emitter中添加Local Vector Field Module,如下图所示:

其中,上图红色框显示了对向量场资源文件的设置。对于全局向量场,需要将资源作为Actor放入场景中。上图绿色框中的两个参数:Intensity和Tightness分别用于控制向量场对粒子作用的强度和方式。其中,Tightness取值为[0, 1]之间。当取值为0时,向量场表示了对粒子施加的力,它会将其中保存的向量值累加到粒子速度。当取值为1时,向量场表示粒子的速度,它会将其中保存的向量值赋值给粒子速度。此外,还可通过VF Init Rotation、VF Rotation Rate、Vector Field Scale以及VF Scale/Life等Module对向量场的旋转和缩放进行调整。下图显示了向量场中粒子系统渲染结果:

二、LOD 功能

Unreal 4引擎粒子系统提供了LOD功能。当粒子系统距离相机较远时,可通过LOD降低渲染的开销。在Unreal 4引擎中创建粒子系统的LOD比较方便,只需先将LOD0的粒子系统制作好,然后点击工具栏中的Regenerate Lowest LOD,引擎便会自动创建最低级的粒子系统。默认情况下创建的LOD1粒子系统的所有设置都继承自LOD0,但发射粒子个数被降低到1/10,如下图所示:

其中,左图为粒子系统LOD0设置及渲染结果,右图为引擎自动生成的LOD1设置及渲染结果。默认情况下,LOD1中除了Spawn之外的其他Module都不能被修改。如果需要修改,则需通过右键->Duplicate from Higher菜单将其设置为可修改,然后即可进行编辑,如下图所示:

其中,红框显示了RequiredModule的Details面板为灰色不可编辑状态。绿色框显示了通过右键菜单可将其变为可修改。如果需要添加更多LOD层级,可点击工具栏Add LOD按钮,引擎会在LOD0和已生成的最低级LOD(LOD1)之间生成新的LOD。新的LOD会复制LOD0的设置,但可通上述右键菜单进行编辑。

然后,在粒子系统的LOD设置中,可设置不同距离使用不同的LOD,如下图所示:

其中,上图红框显示了LODDistance的设置,在距离相机[0, 500]范围使用LOD0,距离相机500以上使用LOD1,渲染结果如下图所示:

其中,场景中使用了两个相同的粒子系统。近处的粒子系统渲染出红色粒子表明其使用了LOD0进行渲染,远处的粒子系统渲染出绿色粒子表明其使用了LOD1进行渲染。

此外,Unreal4引擎对粒子系统半透明渲染的Overdraw做了优化。在ProjectSetting->Rendering > Optimization中有一个渲染Enable Particle Cutouts by Default选项,如下图所示:

开启该选项后,引擎会自动根据粒子纹理可见部分生成相应的几何面片,从而减少透明度为0的像素浪费情况,如下图所示:

上图取自Unreal 4引擎官方文档[2]

其中,上图左图红线为粒子系统原始面片,右图红线为开启优化选项后的面片。

三、小结

以上,则为Unreal 4引擎粒子系统学习系列中的第二部分,重点介绍了Unreal 4引擎中粒子系统的重点模块和高级功能。在后续的文章中,我们就Unreal 4引擎中的新粒子系统Niagara进行详细的介绍。

参考文献

[1]https://github.com/LuggLD/EasyVectorFields/releases

[2]https://docs.unrealengine.com/latest/INT/Support/Builds/ReleaseNotes/2016/4_11/index.html

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180118A0PJNC00?refer=cp_1026

相关快讯

扫码关注云+社区