Wwise SDK 2019.2.15
|
Spatial Audio 模块提供了一些和空间音频相关的服务,特别是:
在幕后,它:
它是一个游戏侧的 SDK 组件,包括了 Wwise 声音引擎的一部分,如以下流图所示。
以下段落将简要阐述几个与 Spatial Audio 相关的基本声学概念:
在声波遇到小型障碍物、大型障碍物边缘或房间开口边缘时,会在其周围发生弯曲,出现衍射现象。这时声音会穿过房间开口(门户),传播到另一侧。也就是说,听者不用站在房间开口正前方也能听到声音。在游戏中,衍射通常十分重要。因为它可以给玩家以提示,告知玩家与发声体之间存在哪些路径。在以下声场图中,平面波从右上方入射,并在传播过程中遇到有限面(图中表示为从中央向外延伸的黑线)。此边缘造成的扰动即称为“衍射”。左侧区域为 View Region(可视区)。在此,平面波直接穿过,不发生任何改变。右上区域为 Reflection Region(反射区)。在此,平面波遇到表面发生反射,并与入射波混合,呈现锯齿状。右下区域为 Shadow Region(阴影区)。在此,衍射发挥主导作用。此图只是一个粗略示意图;在现实中,区域边界处的声场是连续的,而且 View Region 也会出现边缘衍射,只是与入射波本身相比通常可以忽略不计。
我们可以把边缘看作一个点声源,其振幅随距离减小。并且,频率越高,振幅减小得越快。也就是说,我们可以使用低通滤波器准确地对其进行建模。Wwise Spatial Audio 通过两个 API 函数构建衍射模型。如需了解如何利用 Room 和 Portal 构建门户衍射模型,请参阅“房间和门户”的“\ref spatial_audio_apigeometry_diffract”部分。
声音透射是 Wwise Spatial Audio 内模拟的另一相关声学现象。透射是指声能穿透障碍物的传播情形,透射损失是指能量被障碍物消耗的比例。请不要将其与吸收混淆。后者是指能量被反射声波消耗的比例。不过,两种媒介的分界面上的交互作用可能会相当复杂。反射与吸收能量的比率取决于材料表面的特性,而传播与透射损失则与障碍物的大小、形状和密度有关。
对于密致材料(如混凝土)构成的障碍物,与衍射相比,通过透射传达给听者的能量比例可能会很小,尤其是在附近有开口的情况下。倘若没有这种开口或者障碍物由松散材料(如木板或玻璃)构成,透射所起的作用就会非常明显,这时便有必要加以模拟。
在经过足够长时间后,发声体会在所处环境内制造出一个基于声学属性的漫反射场。在游戏中,为了模拟这一情形,通常会利用混响效果器来调节参数,并以此表示与其关联的环境。另外,漫反射场还会穿过 Room 开口和墙壁,传播到听者所在 Room,并对听觉环境产生激励作用。房间耦合也叫混响,是指声能从某一环境或 Room 到另一环境或 Room 的传播。游戏一般通过将某一 Room 的混响器输出馈送到另一 Room 的混响器来对此进行建模。
声障代表了各种各样的声学现象,它涵盖声波遇到障碍物时发生的所有情况。声笼与之相似,只是声音无法绕过障碍物。Wwise 声音引擎允许游戏开发人员为游戏对象设置 Obstruction(声障)和 Occlusion(声笼)值,并将其映射至一系列音量、低通滤波器和高通滤波器曲线。两者的区别是,Obstruction 仅会影响 Actor-Mixer 或总线与其输出总线之间的干声/直达信号,而 Occlusion 会同时影响辅助发送。因此,在发声体和听者位于同一房间时,可利用 Obstruction 更好地模拟障碍物对声音的阻挡作用;在声音透过闭合墙壁时,可利用 Occlusion 更好地模拟声音对障碍物的透射作用。
Spatial Audio 功能和定义可以在 SDK/include/AK/SpatialAudio/Common/ 中找到。 它的主要功能是在名字空间 AK::SpatialAudio
内提供的。API 函数分为以下 4 类:
Room 和 Portal API 利用简单的上层几何抽象概念对其他房间内发声体的声音传播进行建模。Geometry API 直接使用三角形来计算镜像声源以结合 Wwise Reflect 模拟动态早期反射,或者计算几何衍射。另外,Spatial Audio 还提供有一些辅助函数,方便直接访问 Wwise Reflect 的原始 API。
使用 AK::SpatialAudio::Init()
来初始化 Spatial Audio。
在使用 Spatial Audio 时,必须明确指派一个游戏对象为 Spatial Audio Listener。为此,需要调用 AK::SpatialAudio::RegisterListener()
来传入所需听者的 ID。另外,还要把该游戏对象注册到声音引擎中,并将其指派为听者。如需进一步了解声音引擎中的 Listener,请参阅 集成 Listener 。
如果某个声音有若干设置与设计工具中启用的 Spatial Audio 相关,那么游戏对象在播放该声音时就会成为 Spatial Audio Emitter:
您可以使用 AK::SoundEngine::SetPosition
将游戏对象(无论是发声体还是听者)的位置传给声音引擎。Spatial Audio 会直接从声音引擎检索位置信息,来确定声源位置以进行反射和衍射处理。
![]() |
警告: 目前,Spatial Audio 仅支持一个顶层听者。 |
![]() |
警告: 在大部分情况下,结合 Spatial Audio 使用多点定位是不可取的,因为 Portal 插值、衍射和反射处理只需一个声源位置。若游戏对象设有多个位置,则仅会将第一个位置用于 Spatial Audio 计算。 |
Geometry API 方便游戏将三角形网格发送至 Wwise Spatial Audio,以实现以下两个目的:
游戏的几何构造通过 AK::SpatialAudio::SetGeometry()
传给 Wwise Spatial Audio,并由 AkGeometryParams 结构进行描述。下面简要介绍了相关要点:
AkGeometryParams::Vertices
数组中定义,而三角形数组中的每个三角形都会引用顶点数组中的索引。AkAcousticSurface
结构索引,便于定义声学材质和描述字符串。AkGeometryParams::Surfaces
,并将 AkGeometryParams::NumSurfaces
设为零。一般来说,任何三角形网格都可用于 Wwise Spatial Audio,不过需要注意一些关键考量因素。
为了计算镜像声源以模拟动态早期反射,Geometry API 会结合 Wwise Reflect 插件使用发声体和听者位置以及构成游戏中简化几何构造的三角形。声音设计师可以直接在 Wwise Reflect 中根据距离和材质调节相应属性,从而控制镜像声源位置的转换。
如需简要了解几何构造驱动的早期反射(简称 ER),请参阅动态早期反射的声源成像法和为虚拟现实创造引人入胜的混响这两篇博文。
![]() |
备注: 反射阶数是指波阵面在到达听者所在位置前遇到的反射表面数量。比方说,在一个包含六个表面的鞋盒形 Room 中,在模拟一阶反射时每个发声体会产生 6 x 1 次早期反射(也叫镜像声源)。结果就是共有 6 次反射。同样地,在模拟二阶反射时每个发声体会产生 6 次一阶反射和 6 x 5 次二阶反射。结果就是共有 36 次反射。反射次数随阶数呈指数级增长。 Wwise Spatial Audio 目前支持最多模拟四阶反射。反射阶数通过 AkSpatialAudioInitSettings::uMaxReflectionOrder 初始化设置进行全局设定。另外,还可使用 AK::SpatialAudio::SetReflectionsOrder 实施动态修改。 |
对于每个要支持动态早期反射的声音,请确保在 Wwise 设计工具中的 General Settings 选项卡下指派早期反射总线,以指明搭载所需 Wwise Reflect 插件的 Auxiliary Bus(辅助总线)。Spatial Audio 会专门建立一条到该总线的辅助发送连接。除此之外,您还可以设置发送音量。
对于环境混响,一般会针对“听者”游戏对象创建 Auxiliary Bus,以便多个发声体共用同一总线和效果器实例。在 Spatial Audio 将 Room 用于后期混响时也是一样,但是对早期反射来说并非如此,因为每个发声体都会基于自身位置产生一系列反射。在这种情况下,要针对“发声体”游戏对象创建早期反射 (ER) 总线实例,并将各个发声体发送到不同的 Auxiliary Bus 实例。这在以下的 'Wwise project setup(Wwise 工程设置)' 中的 Voices Graph 截图中有展示。
您需要理解总线结构设计的以下这些方面,才能更有效地在您的 Wwise 工程中管理动态环境效果器。
为了确保高效的计算性能,在针对 Spatial Audio 所用的声音设计衰减曲线时要特别注意一点。对于指派有早期反射 Auxiliary Bus 和设计工具中标有 Enable Diffraction 的声音,必须为衰减曲线指派一个有限半径来限定路径的计算。
Spatial Audio 会通过声音的衰减确定可能的最大传播距离以执行反射和衍射路径计算,所以必须确保最大衰减距离是一个有效值。另外,倘若衰减曲线没有低于平台的指定音量阈值,那么声音的半径其实相当于是无限的。在这种情况下,Spatial Audio 在计算反射和衍射时会尝试忽略听者在环境中的位置。为了确保把 Spatial Audio 计算限定在“发声体”游戏对象周围有限半径内,Output Bus Volume(输出总线音量)和 Auxiliary Send Volume(辅助发送音量)曲线都要将最右侧的终点设到音量阈值以下。注意,音量阈值可在 Project Settings(工程设置)对话框中定义。为此,请转到设计工具的 Project(工程)菜单。
![]() |
备注: 若游戏对象同时播放多个声音,而每个声音都指派有不同的衰减曲线,则将使用其中最大的衰减半径来限定路径处理。每个游戏对象只会执行一次路径处理,之后必要时会为多个声音重复使用路径。 |
一般来说,不同的辅助总线是用来表示不同环境的,而这些总线可能承载着不同的 ShareSets,这些 ShareSets 模拟着环境的混响特征。当使用动态早期反射时,比如由 Wwise Reflect 在 Spatial Audio 下处理的那些,后期混响可能还会使用辅助总线上的混响来设计。但是,您可能会想要禁用这些混响的ER部分(如果有 ER 部分的话),因为这部分是应由 Wwise Reflect 处理的。
另一方面, Wwise Reflect 应该和用于后期混响的辅助总线平行运作。下图展示了典型的总线结构,其中 EarlyReflections 总线下的三条辅助总线每条都包含一个 Wwise Reflect 的 ShareSet。您会注意到,在这个设计中,我们只用到了少量 ShareSets 来生成早期反射。这是由于在运行时,这个效果的“空间属性”是由游戏的几何空间来驱动的。我们只在这里使用不同的 ShareSets ,因为我们希望玩家(听者)发出的声音与其他对象发出的声音有不同的衰减曲线。
有多少游戏对象当前在播放指派有 ER 总线的声音,ER 总线(搭载 Wwise Reflect)就会存在多少个实例。这一点很重要,因为镜像声源的定位取决于发声体的位置。为了正确设置 ER 总线的输出方式,您需要启用下图所示的 Listener Relative Routing 复选框。这样便可将多个 ER 总线实例生成的信号恰当地混音到下一条混音总线的单一实例中。这个单一实例对应监听这个发声体的游戏对象(通过 AK::SoundEngine::SetListeners
设置),这个对象一般是对应玩家(或镜头)的最终听者。
若为同一游戏对象播放的各个声音指派了不同的早期反射辅助总线,则将针对同一“发声体”游戏对象创建多个总线实例。Spatial Audio 仍然只针对每个游戏对象执行一次反射计算,不过会将结果发送到两个不同的 Wwise Reflect 插件实例。这样用户通过在插件中设置不同的共享集,就可以为每个声音自定义反射曲线。
![]() |
警告: 虽然 ER 总线必须启用 Listener Relative Routing(听者相对通路)才能确保将所有发声体实例并入听者对应总线,但是为了避免 Wwise 进行“双重 3D 空间化”,必须将 3D Spatialization(3D 空间化)模式设为 None(无)。同样地,除非希望在 Wwise Reflect 中为镜像声源曲线应用额外衰减,否则不要使用衰减设置。 |
另外,由于游戏对象(发声体)会向 Auxiliary Bus 发送早期反射以便处理后期混响,所以也会在 ER 总线和后期混响总线之间建立一条连接。这一般来说是可取的,因为生成的 ER 之后会用于后期混响的着色和“加浓”为了能做到这一点,您需要保证在 ER 总线上启用Use game-defined auxiliary sends(使用游戏定义的辅助发送)复选框、之后,您可以使用下方的音量滑块,在您想要向后期混响发送的早期反射和直达声的量之间取得平衡。
下图是之前所讲到内容的实时演示。注意以下事项:
对于每个反射三角形,游戏都会传递材质 ID。这些材质能以 Acoustic Textures(声学纹理)的形式在 Wwise 工程中编辑,位于 Virtual Acoustics ShareSets 中。在这里您可以定义每种材质的吸声特性。
借助 Wwise Spatial Audio,我们可以使用混响效果器和辅助发送来设置后期混响。为了支持这一工作流程,Wwise Spatial Audio 利用了简单的上层几何抽象概念(即 Room 和 Portal)对其他 Room 内发声体的声音传播进行准确建模。对于房间驱动的声音传播,其主要特性为衍射、耦合以及混响的空间化。在 Wwise 中,声音设计师可以利用工具来模拟这些特性,从而完全掌控接下来的音频变换。除此之外,还可将游戏引擎驱动的基于射线投射的声障限制到听者所在同一 Room 内的发声体上。这类声障处理高度依赖于游戏引擎,而且通常很消耗性能。注意,您也可以使用 Geometry API 将声障全部交由 Wwise Spatial Audio 来处理(参见 使用 Geometry API 模拟衍射和透射 部分)。
Room 没有尺寸大小,它们通过 Portal 相互连通,并形成由房间和开口组成的网络。其他房间发出的声音可以通过开口传播至听者所在房间。Spatial Audio 会利用此网络来修改干声信号传输距离、显式入射位置和衍射角。衍射角度会映射至声障或内置游戏参数 Diffraction。声音设计师可使用 RTPC 将该参数绑定至相关属性(如音量和低通滤波器)。另外,Spatial Audio 还会将相邻房间的混响置于门户位置,并允许使用 3D 总线将这些混响耦合到听者所在房间的混响中。最后,房间还有朝向属性。也就是说,在房间内,关联混响产生的漫反射场会在传播到听者前发生旋转,最终与游戏的几何构造而非听者头部绑定。
要想在“发声体”游戏对象上使用 Room Reverb,必须在 Wwise 设计工具中启用 Use game-defined auxiliary sends 复选框。除了游戏要求的 Game-defined 发送,Spatial Audio 还会应用针对 Room 的发送。
在创建 Room 总线时需要选用正确的定位选项:启用 Listener Relative Routing,将 3D Spatialization 设为 Position + Orientation,同时启用 Use game-defined auxiliary sends。除此之外,也可使用 "<b>Room Auxiliary Bus</b>" Preset(预设)来创建总线。
您需要根据地图或关卡的几何构造使用 AK::SpatialAudio::SetRoom
和 AK::SpatialAudio::SetPortal
创建 Room 和 Portal。在运行时,可使用相同 ID 再次调用这些函数,从而更改 Room 和 Portal 相关设置。然后,游戏会针对每个发声体和听者调用 AK::SpatialAudio::SetGameObjectInRoom
,进而将两者所在房间告知 Spatial Audio。从 Spatial Audio 的角度来说,Room 并没有固定的位置、形状或尺寸。因此,它们可以是任何形状。不过,为了确定对象所在 Room,游戏引擎需要执行几何包含关系检测。
![]() |
警告:注意,请谨慎设置 Room ID(房间 ID)。它们的取值范围与游戏对象相同。因此,假如某个 ID 已经用于游戏对象,切勿将其重复用作 Room ID。 |
\akwarningSpatial Audio 会在后台针对每个 Room 将游戏对象注册到 Wwise。用户可以针对此游戏对象发送 Event 来触发环境声/房间底噪,但不要尝试在调用 AK::SoundEngine
时修改该对象的位置或 Game-defined 发送。
AkRoomParams::ReverbAuxBus
是最重要的 Room 设置,可在发声体位于该 Room 内时告知 Spatial Audio 应发送至哪条辅助总线。其他设置将在下文部分探讨(参见“ 使用 3D 混响 ”和“ 透射 ”部分)。
Portal 代表两个 Room 之间的开口。与 Room 相反,Portal 对应有位置和尺寸。因此,Spatial Audio 可自行执行几何包含关系检测。Portal 尺寸由 Portal 设置 AkPortalParams::Extent
给定。Spatial Audio 会使用宽度和高度(X 和 Y)计算衍射和散布,同时使用深度 (Z) 定义 Spatial Audio 在哪个区域内精确操控辅助发送电平、Room 对象方位及 Spread(用于 3D Spatialization),进而在两个相连 Room 之间应用平滑过渡。有关更多详细信息,请参见“ 使用 3D 混响 ”和“ 关于游戏对象 ”部分。另外,还可使用 AkPortalParams::bEnabled
设置将 Portal 设为启用(打开)或禁用(关闭)状态。
在结合 Spatial Audio Emitter 使用 AK::SoundEngine::SetMultiplePositions
时要特别小心,因为 Spatial Audio 只使用第一个声音位置执行包括反射、衍射和 Portal 过渡在内的各种计算。不过,可以针对采用 Room 发送的游戏对象使用 AK::SoundEngine::SetMultiplePositions,但要注意在游戏对象穿过
Portal 时只会将第一个位置用于两个 Room 之间的交叉淡变。另外,游戏也可结合 Spatial Audio Room 使用 AK::SoundEngine::SetGameObjectAuxSendValues
。这样除了针对 Room 对象和辅助总线的发送还会添加游戏的发送。有关更多详细信息,请参见“ 实现复杂房间混响 ”部分。
另外,还可结合 Spatial Audio Emitter 使用 AK::SoundEngine::SetObjectObstructionAndOcclusion
或 AK::SoundEngine::SetMultipleObstructionAndOcclusion
。不过,Spatial Audio 也会分别使用声障和声笼来对衍射和透射建模。倘若 API 驱动的声笼/声障值与 Spatial Audio 驱动的值发生冲突,声音引擎中将使用两者中的最大值。有关声障、声笼以及如何将其用于 Spatial Audio Room 和 Portal 的更多详细信息,请参见“\ref spatial_audio_roomsportals_modelingsoundpropagationfromsameroom”部分。
Integration Demo 示例(SDK/samples/IntegrationDemo 中)设有演示页面,并包含有关如何使用 API 的说明。请转至 Demo Positioning > Spatial Audio: Portals(演示定位 > Spatial Audio: 门户)。
在 Wwise Spatial Audio 环境下,完全利用抽象概念 Room 和 Portal 来管理其他房间的声音传播。若 Room 设有打开的 Portal 且存在至少一条到听者所在房间的传播路径,则使用 Obstruction 或 Diffraction 内置游戏参数模拟衍射。除此之外,Room 还会使用 Wwise Occlusion 对声音穿透墙壁的情形进行建模。
若想结合 Spatial Audio 的声障设置使用自己的声障解决方案(比如通过游戏端射线投射来驱动),则游戏可使用声音引擎 API AK::SoundEngine::SetObjectObstructionAndOcclusion
。若想模拟 Portal 开口的声笼效果,则游戏可使用 Spatial Audio API AK::SpatialAudio::SetPortalObstructionAndOcclusion
。不过无论在任何情况下,游戏都不能将 Room ID 作为游戏对象参数来调用 AK::SoundEngine::SetObjectObstructionAndOcclusion
,否则可能会导致未定义的行为。有关如何将房间内部声障用于 Spatial Audio 的更多详细信息,请参见“spatial_audio_roomsportals_modelingsoundpropagationfromsameroom”部分。
如需回顾相关声学概念,请参见“spatial_audio_concepts”部分。
下表简要列出了 Spatial Audio Room 和 Portal 的特性,并根据声学现象进行了分组,同时说明了与之对应的 Spatial Audio 属性以及声音设计师如何将其用于工程。
声学现象 | Spatial Audio | Wwise 中的声音设计 |
---|---|---|
直达路径的衍射 |
|
|
漫反射场(混响) |
|
|
房间耦合:<span>相邻 Room 的漫反射场的混响空间化和衍射 |
|
|
透射 |
|
|
Spatial Audio Room 和 Portal 所用的 Auxiliary Bus 设计与传统的环境建模并无本质区别。它要求为每个 Room 指派一条 Auxiliary Bus,并针对其启用声音设计师所选混响效果器。无论听者是在 Room 内部还是外部,使用的都是同一条总线。唯一的区别是需要在 Positioning(定位)选项卡中启用 Listener Relative Routing,并将 3D Spatialization 设为 Position + Orientation(位置 + 朝向)或 Position(位置),以便将其设为 3D 模式(如下图所示)。如此一来,Spatial Audio 便可在 Portal 位置对相邻 Room 的混响进行空间化处理,进而作用于 Room 内的游戏对象定位和 Spread(散布)。
Room 的基准朝向在房间设置( AkRoomParams::Up
和 AkRoomParams::Front
)中定义,并保持不变。对应游戏对象的朝向与 Room 的朝向保持一致。在听者位于 Room 内时,Spatial Audio 会将总线的 Spread 设为 100(360 度)。借助 3D 定位,可根据听者和 Room 的相对朝向旋转混响输出,并将其摆位至父总线。这是因为 Auxiliary Bus 与 Room 内的游戏对象绑定,而父总线又与听者绑定。以下截图显示了一个发声体——无线电——正在向 Auxiliary Bus Mezzanine2 发送。从下图可以看出,针对该房间(Ak_RV_Mezzanine)创建了独立的游戏对象 。该对象既不是 Radio(无线电),也不是听者 (PlayerCameraManager_0)。
假如混响中内嵌有空间化早期反射模式(该模式直接存在于 Wwise RoomVerb 的 ER 部分,并间接存在于 Wwise Convolution Reverb 中使用的多声道 IR 录音中),则其将与 Room 绑定,而不会随听者转向。这样做是为了适当营造沉浸感。换句话说,最好使用“旋转特性稳定”的配置。Ambisonics 配置相对于旋转具有不变性,所以更合适。标准配置(4.0、5.1 等)则不太合适。在使用标准配置时,最好选用没有中置声道的配置,并为各条辅助总线应用完全相同的配置,同时将 Focus(聚焦)设为 100。在这种情况下,假设 4.0 混响跟随 Room 朝向北方,那么听者在面朝北方时听到的混响效果会跟直接指派给扬声器时一样。听者在面朝正东、正西或正南时则会听到原始混响,但声道会互换。最后,听者在面朝其他方向时会听到每个声道的原始混响被混入一对输出声道。
在听者远离房间对应 Portal 时,Spatial Audio 会根据 Portal 的尺寸来缩小散布范围,随着距离的延长逐渐将混响输出收缩为点声源。在听者位于 Portal 中间时,Spread 设为 50(180 度)。在穿过房间后,Spread 进一步增大。此时,房间开口始终朝向最近的 Portal。
在为穿过 Portal 的声音混音时,Spatial Audio 会计算声源和听者之间整条路径的距离。在将声音混音到 Room 总线之前,此距离会应用于每个声音的衰减曲线,以此保证采用不同衰减曲线的声音具有正确的相对音量。在这种情况下,没有必要向 Room 总线直接应用额外的衰减。若 Room Auxiliary Bus 带有衰减曲线,则会将其应用在每个声音的衰减、后期混音之上,从而进一步降低混响的音量或为穿过 Portal 的信号应用额外的滤波。
Room 游戏对象的位置由 Spatial Audio 控制。在听者位于 Room 之内时,该游戏对象将被放在与听者相同的位置。在这种情况下,若指派有衰减曲线,则全部在距离 0 处取值。
![]() |
警告:在 Room Auxiliary Bus 指派有衰减曲线的情况下,为了允许 Spatial Audio 根据 Portal 的几何构造来修改 Spread,请勿在 Auxiliary Bus 的衰减设置中包含 Spread 曲线。倘若使用 Spread 曲线,则将改写 Spatial Audio 计算得出的值。 |
房间耦合(参见 房间耦合 部分)可通过链接 Room 总线来实现。为此,请确保针对所有 "Room" Auxiliary Bus 启用 Enable Game-Defined Sends(启用游戏定义的发送)复选框。这样 Room 就可同时将混响发送到听者所在的 Room 或路径中的下一 Room。声音的 Game-Defined Auxiliary Sends 音量和衰减曲线会控制要将多少声音混音到房间混响效果器链的第一条总线,各个 Room 的 Game-Defined Auxiliary Sends 音量则会决定将多少发送到效果器链中的下一 Room。它会影响通过 Portal 传播到相邻 Room 的声能数量。
Spatial Audio Room 和 Portal 的工作原理是操控 Wwise 声音引擎收到的游戏对象(游戏注册的发声体和 Spatial Audio 注册的 Room 游戏对象)的位置及其他固有属性(如游戏定义的发送、声障和声笼)。
在完成 Spatial Audio 的初始化设置 DiffractionFlags_CalcEmitterVirtualPosition
后,将修改听者相邻 Room 内发声体的位置,使其与听者之间呈衍射角(如适用)。在以下 3D Game Object Profiler(3D 游戏对象性能分析器)截图中,听者 (Listener L) 位于 Portal 右侧,实际发声体 (Emitter E) 位于左下方且无朝向矢量。因此,Spatial Audio 将发声体重新定位到了左上方,使视位置看上去就像从该角落切入一样,并始终符合传播距离的衰减规律。听者与 Portal 边缘的阴影区约呈 45 度,所以衍射系数为 27(如两条线段的交点处所标)。
在有多个 Portal 连通两个 Room 时,Spatial Audio 会将多个位置指派给发声体(每个 Portal 指派一个)。这时将使用 MultiPosition_MultiDirection
模式,以免在启用或禁用 Portal 时影响与此同时感知到的其他 Portal 的音量。
![]() |
警告:在结合 Spatial Audio Emitter 使用 AK::SoundEngine::SetMultiplePositions 时要特别小心,因为 Spatial Audio 只使用第一个声音位置执行包括反射、衍射和 Portal 过渡在内的各种计算。 |
Spatial Audio 会在内部按 Room 将游戏对象逐个注册到 Wwise。
![]() |
警告:此游戏对象的位置和辅助发送值不可直接调节。 |
在听者位于 Room 内时,Room 内的游戏对象将随听者移动。因此,Room 和 Listener 对象之间的距离近似为 0。不过,其朝向与 Room 设置 (AkRoomParams
) 中指定的朝向保持一致。有关 3D 总线朝向的论述,请参见“ 使用 3D 混响 ”部分。
在听者位于 Room 外时,Room 内的游戏对象将沿用对应 Portal 的位置。确切地说,是设在 Portal 后方与 Portal 正切的听者投影位置,并固定于 Portal 界限之内。您可以通过查看 Room 内的游戏对象来验证这一点(参见上文“ 发声体 ”部分的 3D Game Object Profiler 截图)。
对于多个 Portal,在 MultiPosition_MultiDirection
模式下,将为 Room 内的游戏对象指派多个位置(情形与发声体相同)。
在 Portal 内部过渡时,会对 Room 内部和 Portal 行为做平滑插值。
在 Spatial Audio Room 和 Portal 环境下,将利用抽象概念 Room 和 Portal 来管理听者之外其他房间的声音传播。另一 Room 内的发声体会通过多个 Portal 及与这些 Portal 关联的衍射将声音传播到听者;若无衍射路径,则通过声音对房间墙壁的透射来传播。对于需要传播的所有声音,确保在 Positioning 选项卡中选中 Enable Diffraction 复选框。
对于相邻 Room 内的每个发声体,Spatial Audio 都会计算相连 Portal 最近边缘与 Shadow Boundary(阴影边界)的衍射角。请参见上文“spatial_audio_concepts_diffraction”部分。然后,将此衍射角(最大 180 度)映射为衍射系数 (0 ~ 100%),并提供给 Wwise 用户,以便从两种方式中选一种来设置对应音频变换。用户可为“发声体”游戏对象设置 Obstruction 值,也可设置内置游戏参数 Diffraction 值。Spatial Audio 选用哪种设置取决于初始化时选择的 AkDiffractionFlags。
若要使用 Diffraction 内建参数,则需创建游戏参数,并在对应 Bind to Built-in Parameter(绑定至内建参数)下拉菜单中选择 Diffraction(衍射)。推送至该游戏参数的值的作用域由游戏对象界定,确保与发声体一一对应。然后,可结合使用 RTPC 来控制 Actor-Mixer 的属性。最好选用 Output Bus Volume(输出总线音量)和 Output Bus LPF(输出总线 LPF),来模拟衍射的频率相关行为。Output Bus Volume 和 Output Bus LPF 要优于基准 Volume 和 LPF,因为它们只会应用于直达信号路径,而不会应用于 Room 混响对应的辅助发送。
另外,Spatial Audio 的声音传播模型还包括了 Room 的漫反射能量(作为 Room 对应 Auxiliary Bus 的输出)。Spatial Audio 会同时计算这部分的衍射(湿声衍射)。Spatial Audio 假定漫反射能量沿 Portal 垂直方向从 Room 向外渗透。因此,它会计算相对于 Portal 法向矢量的衍射角。此衍射值可以用在 Wwise 中,方式与发声体的干声路径相同。在使用内置游戏参数时,应结合使用 RTPC 来控制房间对应的辅助总线(通常用于总线的 Output Bus Volume 和 Output Bus LPF)。为了避免影响此混响与听者所在房间混响耦合的辅助发送路径,最好选用总线的 Output Bus Volume 属性,而不要选用 Bus Volume 属性(情形与 Actor-Mixer 相同)。
另外,用户还可使用内置工程全局声障来修改 Spatial Audio 衍射生成的音频。此时,Spatial Audio 会使用计算得出的 Diffraction 值来控制声障。与 Diffraction 内置游戏参数不同,工程全局声障会映射至 Wwise 工程全局曲线。它们可以在 Project Settings(工程设置)中设置。Obstruction Volume、Obstruction LPF 和 Obstruction HPF 可有效作用于 Output Bus Volume、Output Bus LPF 和 Output Bus HPF(如上文所述)。由于声障曲线为全局设置,所以工程全局声障不像 Diffraction 内置游戏参数那样灵活。而另一方面,它们也不需要过多的操控和编辑(使用 RTPC)。另外,不同的 Obstruction 值可应用于游戏对象的各个位置,而内置游戏参数仅可将一个值统一应用于游戏对象的所有位置(在设有多个值时,取最小值)。如上文所述,在 Room 包含不止一个 Portal 时,会使用多个游戏对象位置。
在发声体处在不同的 Room 内时,Spatial Audio 还会使用“发声体”游戏对象的 Occlusion,来对声音穿透墙壁的情形进行建模。Occlusion 值从 Room 设置 AkRoomParams::WallOcclusion
获取;最大 Occlusion 值取自听者所在 Room 和发声体所在 Room 之间。Occlusion 会通过 Project Settings 的 Obstruction/Occlusion(声障/声笼)选项卡中定义的工程全局曲线映射至音量、LPF 和 HPF。与 Obstruction 不同,Occlusion 会同时影响发送至辅助总线的信号,而被遮蔽发声体信号对其所在 Room 混响以及耦合混响都有贡献。因此,这些贡献将根据 Occlusion 曲线来缩放和滤波。这样 Occlusion 就可以准确地构建吸收/透射模型。
相邻房间内通过 Portal 渗透到听者所在房间的衍射能量可被视为 Portal 位置的声源,因此也应对听者所在房间产生激励作用。也就是说,应将其发送至听者所在房间对应的 Auxiliary Bus。为此,可针对相邻房间对应的辅助总线勾选 Enable Game-Defined Sends 复选框(如上文所述)。您可以使用 Game-Defined Send Offset(游戏定义的发送偏置)来调节发送到其他 Room 混响器的散布量。
听者所在房间内的声障可使用 Geometric Diffraction 进行处理(参阅 使用 Geometry API 模拟衍射和透射 和 结合 Room 和 Portal 使用几何构造 API ),但它并不完全依赖 Spatial Audio Room 和 Portal。若不想通过将几何构造发送到 Spatial Audio 来执行声障计算,则须在游戏端处理同一房间内的声障。房间内声障计算中几何构造的表示、方法和规定的细节层次高度依赖于游戏引擎。游戏一般会采用不同复杂程度的射线投射法来实现这一操作。本节提供了一些有关如何结合 Room 和 Portal 在游戏端处理声障的技巧。
不过,借助 Spatial Audio Room 和 Portal,便不用针对每个发声体实施这一操作,而只需考虑听者所在房间内的发声体。这样做有它的好处,因为射线投射法一般会比 Spatial Audio 计算传播路径的算法占用更多资源。顾名思义,发声体和听者之间的房间内部声障作用发生在同一房间。在这种情况下,我们假定障碍物不会完全覆盖听者或发声体,而声音会通过房间内的反射传播到听者所在位置。我们可以通过单纯控制干声/直达信号路径进行准确建模,而不需要涉及辅助发送。也就是说,Obstruction 机制对此来说最为合适。为此,游戏应调用 AK::SoundEngine::SetObjectObstructionAndOcclusion
。
另外,相邻房间的 Portal 应被视为听者所在 Room 内的发声体。因此,游戏还需在听者和所在 Room 的 Portal 之间运行声障算法。然后,还要针对每个 Portal 调用 AK::SpatialAudio::SetPortalObstructionAndOcclusion,以便向听者明确声明房间内部声障。
多个房间之间也会发生声音传播。在搜索传播路径时,会在 SpatialAudio 内部搜索 Room 树。为了避免循环连接,在遇到已经到过的 Room 时,将停止搜索。搜索深度可通过 Spatial Audio 的初始化设置 AkSpatialAudioInitSettings::uMaxSoundPropagationDepth(默认值为
8)来加以限制。
您可以使用声音引擎 API AK::SoundEngine::SetGameObjectAuxSendValues
来将其他 Auxiliary Sends 添加到 Spatial Audio 所设的 Auxiliary Sends。这在设计相同房间内的复杂混响时可能会非常有用。比如,物体或地形需要应用不同的环境效果。另外,还可将 Room 对应的 AkRoomParams::ReverbAuxBus
保留为空 (AK_INVALID_AUX_ID
) ,仅由游戏通过 AK::SoundEngine::SetGameObjectAuxSendValues
来管理发送总线。
我们可以使用传给 Wwise Spatial Audio 的几何构造来模拟声音的衍射和透射。如此一来,便可完全替代游戏引擎在声障计算中使用的射线投射法。
在发声体和听者之间有物体阻挡时,Spatial Audio 会沿着物体边缘(如有)计算路径,并计算这些边缘周围声波弯曲产生的衍射系数。同时,相应地修改发声体的视入射角,并将衍射值发送给 Wwise,以便控制对声音的最终影响。通常,衍射会造成低通滤波。
此外,Spatial Audio 还会计算声音穿透几何构造的路径。在传播过程中穿透障碍物的声音需要应用透射损失系数。该系数取决于通过 API 指派给几何构造的表面属性。通常情况下,会使用低通滤波器和音量衰减来对透射损失进行建模。
下图为 Wwise 中 3D Game Object Viewer(3D 游戏对象查看器)的截图,它显示了薄壁边缘周围的声音衍射情况。
![]() |
警告: 虽然我们可以使用几何衍射和透射来完全替代游戏引擎在声障计算中使用的射线投射法,但要注意,随着几何构造越来越复杂,占用资源也会逐渐增加。因此,传给 Spatial Audio 的几何构造应尽量简单。另外,为了降低 Geometric Diffraction 的计算复杂度,最好结合运用 Room 和 Portal 抽象概念,这样会更加高效(参见“using_rooms_and_portals”部分)。 |
几何衍射可用来影响发声体和听者之间的直达声音传播路径。在结合使用 Wwise Reflect 时,还可用来影响早期反射路径。
对于传给 Spatial Audio 的每项几何构造集,都要明确声明是否要将其用于计算衍射路径。为此,可使用 AkGeometryParams::EnableDiffraction
标记。此标记方便生成衍射计算所需的边缘数据,其在直达路径的几何衍射和反射路径的衍射中均有应用。
另外,还要考虑是否允许网格的边界边缘衍射声音。对于给定网格,边界边缘被定义为多重三角网格边界上仅与一个三角形相连的边缘。边缘数量越多,衍射计算的复杂度越大。因此,在网格包含不会衍射声音的边界边缘时,应禁用相应选项。
最后还要注意,指派给声学表面的声学材质不会对衍射产生任何影响,因为边缘材料并不吸收能量。边缘只会造成声波弯曲。
首先,确保将 AkSpatialAudioInitSettings::bEnableTransmission 标记设为 True 来模拟透射。
在几何构造上,可能需要针对各种几何构造类型调节透射损失系数。比如,混凝土结构可能会阻挡几乎所有的声音透射,而胶合板材质的几何构造则可能只会阻挡很少一部分声音。
AkGeometryParams::Triangles
数组中的每个 AkTriangle
都包含对 AkGeometryParams::Surfaces
数组的索引 AkTriangle::surface
。AkAcousticSurface::occlusion
字段用于描述要将多少透射损失应用于穿透对应三角形的声音。该字段的取值范围为 0 ~ 1。透射损失会换算为百分比并用来评估声笼曲线。对于具有给定透射损失的声音,最终应用的音量衰减和滤波器值取决于 Wwise Project Settings 中定义的声笼曲线。
如需了解如何使用几何构造来确定直达路径的几何衍射,请参见 Integration Demo 示例中的 Geometric Diffraction 演示(SDK/samples/IntegrationDemo 中)。请转至 Demo Positioning > Spatial Audio: Geometry(演示定位 > Spatial Audio: 几何构造)。
在 Wwise 设计工具内的 Positioning 选项卡中,确保选中 Enable Diffraction。此复选框用来启用与衍射和透射相关的 Spatial Audio 功能,包括:
AkRoomParams::WallOcclusion
还是与三角形关联的 AkAcousticSurface::occlusion
。AkSpatialAudioInitSettings::bCalcEmitterVirtualPosition
的情况下,针对衍射路径生成虚拟位置并将其发送到声音引擎来渲染声音。AkSpatialAudioInitSettings::bUseObstruction
的情况下,根据衍射系数应用声障曲线。若游戏还通过 AK::SoundEngine::SetObjectObstructionAndOcclusion
设定了声障值,则使用两者中的最大值。AkSpatialAudioInitSettings::bUseOcclusion
的情况下,根据透射损失系数应用声笼曲线。若游戏还通过 AK::SoundEngine::SetObjectObstructionAndOcclusion
设定了声笼值,则使用两者中的最大值。通过适当设置性能分析设置和视图选项,可以在 3D Game Object Viewer 中查看衍射设置(见下图)。在此,将针对各条衍射边缘显示计算得出的发声体与听者之间路径的衍射系数。系统会根据初始化 Spatial Audio 时传递的 AkSpatialAudioInitSettings::uDiffractionFlags
,通过 Diffraction 这个内置游戏参数和发声体的 Obstruction 值这两者或者其中之一将此衍射系数传给 Wwise。您可以直接在 RTPC 曲线中分析其所用内置游戏参数值,并在 Profiler 的 Obstruction/Occlusion 选项卡中分析 Obstruction。
跟 Portal 一样,在发声体位于听者视线之内时,Diffraction 值为 0。在穿过阴影区的过程中,该值不断增大(参见“spatial_audio_concepts_diffraction”部分)。有关阴影区衍射的更多详细信息以及如何使用内置游戏参数 Diffraction 和 Obstruction 的论述,请参见“房间和门户”的“spatial_audio_roomsportals_modelingsoundpropagationfromotherrooms_diffraction”部分。
在使用 Spatial Audio Room 和 Portal(参见“ 使用房间和门户 ”部分)时,Portal 也会对相邻房间内直达声音的衍射建模。这两个系统互为补充,对于与听者不在同一房间的发声体,确保不会搜索几何构造驱动的衍射路径。Room 和 Portal 比几何构造的计算效率高很多。为了降低计算复杂度,最好结合使用两个系统。
如上文所述,早期反射可能会在边缘附近发生衍射。在发声体连通 Wwise Reflect 的情况下,Spatial Audio 支持对这一现象建模。
在解释如何建模之前,我们需要先定义可视区衍射。
在下图中,发声体位于听者视线之内,但听者并不在镜面反射路径上。因此,它在可视区。如“spatial_audio_concepts_diffraction”中所述,可视区也会出现衍射。不过,在 Wwise Spatial Audio 中,无论是 Room 和 Portal 还是直达路径模型的 Geometric Diffraction,都不考虑可视区的衍射,因为其相较于实际直达路径可以忽略不计。然而,对于反射来说,可视区衍射会产生很大影响。若没有衍射,则只有反射区能听到早期反射(纯镜面反射)。一旦听者进入可视区,反射就会不起作用。在启用衍射后,边缘会衍射反射波。这样在进入和离开反射区时虽然有滤波和衰减,但听者仍可感知到反射。
在反射区中,镜面反射占据主导,没有衍射路径,因此也不会计算衍射值。在反射区和可视区之间的边界处,给定边缘的可视区衍射计算值为 0;在可视区和阴影区之间的边界处,该值为 100。
对于高阶早期反射,同时存在可视区和阴影区衍射。
在 Wwise 设计工具中,针对所有需要反射的声音将所需的早期反射发送设置为带有 Wwise Reflect 的辅助总线。有关更多详细信息,请参阅 Wwise 工程设置 。在此,既不需要针对衍射反射专门设置并启用衍射,也不需要为几何构造启用衍射。
在 Wwise Reflect 中,受衍射影响的反射将呈现为镜像声源。您可以根据衍射状况使用以下三条曲线来设计衍射对反射的影响:Diffraction Attenuation(衍射衰减)、Diffraction LPF(衍射 LPF)和 Diffraction HPF(衍射 HPF)。有关更多详细信息,请参阅 Wwise Reflect 文档。
我们可以结合 Wwise Spatial Audio 中的 Room 和 Portal 使用几何构造 API 来构建反射和衍射模型。为此,可将 Room 和 Portal 网络视为对周围几何构造的上层抽象(或者说细节程度较低)。适当地结合 Room 和 Portal 使用上层几何构造,可以让声学环境的模拟具有一定细节并且高效。
若发声体正在播放声音且正确设置了几何衍射(参见 针对衍射和透射设置声音 部分),但其与听者不在同一 Room,则按照以下方式计算几何路径:
即便有多达两个平面与门户开口相交,反射声也可穿过门户。因为 Portal 本身来说就是声学开口,所以不用在三角形几何构造上另建开口,声音也能穿过。如此一来,便大大减少了所需的三角形数量。比如,在采用箱体构建 Room 的几何构造时,会为六个侧面分别使用两个三角形。若用户希望声音能传到箱体外部,只需添加一个与墙壁相交的 Portal (其 Z 轴垂直于墙面)即可。照例来说,游戏会使用 AK::SpatialAudio::SetGameObjectInRoom
来判定游戏对象是在 Room 内部还是外部(参阅 API 概述 )。 若发声体正在播放声音且正确设置了反射,但其与听者不在同一 Room,则只要声音位于其传播网络范围内就会执行反射模拟。反射的计算方式如下:
为了限制射线-三角形相交检测和潜在反射表面的搜索范围,现在可将几何构造手动指派给特定的 Room。为此,请将 AkGeometryParams::RoomID
设为特定 Room 的 ID。这样可以告知 Spatial Audio,该 Room 内的几何构造只能通过 Portal 从另一 Room 看到,无法直接看到。因为一项几何构造集只能关联一个 Room ID,所以除非将 AkGeometryParams::RoomID 设为无效,否则 Room 不能包含可在多个 Room 内看到的几何构造。另外,假如几何构造集被关联到了特定 Room ID,那么在该 Room 内便无法再看到未与其明确关联的几何构造。在将几何构造集指派给 Room 后,在模拟该 Room 内的反射和衍射时,Spatial Audio 仅会查找与对应 Room ID 关联的特定几何构造。
“随机射线投射”是一种可以高效地估算 N 阶反射和衍射的技术。它的基本理念是从听者端随机地投射射线,并通过一系列反射和衍射来追踪其路径。这种技术是在图形渲染技术的基础上演化而来的。当前实现支持在听者端和发声体端实施最高 4 阶的反射和衍射。
在针对随机射线投射引擎定义几何构造时,存在一些限制。这些限制会对 CPU 性能和应用效果产生影响。
在三角形小于采样密度时,射线投射引擎有可能会找不到它。
几何构造的可见角度 α 是指听者可从怎样的角度看到几何构造。两条射线之间的平均角度 γ 则会随着初级射线数变化。α 和 γ 之间的关系会影响找到与物体的交点(反射点或衍射点)的可能性。若 γ 小于 α,则找到交点的可能性较高。若 γ 大于 α,则找到交点的可能性较低。
几何构造中包含的三角形数会直接影响引擎的 CPU 用量:三角形越多,CPU 用量就越高。这是因为需要对物体进行更多的相交检测。通常,声音传播并不需要太过精细的几何构造。在不影响应用效果的前提下,可通过适当减少三角形数来提升 CPU 性能。
有些几何构造形状会比较不好处理。通常,像平面和箱体这样的几何构造处理起来较为简单,在声音传播方面的应用效果也最好。球体和圆柱体则容易出现错误。这是因为球体和圆柱体会涉及到曲率的问题。有些衍射边缘可能会无法找到,从而导致部分衍射路径丢失。大部分情况下会借助各种启发式算法来克服这一问题。通过增加初级射线数或简化几何构造也可解决该问题。
虽然 Wwise Reflect 可以使用 AK::SoundEngine::SendPluginCustomGameData
直接由游戏控制,但 Spatial Audio 能方便地跟踪记录各个发声体和为声像源打包,从而让使用变得更简单。此外,您可以使用表面反射器(可能在同一个目标总线/插件上)来对“原始”声像源混做混音和匹配。
为每个声像源调用 AK::SpatialAudio::SetImageSource
。针对总线 ID 以及游戏对象 ID (请注意该游戏对象 ID 也可能是听者,或者主听者)。请参阅 AkReflectImageSource
了解更多有关如何描述声像源的详情。
声像源可能由游戏引擎提供给 Reflect,这些游戏引擎已经通过光线投射,或通过它们自己的声像源算法实现了这一功能。
请参阅上面的 Wwise 工程设置 查看 使用 Geometry API 模拟早期反射 ——它也是一样。 您也可以参阅 Wwise Help 中的 Wwise Reflect 文档,查看 FPS 声音上 Reflect 的示例设计。
![]() |
备注: 设计工具中的早期反射发送电平和总线不适用于通过 AK::SpatialAudio::SetImageSource() 设置的镜像声源。在使用此函数时,只能通过程序来设置 Reflect 总线和发送电平。 |