menu
 

《Scars Above》中的 Wwise Spatial Audio 实现流程

游戏音频 / 空间音频

这篇文章是关于什么的?
何为 Spatial Audio API?
Spatial Audio API 工作流程
Room 和 Portal
素材组织和命名规范
命名规范
Wwise 对象组织
Unreal Editor 素材组织
规划
定义区域
初始设置
Wwise 设置
Unreal Editor 设置
实现
第 1 阶段:Unreal Editor 端
第 2 阶段:Wwise 端
第 3 阶段:Unreal Editor 端
测试/故障排除
Wwise RoomVerb
Room 和 Portal
Ak Geometry
何为 Ak Geometry API?
Diffraction 和 Transmission Loss
何时使用 Ak Geometry API?
实现
测试/故障排除
Unreal Editor 端
Wwise 端
优化
通过与 Room 关联来优化 AkGeometry
针对完全凸起的 Volume 禁用 Diffraction
禁用地面
移除不再适用的 Portal
简化几何构造
根据平台设置 Spatial Audio
World Composition 问题
我们的定制解决方案
Custom Listener
VisualizeAkGeometry
SplineAudioWall
Weapon Tail 切换
最后总结

这篇文章是关于什么的?

在本文中,我将试着探究 Spatial Audio 的复杂性及其如何应用于我们即将发布的第三人称动作冒险游戏《Scars Above》。在《Scars Above》中,玩家会穿越很多不同的区域和空间。每个区域和空间都有自己的物理和声学特性。这些特性会对声景产生预期的影响,从而增强玩家的沉浸感和临场感。作为 Wwise 集成包的一部分,Audiokinetic 提供的 Spatial Audio API 已被证明在运用得当的情况下完全可以为玩家提供这样的体验。在前半段,我会面向声音设计师着重介绍技术层面的实现,并简要阐释如何在游戏中充分利用 Spatial Audio。在后半段,我会提供一些有关故障排除和优化的建议,并列举 Mad Head Games 为了完善 Spatial Audio 实现流程都采取了哪些措施。

在此,我们不对工程的设置或 Wwise 设计工具和 Unreal Editor 的幕后工作细作探讨。相信专门负责 Spatial Audio 实现的声音设计师应该都能熟练运用 Wwise 和 Unreal Engine。不过,本文可能遗漏的内容都可在线上文档中找到。所以,即便是初学者应该也能在此找到有用的信息。

本文是基于《Scars Above》撰写的,有些细节可能并不适用于所有项目。《Scars Above》使用基于 Unreal Engine 4.27.2 的自研引擎进行编译,并采用适用于 Unreal Engine 2021.1.9.7847.2311 的 Wwise 集成包打造。在开发当中,我们没有使用 Wwise Reflect。另外,我们选用了原有的 SoundBank 系统而非 Event-Based Packaging 来打包声音。为简单起见,我将在所有示例中使用 Wwise RoomVerb 插件,因为我们之前主要都是用它来做混响处理的。

何为 Spatial Audio API?

Spatial Audio API 是 Wwise API 的一部分。它包含了一系列用于模拟游戏声学环境的工具。利用这些工具,可准确再现声音的诸多声学属性(如反射、传播、衍射等),并以此模拟现实声学环境来作为对游戏关卡物理环境的补充。藉此,以丰富的细节构建身临其境的氛围,帮助玩家确定自己在空间中的方位,并为玩家提供周围动态的重要信息。

相信专门负责 Spatial Audio 实现的声音设计师对相应的工作流程应该都非常熟悉。在理想情况下,其通常会在关卡的白盒设计之后介入。此时所有 Mesh、Blocking Volume 和其他几何构造都已放好,声音设计师可从头到尾体验整个关卡。Spatial Audio 的实现可与白盒之后的其他关卡设计(如布景)同步进行而不应依赖于任何其他部门。不过要注意,Spatial Audio 的实现跟关卡布局中所做的各项更改密切相关。因此,有必要追踪关卡设计团队对关卡的设置。这样也方便他们对关卡做进一步的迭代。

对专门负责 Spatial Audio 实现的声音设计师来说,最好拥有 3D 建模的基础知识或在 Unreal Engine 中使用 Brush Editing 工具的实践经验,因为我们主要依靠 Brush Editing 工具为 Spatial Audio 所用的几何构造构建相应的模型。

Spatial Audio API 工作流程

Spatial Audio API 有两项独立功能可并行用于在游戏中构建所需的逼真声学环境:Room 和 Portal 以及 AkGeometry API。我会在本文稍后部分详细介绍它们的用法。

Room 和 Portal

摘自 Audiokinetic Wwise 文档:

为此,可将 Room 和 Portal 网络视为对周围几何构造的上层抽象(或者说细节程度较低)。适当地结合 Room 和 Portal 使用上层几何构造,可以让声学环境的模拟具有一定细节并且高效。”

在使用 Room 和 Portal 时,声音设计师要在声音子关卡中手动填充 "Room" 和 "Portal" Actor 以使其形成连贯的 Volume 网络。从某种意义上说,它们应当填满整个关卡的“负空间”。我喜欢将之称为“负空间”,因为它包括所有可传播或接收声音的空旷区域(比如通常充满空气的外部和内部空间)。与之形成鲜明对比的是坚实有形、实际存在的“正空间”,其由固体材料构成且当中不应存在传播或接收声音的对象。

在我们的游戏中,Room 由 "AkSpatialAudioVolume" Actor 类表示。这些 Actor 可覆盖关卡的一个或多个区域,通过定义其属性可实现各种各样的功能。比如,基于其侧面和边缘的反射、通过添加相应 Wwise Aux 素材生成的混响、Room Tone 的指派等等。"AkSpatialAudioVolume" Actor 有三个主要构成元素:Late Reverb、Room 和 Surface Reflector。它们全都绑定到 BrushComponent,分别实现不同的 Spatial Audio 功能。

Portal 则是不可见的 "AkAcousticPortal" Actor。它用于覆盖 Room 的各种开口,包括将两个 Room 连通的开口。这些 Actor 有一个绑定到 BrushComponent 的 PortalComponent。

所有这些 Volume 都是手动放置在关卡中的并且会覆盖上述“负空间”,其边界不会与 Mesh 和其他 Volume 以不想要或不符合预期的方式重叠。

素材组织和命名规范

Spatial Audio 工作流程涉及五种对象和素材。其中两种在 Wwise 端,三种在 Unreal Editor 端。在 Wwise 端,有 Wwise RoomVerb 预设(作为 ShareSet 层级结构的一部分)和 Auxiliary Bus(作为 Master-Mixer Hierarchy 的一部分);在 Unreal Editor 端,有 Audiokinetic Auxiliary Bus(作为 .uasset)、AkSpatialAudioVolume 和 AkAcousticPortal(作为关卡中的 Actor 类实例)。

Wwise 素材:

  • Wwise 混响效果器(RoomVerb、Convolution Reverb)预设
  • Auxiliary Bus

Unreal Editor 素材:

  • Auxiliary Bus
  • AkSpatialAudioVolume
  • AkAcousticPortal

注意:正如本文开头所述,我们仅以 Wwise RoomVerb 插件为例展示混响模拟,不过其他基于时间的效果器也都可以指派给总线。

命名规范

我们一致商定所有类型的 Spatial Audio 素材都应在名称中包含 AX 前缀。这跟我们的其他命名规范是一致的(SX 代表音效,MX 代表音乐轨…)。仅启用 Late Reverb 的 AkSpatialAudioVolume 会在 AX 后面附加 LR,同时用作 Room 的 AkSpatialAudioVolume 则会在名称中包含 Room 而非 LR。Wwise RoomVerb 预设和 Auxiliary Bus 素材采用相同的名称。它们的描述性名称是根据该关卡的 Spatial Audio 布局文档来取的(在下文“规划”部分有解释)。Unreal Editor 素材必须与 Wwise 中对应素材的命名方式相同。

