最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity-空間音響 SDK

2021-01-20 12:17 作者:unity_某某師_高錦錦  | 我要投稿

概述

空間音響 SDK 是原生音頻插件 SDK 的擴展,可用于更改音頻從音頻源傳輸?shù)街車臻g的方式。內(nèi)置的音頻源平移功能可視為一種簡單的空間化形式,因為它獲取音頻源,并基于音頻監(jiān)聽器 (AudioListener) 和音頻源 (AudioSource) 之間的距離和角度來調(diào)節(jié)左耳和右耳影響力的增益。在水平面上為玩家提供了簡潔的方向提示。

背景

隨著虛擬現(xiàn)實和增強現(xiàn)實系統(tǒng)的出現(xiàn),空間化方法作為滿足玩家沉浸感的關(guān)鍵組成部分顯得尤為重要。耳朵和大腦可以非常明顯地察覺到左耳和右耳接收聲音的細微延遲。此外,無意中可以分辨出高頻平衡的變化,從而判斷物體是在前面還是后面,甚至是上面還是下面。也可以根據(jù)每只耳朵聽到的聲音的不同來判斷物體是否被遮擋,或者根據(jù)聲音的反射推斷出我們所處房間的結(jié)構(gòu)。換言之:聲音對于日常生活指引非常重要,可能平時沒有過于關(guān)注!

就計算能力而言,聲音遮擋是難以解決的問題。光在全局光照中的運動是一瞬間,聲音的移動速度非常慢。因此,計算聲音在房間中實際移動的軌跡(作為波)無法通過計算來實現(xiàn)。同理,在空間化的處理過程中,有著這方面的難題。

一些解決方案僅解決 HRTF 問題。HRTF 表示頭部相關(guān)傳輸函數(shù) (Head-Related Transfer Function),在圖形學(xué)中可以類比為球形的諧波:即,兩只耳朵聽到的聲音方向會影響濾波,包括耳朵之間的微弱延遲以及耳罩、頭部本身和肩部構(gòu)成的定向濾波。相對于傳統(tǒng)平移解決方案,添加 HRTF 濾波已經(jīng)極大地改善方向感(典型且有名的示例就是虛擬理發(fā)店的雙耳錄音)。但是直接 HRTF 在某種程度上受到限制,因為它只涉及音頻的直線路徑,而不涉及在空間中的傳輸情況。

遮擋是在此基礎(chǔ)上更進一步的問題,它可以在墻壁上間接反射聲音。若要再次與圖形世界進行粗略類比,可將其與鏡面反射進行比較;在某種意義上,音頻源和聽者位置都決定了結(jié)果,當然每個反射的定向聲波都會以不同的 HRTF 抵達每只耳朵,并根據(jù)聲波行進的路徑長度而產(chǎn)生不同延遲。

在房間內(nèi)反射多數(shù)情況類似全局光照解決方案的漫反射部分,因為聲音被發(fā)散到房間后在多個墻壁上反射,最后作為重疊聲波的效果抵達耳朵,每個聲波都有不同的方向和相對于音頻源的延遲效果。

SDK 和實現(xiàn)示例

對應(yīng)于如此之多的難題,存在各種不同的音頻空間化解決方案。在 Unity 中支持這些的最佳方法是創(chuàng)建一個開放式接口,也就是空間音響 SDK,這是基于原生音頻插件 SDK 的擴展,允許將 Unity 中的標準平移器替換為更高級的平移器,并提供有關(guān)計算所需的音頻源和監(jiān)聽器的重要元數(shù)據(jù)的訪問權(quán)。

此處提供了空間音響的一個實現(xiàn)示例。這個示例故意做得很簡單,只支持直接 HRTF,需要針對生產(chǎn)用途進行優(yōu)化。插件隨附一個簡單的混響,僅用于展示如何將音頻數(shù)據(jù)從空間音響插件路由到混響插件。HRTF 濾波基于?KEMAR?數(shù)據(jù)集,此數(shù)據(jù)集是由麻省理工學(xué)院媒體實驗室的 Bill Gardner 在虛擬頭部上進行的一組耳脈沖響應(yīng)記錄。這些脈沖響應(yīng)通過快速傅立葉變換完成快速卷積與輸入信號的卷積。位置元數(shù)據(jù)僅用于選取正確的脈沖響應(yīng)集,因為數(shù)據(jù)集是由頭部向下 40 度到向上 90 度仰角的循環(huán)脈沖響應(yīng)組成。

初始化

Unity 中的空間音響效果和混音器效果之間的主要區(qū)別在于:空間音響效果位于產(chǎn)生音頻數(shù)據(jù)流的音頻源解碼器之后,使得每個音頻源具有自己的效果實例來處理該音頻源產(chǎn)生的音頻。這與混音器插件不同,混音器插件會處理連接到混音器組的各種音頻源產(chǎn)生的音頻混合。要使插件能夠像這樣工作,必須在效果的描述位字段中設(shè)置一個標志:

