3D声效的原理是这样的:
首先要根据发声者的位置,声音的方向,声音锥的内锥角和外锥角,倾听者的头顶方向,面向方向,位置的各种数值来决定声音的音量大小.
在内锥区域,随着发声者与倾听者的距离越大,声音逐渐变小,小到一定程度就不再变化.相反,距离越小,声音变大,大到一定程度声音不再变化.在内锥与外锥之间的区域,随着角度的增大声音有所减弱;在声音锥以外的区域,声音大小逐渐减弱(随着距离的增大逐渐减少).倾听者侧身听与正面听的声音是不同的.
这里只介绍directX里面的API函数的方法.
DirectSound默认的最小距离为DS3D_DEFAULTMINDISTANCE=1,最大的距离DS3D_DEFALTMAXDISTANCE=100billion,默认情况是忽视最大距离的作用.这里的两个距离可以调用函数改变数值.
3D声效的编程:
首先必须在添加DSBCAPS_CTRL3D创建出的IDirectSoundBuffer的基础上,调用函数QuertInterface(IID_IDirectSound3DBuffer8,(void **)&pDirectSound3DBuffer8);这里的pDirectSound3DBuffer8是次缓冲区的接口指针,也是发声者.
然后,通过这个发声者调用
HRESULT SetPosition(D3DVALUE x,D3DVALUE y,D3DVALUE z,DWORD dwApply //启动时机,一般为DS3D_IMMEDIATE,表示立即启用),
HRESULT GetPostion(D3DVECTOR * pvPosition);
HRESULT SetConeAngles(DWORD dwInsideConeAngle,DWORD dwOutsizeConeAngles,DWORD dwApply);
HRESULT GetConeAngles(LPDWORD pdwInsideConeAngle,LPDWORD pdwOutsideConeAngle);
HRESULT SetConeOrientation(D3DVALUE x,D3DVALUE y,D3DVALUE z,DWORD dwApply);//声音锥方向
HRESULT GetConeOrientation(D3DVECTOR *pvOrientation);
HRESULT SetMaxDistance(D3DVALUE flMaxDistance,DWORD dwApply);
HRESULT GetMaxDistance(D3DVALUE *pflMaxDistance);
HRESULT SetMinDistance(D3DVALUE flMinDistance,DWORD dwApply);
HRESULT GetMinDistance(D3DVALUE * pflMinDistance);
HRESULT SetVelocity(D3DVALUE x,D3DVALUE y,D3DVALUE z,DWORD dwApply);//声音的速度
HRESULT GetVelocity(D3DVECTOR * pvVelocity);
HRESULT SetConeOutsideVolume(LONG lConeOutsideVolume,DWORD dwApply);
一系列的函数来输入3D音效的发声者的各个数据的值.
由于IDirectSound3DBuffer8并不包含Play等控制函数,因此在播放控制中,我们只能在通过次缓冲区的IDirectSoundBuffer接口指针进行控制处理.
另外还要创建带DSBCAPS_CTRL3D标志的主缓冲区,用主缓冲的接口指针IDirectSoundBuffer调用QueryInterface函数生成IDirectSound3DListener接口指针,再通过该接口指针调用函数:
HRESULT SetPosition(D3DVALUE x,D3DVALUE y,D3DVALUE z,DWORD dwApply);
HRESULT GetPosition(D3DVECOTR * pvPosition);
HRESULT SetOrientation(D3DVALUE xFront,D3DVALUE yFront,D3DVALUE zFront,D3DVALUE xTop,D3DVALUE yTop,D3DVALUE zTop,DWORD dwApply);//倾听者方向,面对方向,头顶方向
HRESULT GetOrientation(D3DVECTOR * pvOrientFront, D3DVECOTR * pvOrientTop);
因此,利用directsound创建3D声效,先要添加DSBCAPS_CTRL3D标志去创建主次缓冲区,主缓冲区创建Listener,设置Listener的各种数值,次缓冲区创建发声者,设置发声者的各种数值,最后调用次缓冲区的IDirectSoundBuffer进行声音播放的控制.
在用DSBCAPS_CTRL3D时,必须使用能够使用3D效果的音频文件 如:windows 自带的Windows XP 错误.wav等;其他的不支持3D效果的文件是会创建失败的。
关于3D声效的算法有多种,可以用GUID_NULL(默认的)、DS3DALG_NO_VIRTUALIZATION基础3D效果,DS3DALG_HRTF_FULL高质量3D效果(用CPU多),DS3DALG_HRTF_LIGHT好的3D效果(CPU比高质量低)
欢迎交流心得!!