Wwise 对象组织

Wwise RoomVerb 预设是 ShareSet 层级结构的一部分,其可在 Wwise 设计工具的 Project Explorer 的 ShareSets 选项卡中找到。对此,我选择了按照以下方式将预设放在与各个关卡对应的单独文件夹中:

image (1)

图 1 - "Reverb" ShareSet 层级结构

事实上,每个关卡区域都有自己的预设,其放在与关卡相关的文件夹中。稍后会详细介绍如何定义关卡区域。

我们要使用的另一种 Wwise 对象是 Auxiliary Bus。Auxiliary Bus 是 Master-Mixer Hierarchy 的一部分,其可在 Project Explorer 的 Audio 选项卡中找到(组织方式与 ShareSet 类似):

image (2)

图 2 - Wwise 设计工具中的 Master-Mixer Auxiliary Bus 层级结构

每条 Auxiliary Bus 都应创建为指向关卡的 Audio Bus 的子对象。这些 Auxiliary Bus 必须跟其对应 ShareSet 预设的名称相同,因为我们稍后要把各个 ShareSet 预设指派给其 Auxiliary Bus。

  • 在不同区域使用通用 Auxiliary Bus

在《Scars Above》中,我们采用了别的方法来组织和实现 Auxiliary Bus。除了为每个区域创建专用 Aux Bus(如上所述),我们还创建了两套通用 Auxiliary Bus 来用于无需为每个区域创建预设的情形。我们将这些总线分为了 Exterior 和 Interior 类型并为其取了描述性的名称。

image (3)

图 3 - 通用 Auxiliary Bus 层级结构

这种方法的优点是可将总线快速指派给关卡中的多个类似区域。不过,由于我们要在很多区域重复使用相同的 Aux Bus,倘若被认定为不合适,会无法编辑它们的预设。在《Scars Above》中,我们找到了一个很好的折中方案:为多样变化的地形创建专用预设,对差异不大的地形使用通用预设。

Unreal Editor 素材组织

如前所述,我们会使用三种 Unreal 素材:"Audiokinetic Auxiliary Bus" .uasset、"AkSpatialAudioVolume" 和 "AkAcousticPortal" Actor。

我们可以通过从 WAAPI Picker 拖放到 Content Browser 来创建 Audiokinetic Auxiliary Bus。

"AkSpatialAudioVolume" 和 "AkAcousticPortal" Actor 类是 Room 和 Portal API 的一部分。我们会将这些 Actor 直接放置在子关卡中。

  • Content Browser 内

如果我们打开 WAAPI Picker 并找到 AuxBus 文件夹,应当会看到跟之前在设计工具中创建的一样的 Master-Mixer Hierarchy。接下来,只需将 Audiokinetic Auxiliary Bus 素材从 WAAPI Picker 拖到相应的文件夹中即可。我们将在该文件夹中保存该关卡的 Spatial Audio 素材。如果仍在使用原有的 SoundBank 功能,则要打开各个 Audiokinetic Auxiliary Bus 素材并指派相应的 SoundBank。

image (4)

图 4 - WAAPI Picker 中的 Master-Mixer Auxiliary Bus 层级结构


  • World Outliner 内

关卡中的所有 Spatial Audio Actor 实例(列在 World Outliner 内)都要分组存放到 Audio 文件夹内的专用 Spatial Audio 文件夹中。为此,可在放置到关卡中之后将其移到该文件夹中。另外,建议为 AkAcousticPortal 创建一个单独的文件夹。

image (5)

图 5 - World Outliner 中的 Spatial Audio Actor 实例

规划

Volume 网络的构建有时会非常繁琐,尤其是在关卡较大、有很多不规则区域和交叉路径的时候。虽然这些空间可以增添画面的吸引力,但也会让 Spatial Audio 实现更加复杂,所以一定要进行合理的规划。

建议把关卡逐次分为大小不同的区域(我称之为“分区”)。在分区的最后,要为关卡制作好 Spatial Audio 布局文档。这个文档应当包含平面布置图并且其中要标明区域、Room 和 Portal 的位置以及区域的名称和优先级。为了正确地绘制布局草图,我们需要查阅与关卡设计相关的所有现有文档。另外,最好跟关卡设计师或游戏设计师探讨一下关卡本身的概念以及关卡要传达怎样的画面美学和氛围。对于较为复杂的关卡,在跟关卡设计师交流之后就会知道是否有不易察觉的房间、角落或通道。如果关卡设计团队已经构建了自己的分区,我们的素材最好使用与之相同的分区命名。

定义区域

区域代表在听觉和视觉上有明显区别的关卡部分,对素材组织和命名来说可以将其视为独立的地带。根据关卡的复杂程度,可将区域分为 General、Specific 和 Room(每一种区域都是前一种区域的子集)。区域未必由专用 AkSpatialAudioVolume 表示,也不一定会定义为 Room。根据 AkSpatialAudioVolume 代表的区域类型,会指派不同的优先级。其中,General 区域具有比 Specific 区域更低的优先级。

image (6)

图 6 - 举例展示如何将关卡分为多个 General 区域

根据区域类型确定优先级别:

  1. General 区域 – 优先级:1 或更高
  2. Specific 区域 – 优先级:2 或更高
  3. Room 区域 – 优先级:3 或更高

注意:在两个或多个区域可能重叠的情况下,同一类型的区域可具有不同的优先级。这时需要决定不同区域的优先级高低。倘若有多个重叠区域具有相同的优先级,系统会无法预测哪个区域处于活跃状态。

Specific 区域是 General 区域的一部分,它们之间有着明显的区别,因此需要在属于其父级 General 区域的 AkSpatialAudioVolume 内创建专用的 AkSpatialAudioVolume 实例并为其赋予更高的优先级。

image (7)

图 7 - 举例展示如何将 General 区域分为多个 Specific 区域

Room 代表室内和室外的空间。大部分是封闭的,个别地方有开口。这些开口通常要用 Portal 来覆盖。它是 General 或 Specific 区域的子集,并且具有比父级区域更高的优先级。在布局文档中,其由 Room 截图表示。该截图要描绘 Room 的大小和声学特性并标明其名称和优先级。

image (8)

图 8 - 举例展示 Room 的大致样貌

初始设置

在游戏中实现 Spatial Audio 功能之前,我们需要仔细考虑如何设定工程的初始设置并定义 Wwise 对象和 Unreal Engine 类的参数。

Wwise 设置

  • 启用 Diffraction and Transmission

要使用 Spatial Audio 的 Obstruction 和 Occlusion 功能处理声音对象,需将其纳入到衍射计算当中。为此,可在 Positioning 选项卡中启用 Diffraction and Transmission 选项。

image (9)

图 9 - Positioning 选项卡中的 Diffraction and Transmission 选项

对作为 Actor-Mixer Hierarchy 一部分的所有对象以及作为 3D 总线指派给 AkSpatialAudioVolume 的 Auxiliary Bus 来说都是如此。

  • 启用 Game-Defined Auxiliary Send

要将声音发送到 Room 的 Auxiliary Bus(即其 Wwise RoomVerb 效果器),必须启用 Game-Defined Auxiliary Send。为此,可选中要作为 Actor-Mixer Hierarchy 一部分发送的音频对象以及要将自身的混响效果器发送到其他 Room 的混响效果器的 Auxiliary Bus,并在与之对应的 General Settings 选项卡中启用 Use game-defined aux sends 选项。

image (10)

图 10 - 为 Actor-Mixer 启用 Use game-defined aux sends

对于未启用此选项的对象,游戏中的所有 Volume 的 Wwise RoomVerb 效果器都不会予以处理。

  • 全局 Obstruction/Occlusion 曲线