definition.flags |= UnityAudioEffectDefinitionFlags_IsSpatializer;

在初始化時設(shè)置此標志會在插件掃描階段通知 Unity 這是一個空間音響效果,因此,在創(chuàng)建此插件的實例時會為 UnityAudioEffectState 結(jié)構(gòu)的 spatializerdata 成員分配 UnityAudioSpatializerData 結(jié)構(gòu)。

為了能夠在項目中使用空間音響效果,首先需要在音頻項目設(shè)置中選擇空間音響效果:

空間音響插件選擇器

在 AudioSource 上,Spatialize 復(fù)選框可以啟用空間音響。此外,還可在腳本中通過 AudioSource.spatialize 屬性來控制此選項。在具有大量音頻的游戲中,合理做法是僅對附近的聲音啟用空間音響,而對遠處的聲音使用傳統(tǒng)方案。

AudioSource 上的 Spatializer 復(fù)選框

空間音響效果元數(shù)據(jù)

與混音器中對混合聲音運行的其他效果不同,空間音響效果是在音頻源解碼音頻數(shù)據(jù)后直接應(yīng)用。因此,空間音響效果的每個實例都有一個自身的 UnityAudioSpatializerData 實例,該實例與音頻源的主要數(shù)據(jù)相關(guān)聯(lián)。

struct UnityAudioSpatializerData{
 ?float listenermatrix[16]; 
 ?// 此矩陣用于將音頻源位置變換為監(jiān)聽器的本地空間 ? ?
 ?float sourcematrix[16]; ? 
 ?// 變換音頻源的矩陣 ? ?
 ?float spatialblend; ? ? ? 
 ?// 距離控制的空間混合 ? ?
 ?float reverbzonemix; ? ? ?
 ?// 音頻源上的混響區(qū)混音級別參數(shù)(和曲線) ? ?
 ?float spread; ? ? ? ? ? ? 
 ?// 音頻源的傳播參數(shù)(0 到 360 度) ? ?
 ?float stereopan; ? ? ? ? ?
 ?// 音頻源的立體聲平移參數(shù)(-1:全左,1:全右) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?	 // 空間音響插件可以重寫距離衰減 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
 ?// 以便影響語音優(yōu)先級(將此回調(diào)保留為 NULL 可使用 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?	// 內(nèi)置音頻源衰減曲線) ? ?
 ?UnityAudioEffect_DistanceAttenuationCallback distanceattenuationcallback;
};

該結(jié)構(gòu)包含用于監(jiān)聽器和音頻源的完整 4x4 變換矩陣。監(jiān)聽器矩陣已經(jīng)被反轉(zhuǎn),因此可輕松將兩個矩陣相乘以獲得相對方向矢量。監(jiān)聽器矩陣始終是正交的,因此反轉(zhuǎn)計算開銷很低。此外,該結(jié)構(gòu)還包含與音頻源屬性(Spatial Blend、Reverb Zone Mix、Spread 和 Stereo Pan)相對應(yīng)的字段。空間音響負責正確地實現(xiàn)這些字段,因為當空間音響處于活動狀態(tài)時,Unity 的音頻系統(tǒng)僅以立體聲信號形式提供原始音頻源(即使音頻源為單聲道或多聲道,這種情況下使用上混或下混)。

矩陣協(xié)議

sourcematrix 字段包含與音頻源相關(guān)聯(lián)的變換矩陣的普通副本。對于游戲?qū)ο笊衔葱D(zhuǎn)的普通音頻源,這只是一個轉(zhuǎn)換矩陣,在元素 12、13 和 14位置處編碼。 listenermatrix 字段包含與音頻監(jiān)聽器相關(guān)聯(lián)的變換矩陣的逆矩陣。這樣可以非常方便地確定從監(jiān)聽器到音頻源的方向矢量,如下所示:

float dir_x = L[0] * S[12] + L[4] * S[13] + L[ 8] * S[14] + L[12]; float dir_y = L[1] * S[12] + L[5] * S[13] + L[ 9] * S[14] + L[13]; float dir_z = L[2] * S[12] + L[6] * S[13] + L[10] * S[14] + L[14];

其中 L 表示 listenermatrix 字段,S 表示 sourcematrix 字段。如果一個 listenermatrix 未旋轉(zhuǎn)并且具有均勻縮放值 1(攝像機矩陣絕不能縮放),請注意 (L[12], L[13], L[14]) 中的位置實際上是您在 Unity 的檢視面板中看到的值的反數(shù)值。這是因為 listenermatrix 是攝像機變換矩陣的逆矩陣。如果攝像機也已旋轉(zhuǎn),我們將無法僅通過求反直接從矩陣讀取位置,而必須首先撤消旋轉(zhuǎn)的效果。幸運的是,很容易對此類變換-旋轉(zhuǎn)-縮放矩陣進行求逆,具體方法如此處所述,所以我們需要做的是轉(zhuǎn)置 L 的左上角 3x3 旋轉(zhuǎn)矩陣,并按如下所示來計算位置:

