Здравейте, правя проект с OpenAL. Опитвах се да накарам alDistanceModel да работи, но изглежда не работи. Разгледах OpenAL Manuel, който навлиза в дълбочина за това, но все още съм объркан.
Имам карта на source_id: std::map source_id; той съдържа действителния буферен ключ и съхранява идентификатора на източника.
Имам и карта на буферите std::buffer_handle.
Хващам картата buffer_handle, изпратена в .wav файл за низ и картата 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);
}