Dsound提供了模擬的聲源對象和聽者(listener),聲源和聽者的關系可以通過三個變量來描述:在三維空間的位置,運動的速度,以及運動方向.
產生音效的幾個條件是: 1)聲源不動,聽者移動,2)聲源走動,聽者移動, 3)聲源和聽者都移動.
3d環境里面,通過IDirectSound3DBuffer8接口來表述聲源,這個接口只有在創建時設置DSBCAPS_CTRL3D標志的DirectSound buffer才支持這個接口,這個接口提供一些函數來設置和獲取聲源的一些屬性,可以通過主緩沖區來獲取IDirectSound3DListener8接口,通過這個接口,我們可以控制著聲學環境中的多數參數,比如多普勒變換的數量,音量衰減的比率.
當聽者接近聲源的時候,聽到的聲音就越大,否則就越小,直到消失.
聲源的最小距離,就是聲音的音量開始隨著距離大幅度衰減的起始點.
DirectSound的缺省的距離DS3D_DEFAULTMINDISTANCE定義為1個單位,或者是1米,我們規定,聲音在1米處的音量是full volume,在2米衰減一半,4米衰減為1/4,一次類推.
最大距離,就是聲源的音量不再衰減的距離,我們稱為聲源的最大距離.
sound buffer處理模式: normal, head-relative, disabled.
在正常模式下面,聲源的位置和方向是真實世界中的絕對值,這種模式適合聲源相對于聽者不動的情形.
在head relative模式下,聲源的所有3d特性都跟聽者的當前的位置,速度,以及方向有關,當聽者移動,或者轉動方向,3d buffer就會自動重新調整world space.這種模式下可以實現一種在聽者頭部不停的嗡嗡叫的聲音,那些一直跟隨著聽者的聲音,根本沒必要用3d聲音來實現.
在disable 模式下,3d聲音失效,所有的聲音聽起來好象來自聽者頭部的.
主要注意的是兩個位置: 聲源位置, 聽者位置,之前我遇到的問題就是這個問題了,listenerPosition在登陸界面播放界面音效的時候,就記錄了,但是在進入游戲以后卻沒有將玩家的坐標重新賦給聽者的位置,并且根據玩家的狀態不停地更新.
1)聲源位置確定,但是聽者位置不對,這樣就無法找到聲音的有效距離,這樣使3d音效看起來像是環境聲音一樣,走到哪里聽到哪里.
2)從模型里面獲取的位置只是初始化的時候的位置,后來綁定到模型上面的位置卻沒有確定下來,這樣一來,造成了聲源位置和聽者位置都不對.
后來在direct sound里面做了嘗試代碼:將listener和sound buffer都設置成相應的位置,然后在這個位置上面播放聲音,結果發現毫無距離感和衰減,directsound里面的play3DSound例子其實也并非真正意義上的positional sound,因為它只是用正余弦函數在改變聲源的位置.給的感覺只是聲音飛來飛去的,并沒有有什么衰減的成分在里面,另外在那邊做一些測試,將聲源位置固定,然后改變聽者的距離,我猜想這樣應該就有一種,靠近聲源位置的話,聲音就大,遠離聲源位置的話,聲音就小.事實上就跟播放普通音樂一樣.不過唯一值得贊揚的是:directsound里面有次緩沖區這個概念來支持聲音混合,以及可以播放音樂,真正意義上的3d音效還是不用directSound比較好.建議使用fmod,或者openal之類的,比較實在.
DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY = DSBCAPS_CTRLDEFAULT.
DirectSound不支持雙聲道混合(雙雙,或者單雙),即只支持單聲道混合,并且要求聲音的信息(比如頻率,采樣)一致. 建議采用8位采樣大小,以及22Khz的采樣頻率,相關轉換軟件用goldwave.