float listenerpos_x = -(L[0] * L[12] + L[ 1] * L[13] + L[ 2] * L[14]); float listenerpos_y = -(L[4] * L[12] + L[ 5] * L[13] + L[ 6] * L[14]); float listenerpos_z = -(L[8] * L[12] + L[ 9] * L[13] + L[10] * L[14]);

衰減曲線和可聽度

仍然由 Unity 音頻系統(tǒng)處理的唯一事情是距離衰減,距離衰減在聲音進入空間化階段之前應(yīng)用于聲音,并且必須這樣做才能讓音頻系統(tǒng)知道音頻源的近似可聽度,這可以用于基于重要性的聲音動態(tài)虛擬化,從而匹配用戶定義的 Max Real Voices 限制。由于這是一個“先有雞還是先有蛋”問題,所以這個信息不是從實際信號水平測量中檢索得出,而是對應(yīng)于我們從距離控制衰減曲線、Volume 屬性和混音器應(yīng)用的衰減中讀取的值的組合結(jié)果。但是可以用您自己的曲線來覆蓋衰減曲線,或者使用通過音頻源的曲線計算出的值作為修改基礎(chǔ)。為此,UnityAudioSpatializerData 結(jié)構(gòu)中提供了一個可以實現(xiàn)的回調(diào):

typedef UNITY_AUDIODSP_RESULT(UNITY_AUDIODSP_CALLBACK*UnityAudioEffect_DistanceAttenuationCallback)(UnityAudioEffectState* state,float distanceIn,float attenuationIn,float*attenuationOut);

一個簡單的自定義對數(shù)曲線可以按如下方式實現(xiàn):

UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK SimpleLogAttenuation( UnityAudioEffectState* state,float distanceIn,float attenuationIn,float* attenuationOut){
 ?const float rollOffScale = 1.0f; 
 ?// 類似于音頻項目設(shè)置
 ?*attenuationOut = 1.0f / max(1.0f, rollOffScale * distanceIn);
 ?return UNITY_AUDIODSP_OK;
}

腳本 API

作為本地端的補充,音頻源中還有兩個新方法,允許從空間音響效果中設(shè)置和獲取參數(shù)。這兩個新方法的名稱為 SetSpatializerFloat/GetSpatializerFloat,它們的工作方式類似于通用原生音頻插件接口中使用的 SetFloatParameter/GetFloatParameter。主要區(qū)別在于 SetSpatializerFloat/GetSpatializerFloat 接受要設(shè)置/讀取的參數(shù)并進行索引,而 SetSpatializerFloat/GetSpatializerFloat 按名稱引用這些參數(shù)。

此外,布爾值屬性 AudioSource.spatializer 鏈接到音頻源檢視面板中的復(fù)選框,并根據(jù)音頻項目設(shè)置中的選擇來控制空間音響效果的實例化和取消分配。如果空間音響效果的實例化會導(dǎo)致開銷巨大(在內(nèi)存分配、預(yù)計算等方面),可考慮讓 Unity 插件接口綁定關(guān)系保持輕量級,并動態(tài)分配效果到資源池中,使激活/停用不會導(dǎo)致丟幀。

示例插件的已知限制

由于使用了快速卷積算法,因此快速移動會導(dǎo)致一些拉鏈瑕疵,這些瑕疵可以通過使用重疊保存卷積或交叉淡化緩沖來消除。此外,代碼不支持將頭部傾斜到側(cè)面,但應(yīng)該很容易修復(fù)此問題。?KEMAR?數(shù)據(jù)集是本演示中唯一使用的數(shù)據(jù)集。IRCAM 提供了幾個通過人類受試者獲取的數(shù)據(jù)集。

Unity-空間音響 SDK的評論 (共 條)

分享到微博請遵守國家法律
舞阳县| 大宁县| 沁阳市| 武义县| 女性| 永德县| 金昌市| 蚌埠市| 青田县| 察哈| 三门县| 文登市| 手游| 彩票| 盐源县| 华池县| 宿州市| 尉氏县| 富平县| 淅川县| 安溪县| 新沂市| 宜城市| 尖扎县| 深水埗区| 额济纳旗| 莱芜市| 三门县| 房山区| 临潭县| 和政县| 密云县| 宝山区| 清远市| 洪洞县| 普定县| 西宁市| 轮台县| 聂荣县| 铜陵市| 澄迈县|