开放式AldistanceModel增益/衰减
OpenAL alDistanceModel Gain/Attenuation
你好,我正在开放一个项目。我试图让AldistanceModel上班,但似乎行不通。我看了一个开放的曼努埃尔(Manuel),但我仍然感到困惑。
我有一个source_id的地图:std :: map source_id;它包含实际的缓冲键并存储源ID。
我也有一个缓冲区std :: buffer_handle的地图。
我抓住buffer_handle映射在.wav文件中发送的字符串,而buffer_handle地图返回有效的句柄。然后我做同样的事情,我使用返回的buffer_handle值来获取source_id。
在set_attenuation函数中,我很确定我已经设置了正确的变量。但是,当我接近时,声音的正常增益为1。所以我所做的是手动执行了方程式,但我怀疑这是正确的方法。
距离变量是通过使用从侦听器到播放音频的距离公式来计算的。
避免变量,我认为是该区域宽度的半径,因此您可以通过距离进行计算以确定正确的增益/衰减。
因此,将这一切都放在一起,我做错了吗?开放式内部是否进行方程式,然后对其进行适当的更新?因为在我手动执行此方程之前,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);
}
您是否确定缓冲区包含单声道格式的声音?因为如果没有:根据开放文档https://openal.org/documentation/openal_programmers_guide.pdf如果源用立体声声音连接到缓冲区,则此源不再受距离计算的影响。第21页的文档引用:
8位PCM数据表示为在范围0至范围内的无符号值255,128是零的音频输出水平。16位PCM数据是以范围内的签名值表示-32768至32767,0是一个音频输出水平为零。立体声数据以交错表示格式,首先左通道。缓冲区包含多个通道数据将在没有3D空间化的情况下播放。
因此,首先确保您的缓冲区已配置为Al_format_mono8或al_format_mono16格式,然后再进行进一步研究问题。
- 为什么这些函数不衰减到函数指针?
- 使用衰减与完美转发
- 在完美转发中需要衰减
- 为什么多维数组中的空字符串文本衰减为空指针?
- 衰减到基类
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 数组变量衰减为指针
- 从语言设计层面来看,当编译时无法推断条件时,为什么"if constexpr"不衰减到"trival if"
- 擦除删除成语的性能增益从何而来
- 如何衰减所有可变参数模板参数?
- 如果我只有指向第一个数组元素的指针,考虑到数组衰减,是否可以找到数组的长度?
- 有没有办法在不使用 set_buff() 的情况下从文件中读取并填充消息增益
- 单声道C#/C 互动,优化矩阵乘法 - 开销引起的最小增益
- 在分配给指针到固定数组期间没有指针衰减
- 如果一个函数通过引用返回一个数组,它是指针的衰减吗?
- 是否可以实现由数组组成的线程安全圆形增益?
- 如何在 constexpr 函数中强制编译错误,而不是让它衰减到非 constexpr 上下文中?
- 为什么我的衰减不适用于这个基于点产品的聚光灯?
- 开放式AldistanceModel增益/衰减
- 混淆从"array of int[]"到"pointer to int"的显式衰减?