为了充分提炼full immersion模式下的沉浸感特性,数字音乐表演成为了这次的预研发选型。不同于常规的移动端开发,vision pro凭借其性能上的巨大优势,让开发小组就效果的潜力摩拳擦掌(懂的都懂)。由于此前开发的工具已经具备了角色及部分主题场景UGC的基础,单独的材质移植测试也做过两轮,综合下来使得资产部分的压力相对较小,留给VFX的空间就显得特别美妙了。于是组内一拍即合,既然是踩坑测试,找准方向后就最大程度尽情试错。 考虑到VFX开发环境的支持和渲染效果,在vision OS原生与unity引擎中我们选择了后者并采用URP渲染管线。主要原因得益于之前unity的开发经验积累,允许我们的小组在有其他并行任务的同时,快速搭建起开发框架并且进行尝试,以达到用快速验证的方式进行敏捷开发,在验证中建立流程形成标准。当然,测试的重心特效部分也遵循这个方法,于是便迎来了第一步,也就是进行技术选型的关键测试。

- 技术选型与关键测试: 这是除去单一主题测试外,小组第一次在AVP平台进行全流程开发,无法仅凭借苹果官方公布的硬件数据和一些机构的主观评测,去推导我们想做的内容。资料有限,需求需要进一步明确。即:支持哪些?支持多少?为了细化这个问题,我们进行了一个复杂PBR材质场景压力测试,反推出:同屏三百多万面,两百多个batch,至少1024贴图,运行40~60帧。明确了这样一个范畴之后,VFX设计师所关心问题的测试也在逐步进行中:

-是否支持VFX graph? 是。

-VFX graph粒子运算效率有多高? 简单材质下,在有场景角色的情况下,6万左右还是很流畅的,但和粒子的大小和重叠有关,和发射的mesh复杂程度也相关,如果粒子size大,重 叠多,则会严重掉帧。

-是否支持ASE编辑材质? 是。

- 是否支持后效? 是。

-是否支持timeline? 是。

- 是否支持音频分轨? 是。

-能否实现音频的视觉化? 有难度,但是能!

几轮测试后摸清了动态材质效果、音频视觉化、particle system、VFX graph,确认了其正常的表现范围。 大量反射、体积光、毛发、半透折射,这些内容确实要慎用。但就设计上来说,角色的活 灵活现,体积光的替代方案,激光效果的运用,巨物大效果的视觉冲击,可大可小的灵活空 间,完全忽略物理定律自然规律的数字优势,如果调整好资源的配置,已经有相当广阔的发挥空间了。其中,最为出彩是的音画配合的流程开发部分,我们将音乐部分用AI工具进行了分轨处理,把人声、鼓点、电吉他等元素拆分出来,分别用不同的视效呈现其节奏及波形,在视觉上做“交响”。针对这一部分的工作流拆解,下面就说说如何“看见”声音。

· 音频视觉化的流程拆解: VFX graph中自带的工具Spectrum,当把音乐赋给它,就可以把音乐转成频谱图像,从而在VFX graph中就可以直接调用,也就通过粒子把音频展示了出来。

如视频中展现,地面黑黄相间的粒子块儿就是使用了spectrum的VFX graph,简单的实现了 音频视觉化的效果;中间黑色的方块,有红色的条纹不断地闪现,就是上面所说的将音乐转 成频谱图像的表现了。这种转换方式在单轴上表现出了频谱的变化,有些像是条形码对吧? 只不过是随着音频的变化而不断的表现出不同的图像,这些信息在X轴上就足够表达出来 了,所以,在Y轴上没有什么变化,这也就意味着获得采样时,只考虑X轴就可以了。 假设有一块儿方方正正的舞台,且用粒子铺满了,计算这些粒子到舞台中心的距离,以这个 距离采样给频谱图,基本上就得到了视频中地面的律动效果。仔细观察可以发现,地面的律 动和小黑条上的频谱图像是完全对应的;小球的位置还做了进一步的处理,它代表了舞台上 的演员,屏蔽了所在地面的音乐影响,避免角色与跳动的舞台之间的穿插。

· 如何使用Spectrum: spectrum的使用方式很简单,下面介绍一下步骤: 首先选取指定的音频文件,并且导入到unity中; 建立起一个VFX Graph,并且添加Audio Spectrum Binder组件给它,如下图所示:

有两种方式可以把音乐加到粒子系统中。 第一种是把音乐加入到场景中,再选择刚刚给 VFX加入的spectrum组件,然后把场景中的音乐拖拽上去,如下图所示:

这里举例把一首名为jay的音乐文件加载上去。但这种方式有个问题,这个音乐并没有和VFX Graph一起存成预制体,在其他的场景没有办法直接引用; 另外一种方式是建立一个音源节点Audio Source给VFX Graph,这样就可以资源目录里把音 乐赋上去,同时可以勾选Loop,这样音乐就会循环播放,方便效果调试,如下图所示:

然后再把这个音源节点赋给spectrum,如下图所示: 这样,也完成了音乐和VFX graph的链接,好处是可以把这个VFX连带着音乐存成预制体 了。

在做好了外部的链接之后,就该处理VFX内部的调用了;VFX中管理外部调用功能的是 Blackboard,开启VFX的编辑,在Blackboard里建立两个对外链接的节点,一个uint类型, 一个Texture 2D,分别对应着Spectrum中的Count Property和Texture Property,命名要和 对应的属性保持一致,如果没有对相应的属性改名的话,应如下图所示: 就会发现这个脚本里的小方块由橙色转为绿色了,黄色警告叹号的内容也消失了; 完成了这些基础操作之后,可以正式开始音频视觉化的正式制作了。

在这里引入一个用VFX graph来实践的实际案例: 作为GPU支持的粒子,可以发射很可观的数量,放弃逐帧发射的模式,让其一次性发射 125000个粒子:

这个是计算过的,这是这个效果需要的总数量,我们用这些粒子来摆一个立体的粒子方阵, 长宽高分别有50个粒子,总共就是125000; 初始数值中,粒子的生命可以设置为和音乐同等的时间,这样,音乐播放结束,粒子也就清 空了,我这里图简单,就直接将这一项省去了;初始的大小,可以设置为10,这样比较明 显,方便后面效果的调整;这些粒子并不需要发射出去,所以,初始速度模块直接删除;然 后就是初始位置,做如下图的设置,通过这个Set Position(Sequential:ThreeDimensional)模 块的设置,可以设置阵列的初始位置;

output的部分做简单处理如下图:

然后在场景中就会得到立体方块列阵;

制作一张类似下图的贴图,赋上去,在Blend Mode中选择Additive的模式,因为这个模式会 把粒子的亮度叠的特别高,所以给予一个低亮度的颜色,就会得到如下图的效果;

接下来就尝试做个动态的效果,用以确定音乐在与其挂钩的基础有效性; 先计算每个粒子到中心点的距离,这样就可以得到一个渐变的球形,看我们能不能再这个结 构上做出动态的变化; 如上图,求出了每个粒子到中心的距离,如果把它直接连给颜色,很难看出由于距离不同而 产生的不同的变化,它会把颜色叠的特别亮;粒子的数量比较多,这也使得很难看到内部的 粒子表现;然后还要考虑到让它动起来,才能确定效果的基础,所以做了如下图的运算; 1.首先乘以0.03,这是一个试出来的数值,可以使得距离上的变化区间比较合适; 2.加上时间,可以让这个数值不断的变大,产生变化; 3.Fractional进行了求余的运算,使不断变大的数值变循环往复起来; 4.先乘再减,可以让数值的区间更加接近我们想要的,明暗明显,变化节奏鲜明; 5.clamp使得数值在正常的表现区间,不会出现负值,也约束了最大的亮度; 6.最后的这个乘以4,就是根据效果,最后调整一下亮度; 我们把这一系列的运算连给color,让它实时更新亮度变化,最后在渲染中再乘以一个紫色,就得到了一个节奏明显的动态效果;

这样,就得到动态的结果了,下一步就是要呈现出音乐影响的效果; 如图以距离作为“U”,忽略掉V,对音频进行了计算,同时,设定了振幅并将这个参数暴露出 去调整,如同上面那个0.03,这个振幅也需要一个很小的数值才能有个不错的效果;关于颜色,可以自行设计算法来使其表现出自己想要的变化;

把这个音乐球放在舞台上就呈现出了如下面视频中的效果;

这里就是将一个平面上的粒子,以方形mesh为粒子形状,音乐采样到中心距离的情况下, 影响粒子的高度变化;

这个又降低了一个维度,对一条线上的粒子做音频影响,可以同时影响位置,高度,颜色等 等,中间高两端低的呈现方式并不是把音频引入直接获得的,而是做了lerp差值算法得到 的,算法不唯一,自由发挥; 。关于Spectrum的扩展 上面所使用的音频视觉化,均是以VFX graph为载体呈现的。但万事万物皆可与音乐一起律 动,那么,官方提供的spectrum就需要扩展的其他的效果应用上,你需要个加强版的 spectrum。 这里你可能需要TA或是程序的支持,Unity中有一个API :GetSpectrumData,可以用于获取 音乐的频谱数据,然后对这些数据进行处理以创建频率带 使用CreateFreqBands8() 函数用于创建8个频率带。它计算每个频率带的平均值,并根据音 频频谱数据分配给每个频率带的强度,最后将结果乘以指定的频谱功率

