Wwise Spatial Audio 2023.1 新增功能 | Reverb Zone

新版本 / 空间音频 / Wwise 技巧和工具

Reverb Zone 简介

在 Wwise 23.1 中,我们为 Wwise Spatial Audio 增添了一个名为 Reverb Zone 的工具。Reverb Zone 本质上来说是 Room 内的区域。不过它并不通过 Portal 与其他 Room 连通,而是使用几何构造来定义发生过渡的位置。作为对 Room 和 Portal 的扩展,这些区域方便划分具有自己的混响和类似 Room 特性的空间。通常,定制的 Room 无法很好地满足这些需求,要么在放置 Portal 时会受到一定的限制。

本文将通过若干虚构的游戏开发场景来展示如何借助 Reverb Zone 解决设计难题,并指出都有哪些常见的设计误区可能会带来不符合预期的结果以及如何加以变通。首先声明,我使用的是 Unreal。在 Unreal 中,可以像 Spatial Audio Volume 一样轻松放置 Reverb Zone。同样的原理适用于所有游戏引擎,所以在此我会尽量说得概括一些。只是简单展示一些示例,并不涉及太多技术细节。

早上好,小英雄

比方说,我们在制作一款冒险游戏。主角将在树林某处的小木屋中醒来。这里的 Room 和 Portal 设置比较简单:外面是个定制的 Room,我将之命名为 SAV_Forest。小木屋也是个 Room。两者通过 Portal 连通。我们来向 SAV_Forest 发送 Event 以启动室外环境声。这时在小木屋内应可听到透过 Portal 传来的房间底噪。非常简单。

屋外肯定比屋内更精彩,主角自然要到外面走走。沿小路穿过树林,一直走到空地上。

whole_map_overview cabin_in_the_woods

 

空地上隐藏的危险

 

这片空地提出的难题跟小木屋不同,因为空地并不是一个真正的 Room。这里没有明确的入口或出口,也不好确定在哪放置 Portal。不过,这个空间的声音效果应该跟别的地方不一样。我们可以把它想象成一个没有墙壁的 Room。本例的目标是在进入空地时让森林环境声消失。最终的效果应当跟森林环境声被屏蔽掉了一样。

空地由 Reverb Zone 表示,与 Room 的惯常用法相同,只不过其没有任何 Portal。我们来为这一区域设置一个父对象(即 SAV_Forest)。这样森林和空地在声音传播上仍会被视为同一个空间。空地上有棵大树,其包含几何构造。作为伟大冒险的一部分,我们在大树后面放了一个可疑生物(表示为发声体)。这个小怪兽的声音可能会在大树的几何构造周围发生衍射并穿过 Reverb Zone 的边界(因为没有墙壁)。所以,在进入 Reverb Zone 之前即便还没看到应该都能听到它发出的声音。否则,在它悄悄靠近的时候,我们的主角可能会察觉不到。

creature_behind_the_tree

Reverb Zone 的 Transition Region Width 为 150 cm。这个宽度跟 Portal 的深度相当,会影响进出区域时的微妙细节。比如,平衡 Room 之间的 Aux Send 或插入 Room Transmission Loss(本例中没有使用,参见下文的说明)。

注意,Reverb Zone 的地板在默认情况下是个透明表面。这意味着森林环境声能穿过地板,而且比预期的音量还要大。透明表面是指 Transmission Loss 为 0 的表面。Reverb Zone 的 Transition Region 只出现在这些透明表面的周围。所以,为了避免不必要的声音穿过地板,需要为其设置几何 Transmission Loss。为此,我在 Unreal 的 Details 面板中选择了地板表面,并在 Surface Properties 下选中了 Enable Surface。若未选中 Enable Surface Reflector Set(默认不选中),则启用的表面的 Transmission Loss 为 1,禁用的表面的 Transmission Loss 为 0(使其透明)。若选中了 Enable Surface Reflector Set,则会有一项额外的属性可用来精确指定各个表面的 Transmission Loss。在 SDK 中使用 AK::SpatialAudio::SetGeometry 时,将由各个表面所用的 AkAcousticSurface::transmissionLoss 指定。每个表面的行为都是一样的,Reverb Zone 的天花板也是如此。本例中空地的体积够大,而且天花板离得也够远,所以说不存在这个问题。

