你好,我正在和OpenAL做一个项目。我试图让alDistanceModel正常工作,但它似乎不起作用。我看了OpenAL Manuel关于它的深入研究,但我仍然很困惑。
我有一个source_id: std::map source_id的映射;它保存实际的缓冲键并存储源id。
我还有一个缓冲区std::buffer_handle的映射。
我获取在.wav文件中发送的字符串的buffer_handle映射,buffer_handle映射返回一个有效的句柄。然后我做同样的事情,我使用返回的buffer_handle值来获取source_id。
在set_attenuation函数中,我非常确定设置了正确的变量。但是当我离得很近很远的时候,声音只会以1的正常增益播放。所以我所做的就是我手动地做了这个方程式,这是可行的,但我怀疑这是正确的方法。
通过使用从收听者到将要播放音频的地方的距离公式来计算距离变量。
RefDistance变量,我相信是面积有多宽的半径,所以你可以用距离来计算它,以确定正确的增益/衰减。
总而言之,我是不是做错了什么?OpenAL是否在内部计算公式,然后对其进行适当的更新?因为在我手动执行这个等式之前,OpenAL没有做任何事情。
void cacctus_audio_manager::play(const ALuint& source, const ALuint& buffer,bool
loop,std::ostringstream& _debug)
{
set_attenuation(source);
if (loop)
{
alSourcei(source, AL_LOOPING, AL_TRUE);
}
else
{
alSourcei(source, AL_LOOPING, AL_FALSE);
}
alSourceQueueBuffers(source, 1, &buffer_id);
alSourcePlay(source);
}
#define MAX_GAIN 1.0f
#define MIN_GAIN 0.00f
#define REFERENCE_DISTANCE 10.0f
#define MAX_DISTANCE 125.0f
#define MIN_DISTANCE 0.0f
#define ROLL_OFF_FACTOR 1.0f;
set_attenuation(const ALuint& source)
{
alDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED);
alSourcef(source, AL_ROLLOFF_FACTOR, 1);
alSourcef(source, AL_REFERENCE_DISTANCE,REFERENCE_DISTANCE);
alSourcef(source, AL_MAX_DISTANCE,MAX_DISTANCE);
alSourcef(source, AL_MAX_GAIN, MAX_GAIN);
alSourcef(source, AL_MIN_GAIN, MIN_GAIN);
ALfloat mRefDist = REFERENCE_DISTANCE;
ALfloat mVolume = 0;
ALfloat mRolloffvalue = ROLL_OFF_FACTOR;
alGetSourcef(source,AL_GAIN,&mVolume);
_distance = std::max(_distance,mRefDist);
mVolume = std::pow((_distance / mRefDist),(-mRolloffvalue));
alSourcef(source, AL_GAIN,mVolume);
}发布于 2020-08-27 10:59:11
你确定你的缓冲区包含单声道格式的声音吗?因为如果没有:根据OpenAL文档https://openal.org/documentation/OpenAL_Programmers_Guide.pdf if源连接到带有立体声的缓冲区,此源不再受距离计算的影响。引述自第21页的文档:
8位PCM数据被表示为0到255范围内的无符号值,128是音频输出电平0。16位PCM数据被表示为-32768到32767范围内的带符号值,0是音频输出电平0。立体声数据以交错格式表示,首先是左声道。包含多个通道数据的缓冲区将在没有3D空间化的情况下播放。
因此,在进一步研究问题之前,首先确保您的缓冲区配置了AL_FORMAT_MONO8或AL_FORMAT_MONO16格式。
https://stackoverflow.com/questions/55160298
复制相似问题