在游戏中加入 Spatial Audio 意味着将在运行时执行所有的计算,并决定要为发送到 Spatial Audio 引擎的各个 Game Object 做多大力度的处理。在这个过程中,游戏引擎会向 Wwise 发送两个主要参数:Diffraction 和 Transmission Loss。Diffraction 与声音的 Obstruction 量有关,Transmission Loss 则与声音的 Occlusion 量有关。

这些参数会对声音产生怎样的影响取决于 Obstruction 和 Occlusion 的 Volume、LPF 和 HPF 曲线。这些曲线可进行全局定义,也可按声音定义为 RTPC。

全局 Obstruction 和 Occlusion 曲线可在 Wwise Project Settings 的 Obstruction/Occlusion 选项卡下设置。

image (11)

图 11 - 在 Project Settings 中定义全局 Obstruction/Occlusion 曲线

在设置好这些曲线后,会自动对发送的所有声音加以处理,以便实施 Diffraction 和 Transmission 计算。

注意:建议在实施 Occlusion 计算时使用全局 Occlusion 曲线而非 Transmission Loss RTPC。这是因为基于 RTPC 曲线的 Transmission Loss 计算不会针对每条声音路径单独执行,而是会为每个游戏对象提供一个值。这意味着对直达路径所做的处理也会影响源自发声体的所有潜在衍射路径。在使用全局 Obstruction 和 Occlusion 曲线时,可对射线做独立的信号处理,并在对透射和衍射进行建模时提供更高的精度。

Unreal Editor 设置

  • Occlusion 刷新速率

除了 Spatial Audio 的 Obstruction 和 Occlusion 处理,还可使用 Unreal Engine 的内置 Occlusion 计算。在默认情况下会启用后一种功能,并且可与 Spatial Audio 并行使用。跟将 Spatial Audio 实现集成到 Wwise 工程中相比,Unreal Engine 的 Occlusion 功能比较没那么细致。如果决定改用 Spatial Audio 衍射,最好禁用 Unreal Engine 的 Occlusion 功能。

Unreal Engine 的 Occlusion 功能会通过 Ak Component 的 Occlusion 类别下的 Occlusion Refresh Interval 参数应用到游戏中的每个 AkComponent 实例。默认值为 0.2 秒。这意味着每隔五分之一秒就会为该 AkComponent 计算一个新的 Occlusion 值。若将该值设为 0,则将完全禁用 Unreal Engine 的 Occlusion 功能。

image (12)

图 12 - 将 AkComponent 的 Occlusion Refresh Interval 设为 0

因为要为游戏中的每个 AkComponent 执行所述操作,所以最好让编程团队的同事在 AkComponent.cpp 的构造函数中将参数的默认值改为 0.0f。这样以后就不用担心这个问题了。

  • 使用 Collision Preset

Collision Preset 可有效确保在所有 Spatial Audio Actor 上正确设置碰撞。为 Spatial Audio 创建专用预设意味着从一开始就会正确设置碰撞,其他开发人员不必担心更改他们的碰撞设置会影响我们的 Volume。

在《Scars Above》中,我们定义了两个 Collision Preset:SpatialAudioVolume 和 SpatialAudioVolumeBlock。因为 AkSpatialAudioVolume 不需要遮挡任何东西,只需要注册与之重叠的所有 Game Object,所以 "SpatialAudioVolume" Collision Preset 中的所有 Trace Type 都设为了 Ignore,而用于 Weapon Tail 切换和调试的 AudioTrace 则设为了 Overlap。

在 "SpatialAudioVolumeBlock" Collision Preset 中,AudioTrace 设为了 Block 而非 Overlap,其余则都设为了 Ignore。我们将在所有需要发送到 AkGeometry 的 Volume 和其他对象上使用此预设以防止听者进入几何构造内部。作为 Custom Listener 集成的一部分,我们将在文末对此进行详细的说明。

image (13)

图 13 - "SpatialAudioVolume" 和 "SpatialAudioVolumeBlock" Collision Preset

强烈建议不要在 Actor 上使用 Custom 碰撞,尤其不要在地图上使用其实例。Custom 碰撞会使开发后期追踪这些更改变得更加困难,并且 Collision Preset 的所有潜在更改都不会应用于这些 Actor。

实现

第 1 阶段:Unreal Editor 端

在这一阶段,我们要用 AkSpatialAudioVolume 完全覆盖整个关卡来为 Room 和 Portal 网络奠定基础。至于这些 Volume 是否会被视为 Room,要看声音设计师根据布局文档做了怎样的决定。一般来说,用于在室外模拟 Late Reverb 的 AkSpatialAudioVolume 不会被视为 Room 也不必严格贴合区域的轮廓,而作为 Room 的 AkSpatialAudioVolume 则大多用于室内且应严格贴合其所占空间的边缘。

image (14)

图 14 - 只包含 Late Reverb 的 AkSpatialAudioVolume 网络

image (15)

图 15 - 只包含 Room 的 AkSpatialAudioVolume 网络


  • 在关卡中放置 "AkSpatialAudioVolume" Actor

在使用 Actor 实例填充关卡之前,要确保当前处在相应的子关卡中。要想将其选中,需打开 Window 下拉菜单,然后选中 Levels 选项卡。在该选项卡中,找到并双击声音子关卡。之后,其名称就会显示在 Viewport 右下角。这时确认选择即可。

image (16)

图 16 - 正确选择声音子关卡

只需在 Place Actors 面板中选中该 Actor 类型并将其拖放到关卡中就可放置 "AkSpatialAudioVolume" Actor。

image (17)

图 17 - 在 Place Actors 面板中选中 "AkSpatialAudioVolume" Actor

在关卡中添加 Actor 实例时,应尽量让 Actor 的中心点靠近区域中央。中心点之所以重要,是因为它会通过 X、Y 和 Z 值定义 Actor 的位置。这些值可用于在 Profiler 视图和 Visualize Rooms and Portals 等调试工具中计算 Volume 的位置。另外,在通过 Volume 本身将事件作为房间底噪来发送时,中心点也很重要(稍后会详细介绍 Room Tone 功能)。

在关卡中放置 Actor 后,World Outliner 中会将相应实例显示为选中状态,并且与之对应的 Details 选项卡也会打开。在该选项卡中,可根据需要设定以下设置:

  1. Enable Surface Reflector:该实例是否会有不同的表面
  2. Enable Late Reverb:该实例是否会发送到 Late Reverb Aux Bus
  3. Enable Room:该实例是否会像 Room 一样运作

image (18)

图 18 - AkSpatialAudioVolume 设置

在选中 Enable Surface Reflectors 选项时,可将 Volume 的表面用作几何构造,并使用 Acoustic Texture 等定义其声学特性。在选中 Late Reverb 选项时,可使用此 Volume 来生成混响效果。我们可以假定所有用来描述布局文档中的特定空间的 AkSpatialAudioVolume 也要模拟其声学属性。在这种情况下,启用此选项显然是合乎情理的。在选中 Enable Room 选项时,可将此区域当做 Room 来处理。

除了 Details 选项卡中的这些设置,还要为 BrushComponent 指派 Collision Preset。为此,可单击 Collision Presets 下拉菜单并选择之前创建的 SpatialAudioVolume 预设。

image (19)

图 19 - 正确设置 "AkSpatialAudioVolume" Collision Preset

在此之后,需要根据 Spatial Audio 布局文档为 Late Reverb 和 Room 组件设置 Priority。

image (20)

图 20 - 为 Late Reverb 和 Room 正确设置 Priority

接下来,我们需要为 Volume 添加 Actor 标记,并据此在 Wwise 中设置 Interior/Exterior 状态,以便在切换 Weapon Tail 时使用(详请参见“我们的定制解决方案”部分)。根据 Volume 的属性(Exterior 或 Interior 及其大小),可选择四种不同的 Volume 类型:

  • Exterior;
  • Interior_Large;
  • Interior_Medium;
  • Interior_Small.

image (21)