properties_panel_1

注意,我提到了两种不同的 Transmission Loss:Room Transmission Loss 和几何 Transmission Loss。两者之间有很大的区别。Reverb Zone 可利用几何构造的 Transmission Loss 来决定哪些表面是透明的。除此之外,还可通过 AK::SpatialAudio::SetRoom 单独指定 Room 本身的 Transmission Loss。在使用几何构造时,Room Transmission Loss 只适用于房间底噪(直接发送到 Room 的声音)和湿声路径(源自房间底噪和普通发声体的 Room 辅助总线/混响效果器链路)。在这些示例中,Room Transmission Loss 始终为 0。这也是在 Unreal 中添加 "AkReverbZone" Actor 时的默认值。

以下截图展示了 Game Object 3D Viewer 中显示的 Reverb Zone。其中,发声体位于大树后面(为简单起见,我将大树的几何构造表示为了类似蛛网的形状)。透射路径被大树阻挡,衍射路径则绕过大树,但要穿过 Reverb Zone 的外缘(墙壁所在位置)。Game Object 3D Viewer 选项中有个 Show Transition Regions 复选框。在选中时,Transition Region 将由此处的蓝色方框表示。注意,这些方框是粗略的示意图。在实践当中,就像 Portal 一样,因为基于跟各个表面的距离,所以实际影响范围是经过舍入的。

sound_in_the_clearing

在听者进入 Reverb Zone 时,发送到 SAV_Forest 父级 Room 的环境声会根据从听者到 Reverb Zone 墙壁的距离进行衰减(基于声音的 Attenuation ShareSet 中的曲线)。这样的话,越往区域深处走,森林环境声越弱。在将其他声音发送到 Reverb Zone 时,也会以同样的方式根据相对于区域的距离进行衰减。

前往小镇

由于我们的主角极具天赋,而玩家也表现出了高超的技巧,小怪兽很容易就被干掉了(也可能是被说服了?)。接下来,我们离开这片空地,继续前进。沿着小路一路向前,会看到一片更大的空地,空地中央有个小镇。在这里,我们可以做比之前那片空地更复杂的设置。

整个地方已经封在外部的 SAV_Forest 内。不过,这次的分层更多。就像之前一样,我们可以将小镇所在的空地分隔开来。我将之命名为 RZ_Meadow。小镇本身也是 Reverb Zone。我将之命名为 RZ_Town。对于两个 Reverb Zone,我都设置了相应的父级 Room 和 Transition Region Width,并根据是否希望声音穿过表面做了相应设置(主要是为了确保地板不是透明的)。SAV_Forest 现在是 RZ_Meadow 的父对象,而 RZ_Meadow 又是 RZ_Town 的父对象。

zone_ception

这时要记得为每个 Room 和 Reverb Zone 恰当设置 Room Priority,以确保游戏对象最终被包含在正确的 Room 中。我将 SAV_Forest 设为了最低优先级,然后是 RZ_Meadow,优先级最高的是 RZ_Town。实际数值并不重要,只要顺序正确即可。

在这种设置下,声音可以穿过此层级结构下的所有分层,并且每个 Reverb Zone 都可将相关的声音发送到自身所在区域。就像之前一样,RZ_Meadow 对 SAV_Forest 也有同样的分隔效果,而 RZ_Town 则对两者都有分隔效果。在主角到达小镇时,森林环境声会被大幅衰减甚至完全消失。相反,在走近时会听到与 RZ_Town 相关的声音。这些声音是从空地中央的建筑物所在方向发出的,其同样会根据相对于 RZ_Town 的距离进行衰减。我们可以从任何方向进入小镇,而无需在定制的入口小心放置 Portal。

