在使用环境时,经常发生的一种情况是,一个游戏对象被另一个对象遮挡(例如墙壁或横梁),或者封闭在室内,听者只可听到从墙壁泄漏出来的一点声音。
声笼(Occlusion)和声障(Obstruction)的示例如下图所示。
声障的示例
通过使用音量控制或只作用于信号直通路径的低通滤波器(LPF),即可对声障建模。环境反射不受影响。
声笼的示例
通过使用音量控制或同时作用于信号直通路径和环境反射的 LPF,即可对声笼建模。
|
Note: 注意,声障和声笼可同时发生,并可使用受到声障和声笼值影响的直通路径来建模。然而,反射路径只受声笼值的影响。 |
以下是声音引擎中声障/声笼处理管线的示意图:
声障/声笼处理管线
游戏引擎负责确定声障值和声笼值,它使用对象和听者在游戏几何图形中的位置来确定。
声音设计师可访问 Wwise Project Settings/Curves 选项卡中的曲线来确定音量和 LPE 如何对声障和声笼计算值做出反应。
声音设计师也可启用或禁用任何曲线,以充分满足性能和逼真度需求。
在 Wwise 中自定义声障和声笼曲线
通过使用此快照的曲线,设置 1.0f(100)的声障值将在源对象上产生 -50 dB 的音量变动。
有关使用 Wwise 自定义声障和声笼曲线的详情,请参阅 Wwise 联机帮助。
游戏程序员必须计算影响每个听者的每个游戏对象的声障和声笼,并使用以下调用把计算值传递给声音引擎:
|
Caution: 声障和声笼级别必须永远位于 0.0f 和 1.0f 之间。 |
当为游戏对象启用多个听者时,声音引擎会确定所有听者应能够听到的最小 LPF 值和最大音量值;然后使用该值计算声障/声笼结果。
#define MAIN_LISTENER 0 // 游戏循环 while( TRUE ) { (...) for( int iGameObject = 0; iGameObject < nbObjects; iGameObject++ ) { AkReal32 fCalculatedObs, fCalculatedOcc; pGeometryModule->GetObsAndOccForGameObject( iGameObject, MAIN_LISTENER, &fCalculatedObs, &fCalculatedOcc ); AK::SoundEngine::SetObjectObstructionAndOcclusion( iGameObject, MAIN_LISTENER, fCalculatedObs, fCalculatedOcc ); } (...) }