图 21 - 将 Interior/Exterior 标记添加到 AkSpatialAudioVolume

最后,我们要在 World Outliner 中按照命名规范重新命名实例:前缀 AX,后跟 LR 或 Room(具体取决于 Room 设置),名称的其余部分根据布局文档来取。在此之后,要将 World Outliner 中的实例移到 Audio / SpatialAudio / <Level> 文件夹(见图 5)。

  • 使用 Brush Editing 工具调节 Volume 的形状

在这一阶段,我们要对 Volume 进行修改以使其贴合所占空间的轮廓。如果 Actor 不是 Room,只需追踪 Spatial Audio 布局文档中定义的 General 或 Specific 区域的线条即可。如果是 Room,则要投入更多精力来调节 Volume 的形状以使其紧贴所在区域的边缘,从而形成一个与其完全覆盖的区域十分相近的 Volume。

我们可以使用 Unreal Editor 的 Brush Editing 工具轻松完成这一操作。
遗憾的是,对其功能的深入探讨已经超出本文的范围。就像前面说的,专门负责 Spatial Audio 实现的声音设计师应当对该工具非常熟悉。另外,网上也有很多精心制作的教程可帮助各位迅速了解如何移动顶点和拉伸表面。毫无疑问,练习是关键。虽然刚开始可能比较难,但努力了肯定会有回报。

以下是一些操作技巧,希望对各位有所帮助:

1. 在 UE 4.x 版本中,Brush Editing 工具的快捷方式为 Shift+4;在 UE 5.x 版本中为 Shift+7;
2. AkSpatialAudioVolume 的 Details 选项卡中有个 Enable Edit Surfaces 按钮,单击可隐藏除该 Volume 以外的所有 Actor 并进入 Brush Editing 工具模式。单击 Disable Edit Surfaces 可退出工具并取消隐藏所有之前隐藏的 Actor;

image (22)

图 22 - AkSpatialAudioVolume 的 Enable/Disable Edit Surfaces 按钮

3. 在调节 "Room" Volume 的形状时,最简单的方法是同时选中并移动垂直边缘的上下顶点。这样可使顶点保持共面,从而减少三角形的数量;

BrushEditing1

GIF 1 - 同时移动两个顶点

4. 在 Viewport 的 Orthographic Top 或 Orthographic Bottom 视图中可轻松选中两个顶点;

BrushEditing2

GIF 2 - 在 Orthographic Top 视图中选中垂直顶点

5. 我试着先覆盖 Room 的其中一个主要开口,然后再以此为基础进行操作。在将边缘固定在开口处之后,便不必担心 Portal 的位置是否正确,因为有一个专门用于开口的表面;

6. 拉伸是添加新表面的最简单的方法。这样可以提供更多顶点以便进一步调节形状。但要注意所要拉伸的表面,不要做得太过了,否则可能会使 Volume 过于复杂而不好修改;

7. 在完成之后,看看能否找到可能已经不再适用的顶点。不要将其删除,而是找到想要保留的最近顶点,并将多余的顶点焊接到它上面。

BrushEditing3

GIF 3 - 焊接过时的顶点

素材在完成调节后应充分覆盖所在区域,紧贴其边缘,但不穿透相邻空间,也不与其他 Room 重叠。Room 重叠的话会给未被 Portal 覆盖的区域带来问题。在覆盖可能存在发声体或听者的区域时要特别注意,即便最终无法完全贴合周围的墙壁,必要的话也要调节 Volume,否则可能会遇到音量骤降或滤波不符合预期等声音再现问题。

如果发声体或听者通过未被 Portal 覆盖的表面进入 Room 的另一侧或另一个重叠的 Room,就会出现问题。因为 Volume 是看不见的,所以我们可能都没意识到在听者和发声体之间有个表面。如果听者和发声体处在不同的 Room,即使其可能在视线范围内,也要在它们之间的边缘附近计算新的直达和衍射路径。如果没有 Portal,这些路径可能会被阻挡或者太长,从而导致听者无法听到发出的声音。

Audiokinetic 的开发者已经注意到这种手动操作的繁琐性,他们正在努力想办法为我们提供加快这一流程的工具。AkSpatialAudioVolume 和 AkAcousticPortal 上的 Fit to Geometry 选项在处理简单几何构造(如带有立方形房间和走廊的建筑)时好像很好用,但在处理不规则的复杂区域(如我们游戏中常见的带有开口、角落和蜿蜒隧道的洞穴)时却无法很好地进行追踪。因为生成 Volume 后肯定还要做手动调节,所以在我们的游戏中没理由使用该选项。

Volume2

GIF 4 - 举例展示如何妥善放置 AkSpatialAudioVolume


  • 在关卡中放置 "AkAcousticPortal" Actor

跟 AkSpatialAudioVolume 一样,只需在 Place Actors 面板中选中该 Actor 类型并将其拖放到关卡中就可放置 "AkAcousticPortal" Actor。

在创建 Actor 实例后,World Outliner 中会将其显示为选中状态,并且与之对应的 Details 选项卡也会打开。在该选项卡中,我们要将 Portal 的 Initial State 设为 Open 或 Closed(默认为 Open),并选择相应的 "SpatialAudioVolume" Collision Preset。

接着,我们要在 World Outliner 中按照命名规范重新命名实例:前缀 AX_Portal,名称的其余部分根据布局文档来取。在此之后,要将 World Outliner 中的实例移到 Audio / SpatialAudio / <Level> / Portals 文件夹(见图 5)。

现在,我们需要将 Actor 的位置改为希望该 Portal 代表的开口所处的位置。为此,可使用 Translate、Rotate 和 Scale 工具调节其形状以完全覆盖开口。Portal 的 Y 轴应垂直于开口。也就是说,它跟两个空间之间的过渡是同一轴向的。另外还要注意 X 轴的方向,它定义了 Portal 的正面。Actor 在 Viewport 中会显示为黄色条带以便于确定朝向。

image (23)

图 23 - 举例展示如何妥善放置 AkAcousticPortal

通过缩放 X 轴,可定义 Portal 的宽度。该宽度代表两个声学空间之间的过渡区,可将其理解为与交叉淡变相对应的空间。Portal 越深,过渡越平滑。

AkAcousticPortal 有颜色标识,表明是否正确放置了 Actor。所有 Portal 都要至少关联到一个 Volume。除此之外,Portal 还要有 Front Room,以便跟 Back Room 区分开。如果没有 Volume 与 Portal 关联,或者 Portal 没正确放置在 Volume 之间,Portal 会显示为红色。

Portal3

GIF 5 - AkAcousticPortal 放置标识

注意:只有在 AkAcousticPortal 的位置刚好覆盖相邻 AkSpatialAudioVolume 的一条边时,其才能正常工作。如果位置放得不对,在听者处在 Volume 面与 Portal 相交的位置时,声音可能会被切断。这样在对 AkSpatialAudioVolume 进行建模时就要特别小心,因为要能修改 Volume 来确保其只有一个面覆盖整个开口。

在调节两个相邻 Room 的形状以形成网络时,我发现最好在开口处将这两个 Room 连通以使其之间没有空隙。这样可确保所有的过渡都通过 Portal 而非未被 Portal 覆盖的 Room 表面实现。

BrushEditing4

GIF 6 - 相互之间没有空隙的相邻 Room 网络


第 2 阶段:Wwise 端

在这一阶段,我们要使用 Wwise 设计工具为每个 AkSpatialAudioVolume 及其专用的 Wwise RoomVerb ShareSet 预设创建 Auxiliary Bus 并定义参数。

  • 创建 Aux Bus

如果按照“Wwise 对象组织”部分的步骤进行操作,所有 Auxiliary Bus 应当都已正确命名并处在 Master-Mixer Hierarchy 中的正确位置(见图 2)。在每条 Auxiliary Bus 的 Positioning 选项卡中,都可找到 Positioning、Attenuation 和 Diffraction 的相关设置。在此,我们需要启用 Listener Relative Routing 并将 3D Spatialization 设为 Position + Orientation。

