在Unity中,还有一种完全不同的创建VFX的工作流,VFX Graph。VFX Graph能够生成出和粒子系统相同或更好的效果。
相比于粒子系统,VFX Graph的一个最大的好处是它能够在保持应用良好性能的情况下,模拟出多得多的粒子。对于VFX艺术家来说,他们的主要职责之一是确保他们制作的特效不会影响应用整体的可用性和帧率,因此性能优化是非常重要的。
VFX Graph是基于节点的(node-based) 编辑器。相比于基于组件的(component)粒子系统来说,它看起来更加复杂。
VFX Graph能够同时处理百万级别的粒子,而粒子系统同时能处理的粒子数要小于VFX Graph。
VFX Graph产生处更加复杂的效果,比如开头的那个精灵,对于粒子系统来说几乎是不可能实现的。
VFX Graph对于初学者来说,上手难度相比于粒子系统来说更大。
VFX Graph有更严格的硬件需求(具体的硬件需求和相关文档,可以参考这个链接Requirements and compatibility | Visual Effect Graph | 12.0.0),在部分设备上可能无法使用。
VFX Graph运行在GPU上,Unity的物理计算被放到了CPU上,因此VFX Graph的粒子不能和应用的其它物理效果进行交互(比如和地面产生碰撞)。粒子系统是跑在CPU上的,因此它们能够和基于物理的(physics-based)组件进行交互。
如果我们的经验很丰富并且需要创建出非常复杂的效果,或者效果需要百万级别的粒子支撑,可以选择VFX Graph。
如果我们并非专家,并且只想创建出一些简单的效果,这些效果能跑在所有设备上,或者效果需要和场景中其它基于物理的物体进行交互,则使用粒子系统。
下面两张图是一个天气效果的对比,这个效果需要模拟的粒子数量是100万个,分别用粒子系统和VFX Graph来实现。
粒子系统只有可怜的5.6FPS。
VFX Graph在模拟出百万粒子的情况下,仍然有100 FPS的表现。
1. 将前面笔记中所制作的环境粒子关闭掉(Inspector中设置为inactive即可)。
2. 在Assets -> CreativeCore_VFX -> VFX -> Samples中,拖动天气VFX Graph预制体中的一个(案例选的是Snow_VFXGraph_Prefab.prefab)到Heirarchy中。
3. 将这个新添加的物体位置移动到空中,让场景看起来像是在下雨或下雪。
1. 选中VFX Graph物体的情况下,定位到它的Visual Effect组件,这个组件的图标是一个小灯。
2. 选择Edit按钮打开VFX Graph窗口
3. 重新安排一下窗口布局,能够同时看到VFX Graph和场景。
在开始编辑VFX Graph之前,我们可以先尝试着在编辑器区域进行移动导览,熟悉一下。和Shader Graph或者动画状态机编辑器类似,VFX Graph中主要的导览方式有:
平移(Pan): 按住鼠标中间并拖动,或者按住Alt(Windows)或Option(MAC),点击鼠标并拖动。
缩放(Zoom): 滚动鼠标滚轮。
聚焦和放大(Focus and zoom in):选中一个元素按F键。
适应窗口(Fit to window):按A键。
我们先来整体看看VFX Graph,它有四个主要的节点,从上到下垂直分布。这四个默认的节点被称为上下文节点(Context Nodes,或简称Context)。
第一个上下文,控制粒子的生成,和粒子系统的Emission模块功能类似。
默认情况下,一个新的VFX Graph使用常数的粒子产生速度(spawn rate),但我们可以改为变量方式、周期方式或bursts方式,正如之前烟雾特效所做的类似。
1. 调整Rate属性,让VFX Graph版本的特效和之前用粒子系统做的天气特效的Rate一致。
这里的spawn rate可以设置到一个很大的值,同时对FPS影响较小。
初始化粒子上下文控制粒子最初在哪里出现,以及如何出现。这个上下文包含了许多粒子系统主模块中的相同的属性,包括粒子的初始大小,形状,速度,生命周期和最大数量等。它也包含了粒子系统中Shape的等价属性,定义了粒子产生的容器的形状。
2. 配置初始化粒子上下文,让VFX Graph版本的效果和原来粒子系统所做的天气效果看起来差不多。
更新粒子上下文控制着粒子从产生到消失期间粒子的变化。这个更新操作每一帧都会运行。包含了和粒子系统里类似的属性:Color over Lifetime, Size over Lifetime,Noise(VFX Graph里叫做Trubulence)以及Texture Sheet Animation(VFX Graph里叫做Flipbook Player)。
每种行为能够在上下文中作为一个新的Block被添加进来。比如上图的Turbulence就是一个Block。
3. 尝试通过在Context中点击右键并选择Create Block来使用创建新的Block。我们可以通过子菜单里的搜索框来搜索要添加的Block。
输出粒子上下文控制每个粒子的外观,和粒子系统里的Renderer模块功能类似。在这里我们可以为粒子指定材质。
4. 配置输出粒子上下文,让VFX Graph版本的效果和原来粒子系统所做的天气效果看起来差不多。
1. 在Project窗口(注意不是Heirarchy)中,点击右键,选择Create -> Visual Effects -> Visual Effect Graph,然后将这个新建的VFX Graph放到Heirarchy中。然后再场景中将其移动到你想要放置的位置。
2. 在Project窗口中双击VFX Graph打开VFX Graph编辑器窗口。
3. 尝试修改一些Block,看看能不能达到你想要的效果,比如爆炸的礼花效果。
接下来我们来看一个专业级的VFX Graph例子,来感受一下复杂的VFX Graph长什么样。
1. 在主菜单中,选择Window -> Package Manager,然后选择Visual Effect Graph。在右边的面板中,展开Samples,然后选择Import导入VisualEffectGraph Additions。
2. 样例会自动导入到我们在Project窗口中打开的目录中。找到Bonfire(可以直接在Project window的搜索框中搜索),将其拖入到Hierarchy中。
3. 在Project窗口中,双击Bonfire打开VFX Graph编辑器,来看看graph。
和粒子系统的子系统的概念类似,bonfire也是由几个子图构成:Smoke,Flames 和Sparks。每个子图通过一个节点分组(node group)连接到了一起,中间还增加了随机的风向。
我们还注意到,这些VFX Graphs使用了Operators,Operators是连接到main context的更小的节点。
Operators允许我们使用数学计算和逻辑表达式来自定义行为,对于更加复杂效果的模拟来说至关重要。
VFX Graph能够很轻易地和快速地变得复杂。随着复杂度的增加,效果也会变得更加复杂丰富。
关于VFX Graph更详细的说明,可以参考官方文档:
Visual Effect Graph | Visual Effect Graph | 6.9.2-preview