OpenAL alDistanceModel усилване/затихване

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

person Blake186    schedule 14.03.2019    source източник
comment
Просто гадая; Може би AL_LINEAR_DISTANCE_CLAMPED е това, което искате?   -  person Neil Gatenby    schedule 14.03.2019
comment
Опитах всички настройки за alDistanceModel. Все още получавам само печалба от 1. Без значение на каква позиция съм. ето защо в крайна сметка направих свое собствено уравнение, което в крайна сметка се оказа действителното уравнение на степента, което OpenAL използва.   -  person Blake186    schedule 14.03.2019
comment
може би съм тъп и правя нещо нередно. може би просто не разбирам как OpenAL използва правилно затихването.   -  person Blake186    schedule 14.03.2019


Отговори (1)


Сигурни ли сте, че вашите буфери съдържат звук в MONO формат? Защото ако не: според документацията на OpenAL 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, преди да предприемете по-нататъшно проучване на проблем.

person Dmitry Bushev    schedule 27.08.2020