自 Wwise 2019.2 版本起,无需再为 Auxiliary Bus 指定衰减曲线。它会计算从发声体到听者的距离,并将该距离应用于发声体的衰减。通过为 Auxiliary Bus 应用 Attenuation 曲线,可进一步处理经由 Portal 发出的混响。所以,如果觉得发声体的原始衰减所做的处理不够,可以添加 Attenuation 预设。

如果想让衍射和透射损失影响经由 Portal 传播的 Volume 混响,则应启用 Enable Diffraction 选项。

image (24)

图 24 - 正确设置 Auxiliary Bus 的 Positioning 选项卡

对于任何希望由其他 Volume 的 RoomVerb 效果器处理的混响效果器,都要在 Auxiliary Bus 的 General 选项卡中勾选 Use game-defined aux sends 复选框。

image (25)

图 25 - 启用 Auxiliary Bus 的 Use game-defined aux sends 选项


  • 创建和指派 Wwise RoomVerb ShareSet 预设

Wwise RoomVerb 预设是以事先定义的方式在 ShareSets 选项卡中创建的。其参数根据 Volume 的声学特性和声音设计师的审美偏好来设定(见图 1)。

在 Auxiliary Bus 的 Effects 选项卡中,要指派 Wwise RoomVerb 插件实例,并选择适宜的 ShareSet 预设。

image (26)

图 26 - 正确指派 Wwise RoomVerb 预设


第 3 阶段:Unreal Editor 端

  • 创建和指派 Auxiliary Bus

在这一阶段,我们要在 Unreal Editor 中创建 Auxiliary Bus 素材。为此,可将 Auxiliary Bus 从 WAAPI Picker 拖放到 Content Browser 中的相应文件夹,并将其添加到 SoundBank(如适用)。在此之后,便可将 Auxiliary Bus 指派给其 AkSpatialAudioVolume。

要指派总线,需选中 Volume 并在 Details 选项卡中找到 Late Reverb 类别,然后通过拖放或通过搜索名称来将 Auxiliary Bus 添加到 Aux Bus 属性。

image (27)

图 27 - 正确指派 Auxiliary Bus

  • Room Tone

前面已经提到要正确放置 AkSpatialAudioVolume 并设置其在关卡中的位置。如果决定直接在 Volume 上发送 AkEvent,则会通过 Volume 的定位和旋转来实现。这个时候就要用到 Room Tone 功能。Room Tone 会获取 Volume 的位置和旋转,而 Volume 的正面要面向声音的正面方向。如果在声音的 Positioning 选项卡中选择 Position + Orientation,声音的立体声像就会随着当前所在 Room 旋转,使声音听起来好像固定在空间中而显得更加逼真。

普通 AkAmbientSound 与 Room tone 的主要区别在于,只要听者在 Volume 之内,Room Tone 与听者之间的距离就是零。在听者离开 Volume 时,会将发声体放在最近的 Portal 处,并计算从 Portal 到听者的距离。在为 Room Tone 设定衰减曲线时,要牢记这一点。

测试/故障排除

Wwise RoomVerb

在 Wwise 设计工具中编辑预设时,无法分辨在更改参数后有何差异。因此,要在试玩游戏的同时测试这些参数。为此,我们需要启动游戏将其连接到 Wwise Profiler,然后在游戏当中更改效果器的值。如果声音具有明显的瞬态并应用有定位,且可在不同 Volume 之间移动并在必要时触发,就可以很容易地激发混响并分辨前后的变化。在《Scars Above》中,我经常使用 Kate 的近战攻击嗖嗖声,因为 Player Character 是随时可控的。

Room 和 Portal

Room 和 Portal 的故障排除主要就是查找未被 AkSpatialAudioVolume 充分覆盖的关卡部分。在不使用任何自定义工具的情况下,可通过手动控制听者(通常绑定到摄像机的弹簧臂上)并沿着 Volume 表面和周围墙壁相交的区域的边缘移动来逐步搜索。因为 Volume 在游戏当中是看不见的,所以要靠耳朵来听辨声音存在的问题。这些问题可能表现为音量骤降或处理当中的突然变化。比如在通过表面而非 Portal 离开 Volume 时,Diffraction 和 Transmission Loss 值突然变大。如果发现有问题的区域,要停止游戏并进一步修改 Volume,使该区域被正确覆盖,然后再次测试。

在编辑时,可在 Viewport 中看到 Volume 的边缘。藉此,可识别 Volume 对空间覆盖不足的区域。这些边缘用黄线表示。如果看到有线条从几何构造中伸出,就表示听者可能会通过线条所连接的表面进入未被 Volume 覆盖的区域并离开 Volume。这种情况很可能会导致声音出现问题。

image (28)

图 28 - AkSpatialAudioVolume 的边缘从周围几何构造伸出

如果您的团队通过其他方式(比如不可见的遮挡装置)遮挡摄像机及听者,可以尝试根据这些 Actor 来排列对齐 Volume。不过根据我的经验,最好将 Volume 放入在游戏和编辑器中都可见的 Static Mesh 中以确保听者无法穿过 Volume 的墙壁。当然,具体情况可能会有所不同,所以还是要做广泛的测试。

  • Visualize Rooms and Portals

Wwise Unreal 集成包随附有实用的 Visualize Rooms and Portals 工具。如果在 Project Settings 中启用该工具,就可在穿越关卡时看到 "AkAcousticPortal" Actor 实例及其与相邻 Room 之间的通路。虽然不能显示 AkSpatialAudioVolume 的边界,但该工具提供的信息还是非常有用的,因为我们可以看到 Portal 和 Volume 中心点的位置是否正确。

image (29)

图 29 - 在游戏当中启用 Visualize Rooms and Portals 选项

Visualize Rooms and Portals 是 Wwise Integration Settings 的一部分,在启用之后会对 DefaultGame.ini 做相应的更改并提交到存储库中。所以在提交前务必将该工具禁用,除非希望整个团队都能看到 Portal(如果是这样的话,就等着 QA 投诉吧)。

如果您的编程团队有空闲时间,强烈建议为 Spatial Audio 构建自定义调试工具。为此,我在程序员的帮助下设计并实现了名为 VisualizeAkGeometry 的 Spatial Audio 可视化定制解决方案。对此,我会在文末跟其他自定义工具一起介绍。

Ak Geometry

何为 Ak Geometry API?

Ak Geometry API 包含一整套 Wwise 工具。藉此,可模拟声音在固体障碍物周围的衍射和表面的反射。它可以跟 Room 和 Portal API 配合使用。

Diffraction 和 Transmission Loss

衍射是指声波在从发声体到听者的路径中受到障碍物阻挡而在障碍物边缘以一定角度弯曲并在到达听者时出现音量降低、频谱受限的现象。如果构成障碍物的材质不允许声音通过,衍射路径会优于直达路径成为主要声源。这时会将虚拟发声体置于障碍物的边缘。

在发声体和听者之间的障碍物很大以至于声音无法绕过边缘时,会产生透射损失,而只留下穿过障碍物的直达路径。根据障碍物材质的属性,声音会被部分或完全阻挡。这种情况也表现为音量降低和频谱受限。

Diffraction 和 Transmission Loss 是 Ak Geometry API 的一部分,用于定义 Wwise 中的 Occlusion 和 Obstruction 参数并完全替代 Unreal Engine 的 Occlusion 系统。利用这些参数,可调节 Wwise 对象的 Volume、HPF 和 LPF 曲线,从而准确模拟声音被阻挡和遮蔽的声学现象。

何时使用 Ak Geometry API?