发送到小镇内游戏对象的声音会向外传播到听者所在位置,就好像 Reverb Zone 的墙壁根本不存在一样。如果在 Voice Inspector 中查看该声音,会发现此 Room 层级结构中所有分层的混响都应用到了与之对应的湿声路径上。当中涉及的所有 Room 总线都被连在了一起(如需了解更多详细信息,建议阅读最近关于对 Aux Send 模型进行的完善的博文)。

chained_verbs2

露台下的 NPC

主角跟小镇上的每个人进行交谈,没准还会闯进房子里把陶罐砸烂,或者被告知要跟旁边酒吧里的某人搭话来获得任务信息。不过,这里有个 NPC 坐在酒吧外面带顶棚的露台区下面。这个露台区是个很好的 Reverb Zone 应用场景。因为它可能会有自己微妙而独特的混响效果,而且还处在构成酒吧的 Room 外面。我将之命名为 RZ_Patio。

walrus_room_outside

这个 Reverb Zone 与之前的相比有一些明显的不同。它们的共同点是都设有父级 Room (RZ_Town) 和 Transition Region Width。除了这个 Reverb Zone 有自己的 Room 辅助总线并应用了独特的混响效果器,最大的区别在于它的放置位置以及透明表面的设定。

跟之前一样,地板不应当是透明的,因为声音穿过地板是不合理的。不过,这次还有两个表面要顾及。首先,这个露台的天花板是有顶的。就像地板一样,对于这个区域,所有声音都不应从该方向传入或传出。

opaque_surfaces

另外,还有个靠着酒吧外墙的表面。上面有 Portal 连通代表酒吧内部的 Room。这个表面也不应是透明的,原因有二。首先,那里有一堵墙。所以,声音不应穿过该表面。此 Reverb Zone 的 Transition Region 也不应覆盖这一区域。如前所述,Transition Region 只存在于透明表面周围。其次,这个表面上有个 Portal。它将酒吧内部与 RZ_Patio 直接连通,并与 RZ_Town 间接连通。无论是穿过 Portal 还是 Reverb Zone 的 Transition Region,游戏对象每次都只能处在 Room 之间的一个 Transition Region。

因为每次只能有一个 Transition Region,所以在放置此 Reverb Zone 时还有一个难题。该区域位于小镇边缘,靠近 RZ_Town 和 RZ_Meadow 之间的 Transition Region。为了避免出现不符合预期的结果,Transition Region 不应重叠,就像 Portal 的边界不应重叠一样。在本例中,有足够的空间可以将整个酒吧从小镇边缘移开或扩大与小镇对应的 Reverb Zone。这样两个 Transition Region 就不会重叠了。

profiler town overview

有了这个 Reverb Zone,NPC(即发声体)就可以放置在该区域内。它受应用于露台区的独特混响效果器影响,同时又处在酒吧外面,在声音传播上的效果就像处在 "RZ_Town" Room 中一样。所有来自酒吧内的声音(无论是房间底噪还是隔着门喊叫的声音)都会像平常一样穿过 Portal。在穿过 Portal 之后,由 Reverb Zone 及其父对象构成的 Room 层级结构会被视作一整个大的空间。

冒险很辛苦,该喝一杯了

既然这是一款冒险游戏,那我们不妨做得逼真些。露台下的 NPC 建议进去喝一杯,因为今天已经在外面跑一天了。这倒是个好主意,主角欣然接受了。走进去开怀畅饮,开心得不亦乐乎。情节设计得挺好。不过,酒吧本身只是普通的 Room 而不是 Reverb Zone。为什么它是普通 Room 而非具有选择性透明表面的 Reverb Zone?

Reverb Zone 本质上就是 Room,只不过增加了一些属性。它们有一些关键的区别,会影响两者之间的取舍。我特意挑了一些简单的 Reverb Zone 用例,不过在别的情形下使用标准 Room 会更好。

其中一个主要区别是父级 Room。在设定 Reverb Zone 从属关系时,会创建了一个 Room 层级结构。在声音传播的模拟当中,这些 Room 会被视作同一个空间。理论上来说,我们可以创建完全由 Reverb Zone 构成的空间。但是,这样无法发挥 Room 和 Portal 的优势,并且很可能会带来性能方面的问题。Spatial Audio 一般可以利用 Room 和 Portal 网络来避免在游戏对象移动或变动时重新计算从发声体到听者的整条路径。倘若没有这样的网络,每次都要查找整条路径。在此处列举的例子中,这种差异可以忽略不计。但在几何构造更复杂的大地图上,成本会更高。

