利用 VFX 制作特效为作品赋能添翼

VFX Graph 是 Unity 的新特效工具,创作者们可以使用 VFX Graph 编辑器中的节点来设计特效。在广东省游戏产业协会与 Unity 中国联合主办的 IGDC 国际游戏开发者大会中,Unity 中国技术美术黄东俊先生以“利用 VFX 制作特效”为主题,讲解如何更好使用 VFX Graph,同时分享多项经典应用案例。VFX Graph 让科技与艺术紧密相连,为艺术家和游戏开发者提供丰富的创作空间,突破传统束缚,构建出游戏艺术新的语言方式。
请在 Unity 社区专栏(https://developer.unity.cn/projects/641174fdedbc2a34b85ad221)查看本文原文及高清动图、Demo 案例,持续关注 Unity 官方技术干货。

Hello,大家好,我是黄东俊,Unity 的技术美术。我今天和大家分享特效的一个制作工具,不仅可以制作非同反响、炫酷的效果,而且它模拟的数量级可以达到数百万以上级别。
VFX概述
我们先看一个概述。什么是 VFX?
下面这个界面就是 VFX 在制作特效时的过程。首先,它是一个次时代的特效工具。它可以制作一些很炫酷的效果,本身是基于节点的方式,而这种方式是行业的趋势。其次,它也是一个可编辑的、易扩展的工具。节点本身就是所见即所得的,可以随意拖拽一些效果,也支持用代码去扩展节点。第三,用户可以定义参数或定义事件。第四,因为这个工具本身是在 GPU 上面做计算的,它对设备的芯片有一定要求,需要支持 Computer Shader。

另外,这个工具是面向美术制作的,它可以让美术特效的制作非常丝滑,这是它本身是节点所带来的好处,也可以让美术同学扩展各种各样的效果。其次,节点其实是一个行业趋势,我们发布的可视化编程的工具,包括 DCC 工具、Houdini 这样的工具都是以节点去制作的。以前我们这个工具只支持 HDRP,现在也可以支持 URP。

另外,我想介绍一下 VFX 和传统 CPU 的粒子系统 Particles System 的区别:
第一就是粒子的数量。Particles System 只能模拟少于一万个的粒子数量,因为它需要用 CPU 计算,如果粒子数量太多,CPU 的压力会很大。我们新的 VFX 粒子系统可以模拟数百万级别的粒子数量。
第二,过去 CPU 的粒子系统一般来说只能模拟一些比较简单的粒子,像流体这种复杂的粒子模拟用 GPU 去模拟会更好。
第三,我们这个 GPU 的粒子系统并不是为了取代 CPU,它们各有优势、各有缺点。关于物理的方面,CPU 的粒子系统模拟一些物理时基于我们引擎的物理系统就可以做到,如果用 GPU 去模拟物理耗费的代价会更大,要计算数百万粒子级别的物理压力也会很大。
Gameplay 方面,过去的粒子系统其实做一些游戏逻辑业务的时候会更方便,新的 GPU 粒子去做游戏逻辑时,首先要把很多场景的数据传给 GPU,做起来可能会稍微复杂一点。
最后,我们的 GPU 粒子系统可以读取 Frame Buffers,去做想要的效果。

VFX关键概念
接下来讲一下 VFX 在制作过程中的一些概念。
我们把 GPU 的粒子系统分成三层。最下面这一层是特效的使用者,在设计好的特效上面进行调参,设置交互,暴露的参数可以用代码修改,不需要复杂的知识,适合所有特效/关卡艺术家/程序。第二层是特效制作家,可以在这个系统上生产特效资源。最上面这一层是开放给更高级的特效艺术家或 TA 同学,提供了自定义拓展的功能,note 和 block 都可以扩展,可以自己定义一些节点。

这三层在工作过程中简单展示如下图。最左边这一层是去编辑一些参数,中间这一层是特效师制作特效,最右边这一层是可以通过代码的方式扩展 VFX 的工具。

接下来我会讲 VFX 工具执行的逻辑。
首先,我们把这个工具定义为一个 contexts。类似于 MonoBehavior,粒子的产生、初始化、每一帧的 update、最后的输出渲染到屏幕上面,分为这四大块。四大块里面又有很多 blocks,去定义在每个阶段我们的粒子要执行什么样的事情,它是从上往下执行的。另外,特效师在制作粒子的时候会连很多节点,这些节点是从左到右执行的,然后把结果再输出给 contexts 里面的每个 block。

下面就是刚刚所说的 contexts,分为 4 个阶段:
第一阶段是初始化粒子,就是粒子怎么产生,产生的数量是多少。第二个阶段是初始化这些粒子的属性,可以在这里定义粒子的大小、速度和方向。第三个阶段执行更新逻辑,可以每一帧 update 粒子要做什么事情。最后 Output 阶段再把粒子渲染出来,我们提供了很多的选择,可以使用不同的 shade 去渲染粒子。我们也提供了一个事件的机制,比如粒子在某一个阶段里放完了,想放第二个阶段的粒子,可以通过事件的方式去播放另外一个阶段的粒子。

接下来介绍粒子生成的方式。我们提供了很多种粒子生成的方式,比如持续性生成、根据距离生成,或一次性把所有的粒子喷射出去。

第二是关于粒子属性的控制,我们提供了很多 blocks,可以让用户在初始化里定义很多种颜色、大小、速度、生命周期。

接下来讲一下粒子生成位置的方式。比如,可以按照一条直线的方式生成,也可以按照可编辑的圆锥、cycle 或 cube 的方式生成。

粒子的方向也可以做很多控制,比如按照它的生命周期改变粒子速度,或者在执行过程中提供一个新的方向或随机的方向。

上文 demo 中有一个传送门的效果,就是按照这种圆形方式去发射粒子。

我们在这里有一个粒场的概念,即怎样给粒子施加力。我们提供了很多方式,比如第一个就是 SDF 的方式,让粒子被 conform 到一个 SDF(Signed Distance Field)的表面,或者 conform 到一个比较简单的 mesh 上面。还可以用力场(Vector Field)的方式去提供粒子的方向。


另外,我们也做了一些碰撞处理。首先可以简单地用一个 AABox 或者是简单的 mesh,比如一个平面,去做一些碰撞。如果要在场景里面做比较复杂的碰撞,可以采样一张深度图作为一个碰撞。还可以把 mesh 生成一个 SDF,它会让粒子跟这个 SDF 发生一些碰撞。SDF 我们也提供了一个烘焙的工具,可以在这个工具上面生成一个 SDF 文件。

VFX实用功能
接下来讲一些 VFX 比较有用的功能。首先,我们提供了一个模块化的方式,可以自己定义一些 blocks。

这个是我们在资源制作管线方面的工具,比如用户可以拿到一些序列帧,在这个里面去合成一个 flipbook,帮助用户在播放特效的时候使用这些序列帧。

我们也制作了一些与 DCC 软件结合的工具,比如用 Maya、Blender 都可以直接输出资源文件到 VFX 使用。还包括更多序列帧工具、SDF 制作和量产的工具。

另外介绍两个工具,可以让 mesh 生成一个点云(point cache),或者将一个 mesh 转成 SDF。这些工具在拉下 VFX 这个包的时候都能看到。

VFX Demo
接下来介绍一些 VFX 制作的 demo。
下面是我制作的一个简单的 demo。这里大概有 10000 条鱼,可以跟着鼠标运动。它的制作方式很简单,如果没有 VFX 这个工具的话,用户可能需要写很多代码,但是利用 VFX 用户只需要写一个 Compute Shader,把这个 Shader 传到 VFX 里面。我们的 VFX 可以采样 Graph Buffer,只需要按照每个粒子的 ID 去采样,就可以生成这样的效果。

还有一个比较简单的例子——角色走过这些落叶的时候,落叶会往上飘。过去制作这个效果可能需要把角色的轨迹记录成一张 RT,再按照这些粒子去采样这个 RT,给它施加力。如果使用 VFX,只需简单几个节点就可以制作:首先把角色生成一个 SDF 的文件,然后根据粒子 ID 去采样这个 SDF,最后再根据采样结果施加一些力。我们也提供一个可以绑定游戏对象的脚本,它会实时更新这个对象的位置给 VFX。

查看更多 VFX 制作的炫酷 demo,可以访问 Github:
https://github.com/Unity-Technologies/VisualEffectGraph-Samples