比方说,我们在一个新建的 Room 里,中间有根由一个 Static Mesh 组成的石柱,然后我们想让声音在石柱上发生弯曲和反射。在这种情况下,可向其添加 AkGeometry 组件来接收 Mesh 的碰撞,并将其转换为 Spatial Audio 可辨识的几何构造。此几何构造可近似表示 Wwise 引擎中的关卡几何构造,并用于直达和衍射路径计算以及 Diffraction 和 Transmission Loss 参数值的设置。

如果用在目前没有发生衍射的区域,效果会更好。比如,被仅用于 Late Reverb 模拟的 Volume 覆盖的外部区域。在这种情况下,需将 AkGeometry 组件手动添加到要包含在 Spatial Audio 计算中的所有 Static Mesh。在未填充复杂 Mesh 的关卡中,这样操作起来会比较便捷。对于包含大量三角形的 Mesh,添加 AkGeometry 组件可能成本就太高了。在此,我们可以运用自己的 Brush Editing 技能,使用 AkSpatialAudioVolume 来覆盖障碍物,并创建复杂程度低很多的几何构造。

结合 Room 和 Portal、Ak Geometry 组件以及 Volume,我们可以通过阻挡或遮蔽的方式成功覆盖所有需要对声音产生影响的区域和障碍物。

实现

我们可以通过两种主要方式来实现 Ak Geometry 功能:向现有 Static Mesh 添加 AkGeometry 组件,或者调节 "AkSpatialAudioVolume" Actor 的形状来覆盖一个或多个 Static Mesh(或其他类型的障碍物)。

将 AkGeometry 组件添加到 Static Mesh

将 AkGeometry 组件添加到现有 Static Mesh 包括几个步骤。首先,要在 Viewport 中选中 Actor(会在 World Outliner 中高亮显示),接着单击 +Add Component 按钮来查找 AkGeometry 组件。

image (30)

图 30 - 将 AkGeometry 组件添加到 Static Mesh

然后,要选中所述组件并将 Geometry 类别下的 Mesh Type 参数设为 Simple Collision,同时启用 Enable Diffraction(如尚未启用)。

image (31)

图 31 - AkGeometry 组件的 Details 选项卡

在有些情况下,这种解决方案的成本可能会过高,因为不太好控制组件生成的几何构造的复杂程度。虽然我们使用的是 Simple Collision 而非 Complex Collision,但其仍有可能过于复杂甚至无法正常运作,所以在使用的时候一定要特别注意。如果 Static Mesh 没有 Simple Collision,就要创建一个 Simple Collision,或者联系我们的 Tech Art 团队来寻求帮助。

将 AkSpatialAudioVolumes 用作 AkGeometry

如果不想向 Mesh 添加 AkGeometry 组件,出于优化方面的考虑,一般可改用 AkSpatialAudioVolume。为此,需在关卡中添加 Volume 的 Actor 实例,并对其形状进行调节以充分覆盖 Mesh。在 Volume 的 Details 选项卡中,要启用 Enable Surface Reflectors,并禁用 Enable Late Reverb 和 Enable Room。另外,还要确保启用 Enable Diffraction,并为其指派 "SpatialAudioVolumeBlock" Collision Preset。

image (32)

图 32 - 在 Static Mesh 附近正确放置并设置 AkSpatialAudioVolume

对此,我们可以使用 "SpatialAudioVolumeBlock" Collision Preset。藉此,可通过 Volume 来遮挡与 Custom Listener 绑定的 AudioTrace 通道。这样就能在更短时间内创建较为简单的 AkGeometry Volume 而不必担心听者会进入 Volume 边界之内。有关 Custom Listener 的更多信息,请参阅本文的我们的定制解决方案部分。

  • 在现有 Room 上启用 Diffraction

要想在现有 Room 周围衍射声音,需在 Details 选项卡的 Geometry Settings 类别下启用 Enable Diffraction。

image (33)

图 33 - 在 AkSpatialAudioVolume 上启用 Diffraction

在不完全凸起的 Volume 上一定要启用 Enable Diffraction,因为我们希望在 Volume 向内弯曲的边缘附近产生衍射。

image (34)

图 34 - 凹形 AkSpatialAudioVolume 带有选定边缘(如启用 Enable Diffraction,将在边缘附近衍射声音)

image (35)

图 35 - 发声体 (e) 和听者 (l) 之间的一条可能路径


定制解决方案

在《Scars Above》中,室外区域有很多墙壁、楼梯以及其他需要衍射声音的大型物体。将 AkGeometry 组件指派给 Mesh 并不现实,因为 Mesh 太多了;使用 Brush Editing 工具调节周围 AkSpatialAudioVolume 的形状也不现实,因为太繁琐耗时了。在这种情况下,建议与程序员沟通来构建定制解决方案以快速可靠地创建 Ak Geometry。为此,我特地设计了 SplineAudioWall 工具。对此,我会在本文的我们的定制解决方案部分加以介绍。

测试/故障排除

跟 Room 和 Portal 一样,我们必须对创建的几何构造进行测试,以确定是否存在声音无法在几何构造周围正确衍射或发声体和听者意外进入几何构造内部的问题。无论是在 Unreal Editor 端还是 Wwise 端,都有不少用来测试衍射的方法。所有这些方法都能提供有价值的信息,帮助我们准确识别有问题的几何构造,找到解决问题的办法并调节相应参数,并反复优化直到获得我们想要的结果。

Unreal Editor 端

  • Draw Diffraction

要在游戏当中测试发声体的衍射路径,可在 AkComponent 的 Details 选项卡中的 Spatial Audio / Debug Draw 类别下启用 Draw Diffraction 选项。

image (36)

图 36 - 在 AkComponent 的 Debug Draw 类别下启用 Draw Diffraction 选项

在游戏当中测试的时候,如果有声音正在播放,会从包含 AkComponent 的发声体开始围绕作为 AkGeometry 一部分的障碍物的边缘绘制绿线。在声音发生衍射的边缘点,会显示紫色小球。这样便于判断是否正确设置了几何构造的边界以及几何构造是否充分覆盖了障碍物。

image (37)

图 37 - 举例展示如何在游戏当中绘制衍射路径

虽然这是开发人员专用的功能,构建好的游戏中不会显示线条,但在将更改提交到存储库之前,最好还是禁用 AkComponent 上的 Draw Diffraction 选项。

  • Visualize Rooms and Portals

借助 Visualize Rooms and Portals 工具,还可测试 "AkAcousticPortal" Actor 边缘附近的衍射路径。结合上面提到的 Draw Diffraction,应可看到从发声体绕过 Portal 到达听者的衍射路径。

Wwise 端

在 Wwise 端测试时,会用到设计工具的两种不同 Profiler 布局。藉此,可获取排除直达和衍射路径故障所需的信息以及 Diffraction 和 Transmission Loss 参数。

  • Game Object Profiler

借助 Game Object Profiler,可分析听者和当前正在播放声音的所有发声体的位置、发送到 Spatial Audio 的几何构造及其对声音传播和衍射的相互影响。为此,需要启动游戏会话并在设计工具中与之连接。在打开 Game Object Profiler(快捷方式为 F12)后,上面提到的所有对象都会显示在参照平面上。Game Object Profiler 的用法就不细说了,我只想说它是一个非常有用的工具。藉此,可直观地评估 Spatial Audio 实现,包括几何构造、路径以及 Diffraction 和 Transmission Loss 值等。

image (38)

图 38 - 举例展示 Game Object Profiler 内的性能分析会话

  • Voice Profiler

借助 Voice Profiler,可更精细地追踪 Diffraction 和 Transmission Loss 参数的变化。对于当前正在播放声音的每个 Game Object,都可在 Voice Inspector 中看到声音的整条路径以及对其所做的各种处理。比如,针对正在播放声音并要分析性能的游戏对象显示相应的 Diffraction 和 Transmission Loss 参数。

image (39)

图 39 - Voice Profiler 中显示的 Diffraction 和 Transmission Loss 参数

优化