还有一个重要区别就是,Reverb Zone 要有几何构造,而其他 Room 并不需要。Reverb Zone 的进出取决于 Transition Region 而非 Portal,所以要有几何构造来定义这些 Transition Region 的位置。

总的来说,普通 Room 一般更为适合平时所说的房间 – 完全封闭或几乎全封闭的空间,或者有明确定义的入口的空间。比如,屋子里的房间、办公大楼、车库、走廊…

在分隔较大空间、空间不完全封闭或因 Portal 放置上的限制而不好实施 Room 过渡时,比较适合使用 Reverb Zone。就拿 SDK 文档中的示例来说,很多地方都使用了 Reverb Zone。比如,高速立交桥下的空间、有遮盖的阳台或像前文所说的从室外区域分隔出来的空间。

感谢参与这次冒险

好了,我们的任务完成了。到各处都转了转,跟 NPC 交谈了,怪兽打了,陶罐也砸了,顺便还学到了一些关于 Reverb Zone 的有用知识。

托马斯•汉森 (Thomas Hansen)

软件开发工程师

Audiokinetic

托马斯•汉森 (Thomas Hansen)

软件开发工程师

Audiokinetic

托马斯•汉森 (Thomas Hansen) 是一名软件开发工程师(现居魁北克加蒂诺),于 2022 年加入 Audiokinetic 研发团队。他拥有丰富的游戏开发经验,参与过从独立游戏到 AAA 主机游戏的各种项目。同时,托马斯还是一名多乐器演奏家,活跃于渥太华和加蒂诺的多个乐队。

评论

留下回复

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

更多文章

在Unity3D中助力你的声音设计师

27.3.2018 - 作者:比特里克斯.摩尔什(BEATRIX MOERSCH)

“零代码”开发小游戏—UE4蓝图与Wwise结合的设计思路 — Part 1

大家好,我叫伍岚珊(Coffee...

6.1.2020 - 作者:伍岚珊

Wwise Authoring Query Language 简介

“Wwise 不过是张电子表格”。作为用户体验团队成员,我们经常会听到有人这样说。事实上,Wwise 不仅是款声音设计工具,Wwise...

20.7.2021 - 作者:伯纳德 罗德里格 (Bernard Rodrigue)

为 Wwise 2021.1 构建插件 | 第 1 部分:背景和目标

大家可能不知道,Wwise 生态系统其实具有很强的可扩展性。有时,各公司要为其项目构建定制的插件,供应商会将自研插件迁移到 Wwise。对此,我们必然要提供相应的支持。新的 Wwise...

27.9.2021 - 作者:米歇尔•多奈斯 (Michel Donais)

Wwise Audio Lab (WAL) 配套更新

Wwise Audio Lab (WAL) 是一个采用 Unreal Engine 4 开发的类似游戏的 3D 开源环境,其可通过 Wwise Launcher 进行下载。在 WAL 中,用户可对...

27.4.2022 - 作者:戴米安·卡斯特鲍尔(Damian Kastbauer)

通过 ReaWwise 在 ReaScript (Lua) 中调用 WAAPI

ReaWwise 有个大家可能不太知道的功能,就是将原始 WAAPI 函数暴露给 REAPER。藉此,用户可在自己的 ReaScript 中使用这些函数。在本文中,我们将探讨如何使用 WAAPI 在...

23.4.2024 - 作者:安德鲁·科斯塔 (Andrew Costa)

更多文章

在Unity3D中助力你的声音设计师

“零代码”开发小游戏—UE4蓝图与Wwise结合的设计思路 — Part 1

大家好,我叫伍岚珊(Coffee...

Wwise Authoring Query Language 简介

“Wwise 不过是张电子表格”。作为用户体验团队成员,我们经常会听到有人这样说。事实上,Wwise 不仅是款声音设计工具,Wwise...