在对应的模型挂上脚本后,需要使用固定Properties名称以确保参数传入shader,强度对应 的名称是_SpectrumOutputDB,创建以_SpectrumOutputDB命名的float变量后,我们就把 参数导入shader了。但是在这之前还需要处理一下数据,由于音频文件高低值跨度过大,所 以会导致这个参数会有大于1小于0的情况出现,这个在shader中控制明度值时,小于零或 者大于1会出现出错,所以我们还需要用remap重新映射参数范围 这样,材质上音乐表现就可以创造了;说到了音乐的频谱,直接使用起来会发现还是相当不 好用的,因为我们能听见的声音大部分都发生在频谱的左侧,对于整体而言,大都是“低频”,这也意味着可以通过调整spectrum的算法来进行优化,从而免去了大幅调整粒子系统 内部或是Shader内部算法的工作。

· 特效的综合使用 VFX graph呈现了数量化,阵列化的特点,那么也安排了其他的效果打配合

特效的综合使用

这个舞台背后巨大的屏幕,就是由多层多个复杂的材质构成的,在音乐的高潮阶段呈现出来;视频中看到的是所有的层叠加在一起时展现出来的效果,在实际的show中并不是这样 出现的,分了很多个层的原因是方便随着音乐的变化调整动态表现不同的节奏。这种复杂的 效果,提现了材质的表现优势; 场景中也应用了很多unity中特效制作使用最多的,传统的particle system,下面角色手上不 断散发的有点像水粒子就是;

这里并没有事VFX graph,虽然VFX graph也可以轻松做到;VFX graph是基于GPU计算的 粒子,在整场表演里,我们已经使用了太多的GPU了,为了不再增加GPU负担,就选择了particle system。 可以注意到的是,角色身上也有发光的材质,还和音乐进行了联动,加上手上的粒子,是我 们强调角色的手段,下面几张截图,可以看出强调角色的必要性:

综合的使用,可以更好的调配性能效果比,表达的内容也更丰富有层次;在这里我们摈弃了过去所擅长的镜头语言控制,去除了破坏沉浸感导致眩晕不适的这种可能性,由于体验者有可能看向任何一个方向,只有通过全景、全方位的配置资源,不断测试、体验、替代方案、再测试……才是这个环节最大的工作量。在性能允许的情况下触碰效果的天花板,是预研发想要达到的目标,因此有很多资源被各种原因替换了下来,例如上面那个球形效果的spectrum案例就因为消耗过大而下场。

- 平衡效率效果,但充满变化之美:

Timeline,即这次使用的核心工具。这一工具拥有相对简单的结构和易于掌握的特性,对开发者比较友好,但在之前并没有于vision pro平台使用它的经验。这里需要注意,开始小组使用的VFX graph12版本并不支持Timeline中的control track,调整动画时粒子系统的时间线和Timeline的无法保持一致,导致前期工作效率提升不上来,随后update到14的版本这一问题得到了解决,如果你们面临类似的需求,也请注意这一点。以及一些展望,如果在后续的开发路图中能够支持多人协作,对于这样的项目类型也会有很大的帮助。 VFX graph,即本篇重点阐述的模块。很开心在这次尝试中使用到VFX graph,这是一个有着相当的自由度的粒子系统,Shader Editor、Houdini、Blender等软件及中间件在节点编辑的基础上能够最大限度为设计师提供自由创作的空间。这种自由度既体现在了算法上,同时也带来了复杂度,如Shader Editor给特效工作者提出要求的同时,也赋予了TA工作者效率控制的目标。从这个角度来讲,使用VFX graph的项目做到有效的工具化与规范化,会在最大程度上减少优化所带来的工作阻力。 音乐,即这场秀的基石。在选定音乐时,选中的这一首也许不是备选曲库中最好听的,但它有着清晰的段落感,并且逐级递进的优点,评估时想到如果可以实现画面上的段落配合,将会给体验提升一个层次。但由于一个月的时间节点,我们没有将这点做好,留下不少遗憾,希望能在未来的开发中补足。另外音乐本体也没有进行更细致的处理,这部分还是有不少可以预见到的深化内容,随着硬件的提升、更细致的音轨拆分、效果配合、环境音源在场景中的动态配置,相信会带来更立体的听觉体验,同时也呈现出了音频领域技术栈积累的客观需要。 篇幅仓促,本篇重点介绍了本次unity环境下vision pro踩坑开发的VFX部分,之后会进一步展开timeline和动力学的相关模块。预研成功后的产品化进程中,相信这些模块也会随着引擎版本优化而变得更易于使用,届时欢迎开发者朋友联系我们体验与交流,探索空间计算中不同模式下新的交互和表现的可行性。

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