Spatial Audio 可能会占用大量计算资源。根据计算当中包含的对象数量、几何构造的复杂程度以及对 Spatial Audio 保真度的要求,每个时钟周期执行的计算都可能对音频线程造成极大的负担。然而,资源是稀缺的。为谨慎起见,声音设计师一般会优化 Spatial Audio 实现,以此来减轻音频处理对 CPU 造成的负荷。

在此,我列举了一些有关如何实施优化的示例,希望对想要在游戏中获得最佳 Spatial Audio 效果的声音设计师有所帮助。

通过与 Room 关联来优化 AkGeometry

如果带有 AkGeometry 组件的 Actor 被 Room 完全覆盖,最好将该组件与 Room 关联起来,这样只有在听者和障碍物处在同一 Room 时才会计算该 Actor 周围的声音传播。为此,可选中 Actor 的 AkGeometry 组件,并在 Optimization 类别下的 Associated Room 属性中指派相应的 Room 实例。

image (40)

图 40 - 将 Room 关联到 Static Mesh 的 AkGeometry 组件

注意:对此,Room 和带有 AkGeometry 组件的 Actor 必须处在同一子关卡中。

注意,如果 Room 与几何构造关联,该 Room 将不会考虑关卡中的其他全局几何构造(不与任何 Room 关联的几何构造)。

针对完全凸起的 Volume 禁用 Diffraction

如前所述,我们需要在所有希望作为几何构造包含在内的 AkSpatialAudioVolume 上启用 Enable Diffraction。因为默认情况下所有 Portal 都会在其边缘衍射声音,所以可放心地在所有完全凸起的 Room(即没有边缘要衍射声音的 Volume)上禁用此选项。

要识别这些 Volume 其实很容易,我们只需问自己这样一个问题:Room 的所有 Portal 之间是否都在视线之内?如果答案是肯定的,就可放心地将 Volume 排除在几何构造计算之外。

禁用地面

比方说,我们想在 Spatial Audio 几何构造中包含一个 "Room" Volume。在大部分情况下,Room 都是由墙壁、天花板和地板组成的。在此类空间中,一般不需要计算来自地面(即底面)的衍射,因此可放心地将这些表面排除在 AkGeometry 计算之外。这样可减少 AkGeometry 三角形的数量,也不需要计算 Volume 下方的衍射路径。

为此,可进入 Brush Editing 模式,选中 Volume 的特定地面,然后在 Geometry Surfaces 类别下取消选中 Enable Surface 属性旁的方框来将其禁用。

image (41)

图 41 - 禁用 "Room" Volume 的地面

移除不再适用的 Portal

在使用 Room 和 Portal 填充关卡并确保一切正常后,我们要问问自己在游戏当中是否有一部分添加的 Portal 其实是无法传递声音的。出于美学或照明方面的考虑,关卡设计师有时会在墙壁或天花板(甚至地板)上放置一些开口。通过为这些开口设置专门的 Portal,可确保我们的几何构造能够准确模拟游戏中的几何构造。也就是说,如果另一侧有声音,应当是能听得到的。

不过,对有些 Portal 来说可能永远不会有声音从另一侧传来。通过移除这些 Portal,可大大优化 Spatial Audio 实现。因为有些路径的计算会涉及发声体、听者和所有与 Room 关联的 Portal。

简化几何构造

显然,几何构造越简单,要做的计算越少,CPU 运行越流畅。在简化几何构造时,要考虑游戏中的各种实际状况以及在特定情况下想要达到的细节层次。在弯曲柱子周围精心构建 Volume 可能会获得更高的细节层次,但如果玩家无法实际感知到这种保真度,那么就没有必要在游戏中构建这样的 Volume。声音设计师应当扪心自问,是否较为简单的形状也能实现同样的效果。

在这种情况下,我们可以创建一个新的 Volume,或者减少现有 Volume 的三角形数量。为此,只需选择想要保留的顶点并焊接那些可能不再适用的顶点即可。

根据平台设置 Spatial Audio

如果发现音频线程依然难以承担所有 Spatial Audio 工作,最好检查一下平台的 Spatial Audio Initialization Settings,看看能否在 Wwise Integration 端做一些改进。这些设置是 Wwise Project Settings 类别的一部分,有很参数都可用来降低逼真度以减轻 CPU 负荷。在此,我就不单独介绍了。其中大部分的设置应该都很容易理解,其余的则在工具提示或文档中有说明。

以下是我们认为对 PS4 和 PS5 平台来说比较适合的设置。

image (42)

图 42 -《Scars Above》在 PS4 平台上的 Spatial Audio Settings

image (43)

图 43 -《Scars Above》在 PS5 平台上的 Spatial Audio Settings

World Composition 问题

如果关卡是 World Composition 的一部分并与其他关卡一起进行流传输,建议将所有 Spatial Audio Actor 放置在专门为了容纳 Spatial Audio Actor 而创建的持续性子关卡(如 SUB_Sound_SpatialAudio)中。这是因为在 Wwise 2021.1.9 版本和 Unreal Engine 4.27.2 版本中不好对 Spatial Audio Actor 进行流传输。换句话说,在运行时同时加载和卸载大量 Room 和 Portal 及其他 Ak 几何构造可能会导致出现轻微的声音卡顿和丢帧。将其全部放在持续性子关卡中就可避免这一问题,同时还能节省大量资源(如果设置得当,同时加载大量 Spatial Audio 几何构造应该不会造成任何问题。在《Scars Above》中,我们在一个持续性关卡中放置了一千多个 Actor,游戏运行得也还好。)

我们的定制解决方案

Wwise Spatial Audio API 中包含的由 Audiokinetic 提供的工具可满足我们在构建和测试游戏声学空间时的大部分需求。不过,由于每个项目都有其特殊性,我觉得有必要升级自己的 Spatial Audio 管线,并在编程团队的帮助下构建若干定制解决方案。这些解决方案提高了我们工作流程的效率和速度。所以,我再次建议在可能的情况下尽量使用现有工具集,有特殊需求的话再跟周围同事构建定制解决方案。

Custom Listener

我们沿用了 Wwise Unreal Integration 中的听者功能,不过对其做了一定的扩展来让它使用起来更加灵活。我们的 Custom Listener 设在专用的弹簧臂上,弹簧臂被绑定在摄像机上但可独立移动。它的位置可设在摄像机和 Player Character 之间的任意一点(我认为在游戏中将其设在距离 Player Character 大约 2/3 的路径位置最为自然)。在过场动画中,当摄像机移开时,可选择一并移动听者或让其与 Player Character 处在同一位置。

至于它跟 Spatial Audio 的关系,我们限定听者永远无法进入指派有 "SpatialAudioVolumeBlock" Collision Preset 的几何构造内部。由于摄像机和听者分别位于不同的弹簧臂上,任何没有遮挡摄像机的 Ak Geometry(如不可见的 Volume)都会遮挡听者。这样可以避免出现故障。换句话说,可确保听者不会被几何构造遮蔽。另外,还可让我们在障碍物周围创建不那么复杂的几何构造。

  • ShowDebug AudioListener 命令

ShowDebug AudioListener 是一条用于调试的控制台命令。它会以蓝色球体的形式显示运行时更新的 Custom Listener 组件当前在什么位置。这样方便查看听者在对应弹簧臂上的位置。另外,还可分辨听者何时超出 Volume 的边界,或是否被障碍物以不符合预期的方式阻挡。同时,它还会显示听者的当前变换数据。

Listenernew2

GIF 7 - 使用 ShowDebug AudioListener 控制台命令对听者进行调试

VisualizeAkGeometry

有 Visualize Rooms and Portals 随时可以拿来用当然很好,但如果能在游戏当中显示整个 AkGeometry 而不仅仅是 Portal 及其与 Volume 的连接,岂不更好?

这正是我们要设法通过 VisualizeAkGeometry 调试工具来实现的。在启用该工具后,便可查看 Volume 及其与关卡中其他几何构造的关系。这样更容易找出有问题的地方,并在游戏当中对听者和发声体路径进行调试。

