请阅读博客第 1 部分。
音效和对白
对于音效本身的制作来说,其实与其他影视类游戏(Cinematic Games)没有太大区别,作为一个注重沉浸体验的作品来说,我们希望让玩家在游戏中体验到更真实的音响效果,更丰富的声音内容,而这一切都是由每一个声音细节决定的。在游戏中,我们变划分了多种脚步材质,多种碰撞材质,通过Switch功能进行切换,尽可能配合场景需要,以还原材质本身应有的声音效果。
Footstep Material Group
在Wwise中,我们大量的使用了Random Container,尽可能让每一个声音都拥有多个样本,避免玩家在短时间内听到重复的音效(UI除外),以减少机械性的触发。对于某些特效来说,我们则尽可能的在导入Wwise前将效果制作好,一是这样可以有更多的插件进行选择,二是可以减少Wwise内插件的使用数量,以降低CPU的消耗。在对白处理上,Wwise内部的多语言系统能够让我们很便捷的使用和管理多语言素材,但大多数情况我们仍然需要将本地化语音从新导入DAW工作站,进行相应的修剪或是效果器的渲染,以保证不同语言之间在效果,时长上的一致性。
AI System Chinese
AI System English
AI System Japanese
最后,无论我们在Wwise内以何种音频格式进行压缩,游戏中都可以顺利的读取到原素材文件中的Marker信息,这对于台词文本的调用十分便利,一定程度上节省了很多工序。
动态音乐
由于VR游戏的时长通常少于其他平台游戏,《除夕》的音乐量并不算很大,游戏内音乐总数大概在30首左右。这其中,仅有一半数量的音乐采用了动态音乐系统。对于一些无需特殊处理的过场音乐和气氛性环境音乐来说,我个人更推荐将其放置在Actor-Mixer Hierarchy下当做一个“SFX”来处理,而非放置在Interactive Music Hierarchy下。因为在某些情况下,Actor-Mixer Hierarchy的Source Editor反而能够更容易的实现我们想要的效果。这里举一个简单的例子:当我们有一首音乐”Menu_Music”,每次播放时都需要从起始点A开始,并在中间的B点和结尾的C点区间内无限循环时,在Actor-Mixer Hierarchy下只需要如下图中设置好循环点即可。尽管此时我们无法像音乐模式一样按照节拍对音乐进行定位打点,但由于整体思路非常简洁,只需要设置好合适的Crossfade Duration,并稍作调整即可完美的实现。
Music Loop in Source Editor
然而,如果该音乐被当做动态音乐处理,除非我们从新导入或将其复制成分段的Segment,否则我们只能利用Transition的功能来实现我们上述想要的效果。具体方式是:
我们需要首先将音乐的AB段设置于其实坐标1的前端,将其作为整首音乐的Pre-entry。
Pre-entry
然后通过设置Transitions的对应规则,让其实现B到C段的无线循环。
Transitions Rule 1
Transitions Rule 2
注意,此时Any到Menu_Music和Menu_Music到Menu_Music这两条Transition的定义并不冲突,它规定了:
1.当从任意时刻(其他音乐,或静音)时切换并播放Menu_Music的时候,永远从起始点A开始播放。
2.当从Menu_Music自身切换并播放Menu_Music的时候(如从C点切回B点的时候),不会播放A到B段。
当然,以上例子仅仅是想用来表示,如果在不需要动态音乐处理的情况下,我们完全不需要将音乐放置在Interactive Music Hierarchy下。很多时候Actor-Mixer Hierarchy的功能能够更好的实现静态音乐的处理。
由于《除夕》的游戏流程整体偏线性,我们并没有使用多过于复杂的动态音乐设计,这里简单的和大家分享在动态音乐上的制作方式。对于动态音乐来说,横向分段和纵向分层是最常用的手法。横向,我们可以按照乐段来将音乐进行分割,通过State等方式实现音乐片段的调转和组合。纵向,我们可以按照音乐的内容如配器、声部等进行分层,通过RTPC来实现不同层级之间的切换,重叠,过渡等效果。以游戏中的一首战斗音乐为例,音乐本身大致分为三个阶段:PreFight(进入战斗区域),Fight(触发战斗)和End(战斗结束)。每个阶段的音乐都由一个或多个Music Track组成。同时,Fight音乐还有两个不同的版本,每次从PreFight进入到Fight阶段,都会按照事先设定好的概率随机选择一个版本播放,当音乐切换到End阶段时,也会根据当前Fight阶段音乐的版本,调用相对应的结尾,来结束音乐。
Dynamic Music Demonstration
虽然音乐本身的整体逻辑并不复杂,但想要确保在任何情况下切换乐句都不会出现明显的缝隙,就需要对该音乐的Transitions进行完善的设定。
Music Transitions Rules 1
而游戏中的另一首战斗音乐,则采用了纵向处理的方式,当游戏满足一定条件时,通过RTPC来切换两个Music Track之间开关或音量比例。
最后,除了Wwise内部的设置以外,作曲家和Wwise工程师的相互配合也非常重要。一个好的动态音乐需要在作曲阶段就进行设计,并找到最合理的方式进行音乐的导出和分割。
混音(Mixing)
我个人认为混音是游戏音频制作中最难也最具挑战性的部分,需要根据反馈和需求不断的调整Wwise内部工程设置已达到理想效果。除了在实机上进行测试外,频繁的使用Soundcaster进行各种极限测试也是最直接有效的办法之一。由于SONY的SCE插件对于音频的下混行为是在PSVR内部通过其封装的libAudio3d音频终端实现的,因此如果想要在PC上测试到准确的声音,还需要配合Sulpha的使用。同时,善于查看Profiler和Voice Monitor来准确的找到问题和快速的解决方案也十分重要。对于《除夕》的音频工程来说,除了一些常用的混音方式如Ducking和Side-chain设置以外,我们还会根据某些特殊音效,做一些独特的处理。例如,游戏中有几部便携式录音机(Voice Recorder),用于播放NPC的留言信息。在很多游戏中,这种涉及剧情信息的重要对白通常会在播放时,通过Ducking或Side-chain等方式将其他声音弱化,以保证玩家不错过重要信息。而这里我们并不希望使用过于明显的人工手法进行处理,而是利用了VR游戏的互动特性。由于Listener的位置位于人物模型的头部,因此,我们将录音机的Attenuation在1个单位内进行了夸张的处理。
Voice Recorder Attenuation
当玩家拿起录音机靠近耳边时,可以清晰的听到录音机的播放内容,而当玩家将录音机远离头部时,迅速降低录音机的音量,这样,玩家可以自行选择,是要聆听录音机中的内容,还是游戏中的其他声音。
Voice Recorder
在Bus的设置上,我们对部分音效Bus谨慎的使用了HDR设置,同时也通过HDR的参数来控制着整体音频的动态。尽管绝大多数VR游戏都推荐使用耳机作为主输出设备,但这不代表不需要考虑用电视和家庭影院等其他设备输出的情况。动态上,我们将游戏输出设备大致分类为:耳机,TV喇叭,家庭影院级别的音箱。赋予每个输出方式一个特定数值并与Wwise内的Game Parameters挂钩,然后根据玩家的选择,用RTPC去控制总线压缩器的参数,HDR的参数,甚至是某些特殊Bus的Make-up Gain,已达到最终控制动态的效果。这其中,最难处理的应该是当玩家选择使用TV作为输出设备,因为大多数TV的音箱动态十分有限,加之不同品牌的TV,喇叭的质量又残次不齐,因此我们尽可能的让TV下音频输出的动态相对小一些以保证绝大多数声音都能被正常的听到。在总线上,我们选择了比Wwise自带的Limiter效果更好的McDSP ML1作为终端控制。Wwise中的McDSP ML1与传统ML4000中的ML1略有不同,对于过载信号的削波失真控制的更好,从某种角度上来讲,它在总线上的作用并不只是个Limiter,同时还发挥着Maximizer的作用。
McDSP ML1
工程设置和优化
由于VR游戏本身对于机能的消耗较大,加上SONY官方对于VR游戏帧数有着严格的限制要求,因此游戏工程的整体优化也显得尤为重要。很多情况下,音频需要进行适当的让步以留取更多的CPU给动画,程序等。在这《除夕》中,我们使用了ATRAC9编码格式。作为SONY自家的音频格式,ATRAC9在Playstation机型上有着很好的硬件支持,可以大幅减少CPU和内存的损耗,以下是ATRAC9最高质量设定和Vorbis(Quality = 8)的耗损对比:
CPU Usage Under ATRAC9
CPU Usage Under Vorbis Q8
可以看出,最高设定下的ATRAC9要远比Vorbis(Quality = 8)的损耗小很多,而二者在听感上也并没有明显的区别。
在Wwise内的Bus层级结构设置上,需要考虑的因素也很多,比如是否符合当前项目类型,是否符合当前功能需求,同时还要考虑后期优化时,一些Bus的插件或Ducking等设置能否进行最优的分配。可以说,每一个项目都可能有符合自己的独特的层级结构设计(Hierarchy Design)。对于《除夕》来说,我们将Bus大致分为了HRTF和非HRTF Bus两类。
Bus Hierarchy
可以理解为,游戏内所有的3D点声源,都会经过Ambisonic管线进行渲染,然后通过HRTF插件输出。而所有的2D声源如音乐、UI等音效,或者我们希望按照原始通道配置进行播放的声音(如Ambisonic格式的环境或Quad格式的环境),都会直接根据原素材的声道设置进行配置并播放,但不经过HRTF插件。这是由于HRTF插件在将信号转换为Binaural时会强制按照3D Position的方式对声音进行下混,导致声音无法按照原始通道设置的内容播放,比如一个Stereo的声音在经过HTRF插件下混后,原本只出现在左通道的声音,现在同样也会出现在右声道。总结来说,3D Bus下的所有子Bus,我们都使用了Ambisonics 3rd order的通道配置。对于2D Bus来说,则根据音效本身的通道设置选择Stereo,Quad或是Ambisonic等。至于HRTF插件的选择,Wwise提供了很多第三方插件支持如Auro 3D、Steam Audio、ReakSpace3D、Oculus Spatializer和Mircosoft Spatial Sound等。这些插件的本质作用大体相同,但由于不同厂家的算法差异,最终效果也各不相同。而对于《除夕》来说,由于游戏基于PSVR平台,因此在PS SDK内部已经集成了其自家的Spatial Audio功能:The PS4 libAudio3d feature set。所以在Wwise内部,我们需要使用SCE 3D Audio插件(SCE 3D Audio Plug-ins),将3D音效通过SCE Audio3d Object Panner进行输出,无需在Bus加载任何其他的HRTF插件,否则就会造成声音的冗余。好在Wwise的Unlink功能可以单独设置不同平台上的插件选用,让我们根据平台需求自行选择。
最后,我们按照关卡场景的不同对Bank进行了拆分。每关都会加载通用Bank和当前关卡的独立Bank,以避免单一Bank体积过于臃肿。而对于多语言项目来说,Voice部分的Bank必须独立于其他音效的Bank之外,否则,同样的音效会被重复生成在相对应的多语言文件夹里,给Bank总体积带来了不必要的增加。对于不同的项目来说,Bank的拆分方式可能截然不同,同时,拆分的越细,对于内存的压力越小,但相反和程序之间的沟通配合就越繁琐,所以这里还是希望大家根据自己的项目情况,选择最合理的拆分方式吧。
结语
感谢阅读,希望文中的内容能对大家有所帮助,也欢迎大家对文章进行交流和指正。最后送上一首《除夕》结尾的主题曲:
旋转的罗盘(Revolving Compass)
作曲&词:Eddy Liu
演唱:Dubi
瞳孔在放大天空盘旋着乌鸦
停止了呼吸没有了挣扎
恶魔的咆哮萦绕我却不害怕
黑暗的尽头才是我的家
命运的罗盘永远都无法停下
绚丽的花朵总开在悬崖
是谁在这里守护不朽的神话
乌云散却后是否有彩霞
破碎的心,耳边靡靡之音
想要看清他却只留下一个背影
抓不住的叫宿命
让我们静静聆听
掉落花瓣
子弹旋转 好像
滴答滴答滴答滴答
It's my Dream
是谁在耳边唱起那段旋律
让我们停止厮杀
回忆却慢慢风化
泪水静止在我的脸颊
评论