Здравствуйте, я делаю проект с 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);
}