我们采用了多种不同的视图。除了可以启用或禁用该工具,还可选择将几何构造显示为半透明的 Mesh 和/或线框,并根据需要选择两种不同的视野深度。在选择第一个深度时,可将所有 Ak Geometry 显示在其他各个关卡 Actor 的前面,同时显示 Volume 的完整形状;在选择第二个深度时,可将几何构造隐藏在其他关卡几何构造的后面,以便查看在 Brush Editing 过程中可能忽略的突出边缘和表面。通过这个视图,还可查看 Portal 开口处的 Volume 表面,从而确定听者或发声体会在哪个位置从某一区域穿越到另一区域。

VisualizeAkGeometry4

GIF 8 - 不同的 VisualizeAkGeometry 显示模式

SplineAudioWall

为了更加便捷地在障碍物周围构建 Ak Geometry,我们创建了一个 Actor 类。藉此,可快速、灵活地添加和移动 "Spline" Actor 的点,同时还能快速生成并修改这些点的简单 Mesh。

这样的话,不依赖 Brush Editing 工具就可创建 Ak Geometry。事实证明,Brush Editing 工具有的时候使用起来确实不那么方便,尤其是在需要围绕现有关卡几何构造调节 Volume 的形状时。SplineAudioWall 使用起来要直观得多,虽然其主要作用是对墙壁进行模拟,但却可囊括各种各样的形状。这也使其成为比 Brush Editing 工具更好的 Ak Geometry 设计工具。

在关卡中放置 Actor 时,会显示短的样条和简单的紫色方框作为几何构造的基础。我们可以自由地向样条添加新的点。这时会立即创建新的方框(程序化 Mesh)。对于每一个点,都可移动和旋转程序化 Mesh 并在各个方向上进行缩放。

在完成 Actor 的放置之后,我们会得到一个复杂的形状。它由若干简单的方框组成,具体取决于样条点的数量。然后,这个程序化 Mesh 会被渲染为 Static Mesh,而 Static Mesh 又会绑定 AkGeometry 组件,同时会将几何构造发送到 Wwise Spatial Audio 引擎。在默认情况下,会为经过渲染的 Mesh 指派 "SpatialAudioVolumeBlock" Collision Preset 以防止听者进入 Mesh 边界之内。

除此之外,我们还为 Actor 增添了一项功能,就是禁用所有地面以达到优化目的。因为这些 Actor 通常会放置在关卡的地板上,所以默认情况下会启用该选项。

SplineAudioWall2

GIF 9 - 修改 "SplineAudioWall" Actor 实例

VisualizeAkGeometry 调试工具也可显示这些 Actor。AkSpatialAudioVolume 会显示为浅蓝色,SplineAudioWall 会显示为紫色(见 GIF 8)。

注意,每个新的样条点都会在发送到 Spatial Audio 的几何构造中添加三角形,因此请确保删除所有不必要的点。

该解决方案将来会做进一步的改进:为每个表面添加 Transmission Loss 参数和 Acoustic Texture。《Scars Above》中没有使用 Wwise Reflect,所以这不是重点。

Weapon Tail 切换

在《Scars Above》中,我们决定使用现有 Room 网络来根据 Interior/Exterior 类型和大小决定 Player Character 所在空间的类型。

我们选择了通过创建自定义 Player Character 组件来实现这一目标。该组件使用 AudioTrace 通道按照固定的时间间隔追踪 Volume 并返回优先级最高的 Volume 的 Actor 标记。我们要根据返回的 Actor 标记在 Wwise 中设置适当的 Interior/Exterior 状态。这些状态的用途很多,包括 Weapon Tail 切换。我们认为只要四种 Weapon Tail 声音就够了,包括 Exterior、Interior_Large、Interior_Medium 和 Interior_Small。注意,每个 AkSpatialAudioVolume 实例都要手动添加 Actor 标记。

image (44)

图 44 - V.E.R.A. 武器的 "Tail" Switch Container 的 General Settings 选项卡

最后总结

感谢各位阅读这篇博文。希望我在这里提出的建议能让大家在处理 Spatial Audio 问题时更加得心应手。鉴于 Audiokinetic 一直在改进 Spatial Audio API,本文中的某些细节会慢慢变得不再重要。不过,周密的计划和组织、谨慎的实施以及彻底的故障排除和优化等基本原则在很大程度上还是适用的。今后,我会密切关注 Spatial Audio 的开发进展,看看有没有什么新的发现和更好的做法。同时,也希望本文能据此而不断更新。

首先,感谢 Dimitrije、Selena、Teodora 和 Marko,他们是我在 Mad Head Games 的声音设计师同事,还有 EA Dice 的 Nikola,感谢他提供的支持和反馈。同时,衷心感谢 Mad Head Games 编程团队的 Nina、Stevan、Nemanja 和 Dušan。另外,还要感谢 Audiokinetic 的 Julie、Adrien、Guillaume、Nathan、Louis-Xavier、Thalie、Masha 和 Maximilien 提供的所有建议,并让我有机会以博文的方式表达自己的想法。

Milan Antić

首席/技术音频设计师

Mad Head Games

Milan Antić

首席/技术音频设计师

Mad Head Games

米兰•安蒂奇 (Milan Antić) 目前在位于塞尔维亚贝尔格莱德的 Mad Head Games 工作室担任首席/技术音频设计师。他专注于利用 Wwise 在 Unreal Engine 中开发 AA/AAA 项目,在为休闲游戏和大制作游戏设计声音和构建音频系统方面拥有丰富的经验。

LinkedIn

评论

留下回复

您的电子邮件地址将不会被公布。

更多文章

《纪念碑谷2》美丽声音的幕后:托德.贝克(Todd Baker)专访

本采访最初刊登于A Sound Effect 在《Monument Valley 2(纪念碑谷2)》中,Ustwo...

10.4.2018 - 作者:安-索菲.蒙古(ANNE-SOPHIE MONGEAU)

《Murderous Pursuits》的对白和对话设计 – 第 2 部分

大家好,我是吉米。在第 2 部分,我将继续向各位介绍《Murderous Pursuits》的对话和对白系统。 假如您还没阅读第 1 部分,请点击此处阅读! 上次我们回顾了有关在游戏中运用...

23.12.2019 - 作者:杰米·克罗斯 (Jaime Cross)

关于Wwise插件开发流程

前言...

24.3.2021 - 作者:李昱宸

利用 Wwise 设计基于循环的汽车发动机声音 | 第 1 部分

在本系列博文中,我们将介绍如何利用 Wwise 设计基于循环的汽车发动机声音(文中配有相关音频示例,及有关汽车的基础知识)。 ...

26.1.2022 - 作者:阿托•科伊维斯托 (Arto Koivisto)

早期采用者对 Strata 多音轨 SFX 库的评价

Strata 的诞生 在过去的四五十年里,SFX 库创作者都在以大致相同的方式制作和分发内容:录制、编排、混音并渲染构建的声音,然后将基于主题的数据包出售给用户。如果我们排除一些例外情况 – 比如...

2.12.2022 - 作者:西蒙.阿什比(Simon Ashby)

快速了解语音设计

自上世纪 80...

29.4.2024 - 作者:Charles Pateman

更多文章

《纪念碑谷2》美丽声音的幕后:托德.贝克(Todd Baker)专访

本采访最初刊登于A Sound Effect 在《Monument Valley 2(纪念碑谷2)》中,Ustwo...

《Murderous Pursuits》的对白和对话设计 – 第 2 部分

大家好,我是吉米。在第 2 部分,我将继续向各位介绍《Murderous Pursuits》的对话和对白系统。 假如您还没阅读第 1 部分,请点击此处阅读! 上次我们回顾了有关在游戏中运用...

关于Wwise插件开发流程

前言...