Мы, как известно, живем в трехмерном мире (те кто знаком с теорией относительности живут в четырехмерном :)), поэтому сочетание 3D ассоциируется с чем-то реалистичным. В этой статье мы поговорим о технологиях 3D-звука. Конечно, у большинства пользователей приставка 3D ассоциируется с графикой и это неудивительно, ведь аппаратные ускорители трехмерной графики уже давно стали привычными на персональных компьютерах, а звуковые карты с 3D-акселерацией появились намного позже. Однако именно массовое распространение 3D-графики (особенно в играх) и стало основным толчком для развития 3D-звука.
Но прежде чем говорить о 3D-звуке, попытаемся разобраться, что же это такое. Ответ на этот вопрос на самом деле далеко не однозначен. Ведь название "3D-звук" зачастую используется для обозначения совершенно разных понятий, начиная от расширенного стерео и заканчивая surround sound. В этой статье под трехмерным звуком мы будем подразумевать позиционируемый звук, т.е. звук, для которого можно определить местоположение источника в трехмерном пространстве (проще говоря, это когда играя в Quake3 или Unreal Tournament вы можете с закрытыми глазами определить, откуда доносятся выстрелы). Безусловно, одного позиционирования не достаточно для создания реалистичного звукового сопровождения, однако без него говорить о "трехмерности" звука вряд ли имеет смысл. Дело в том, что заветные 3D появились в названиях и спецификациях звуковых карт за долго до появления настоящих акселераторов трехмерного звука. Тут можно провести аналогию с видеокартами (таких аналогий в этой статье будет немало) -- вряд ли сегодня кому-то прейдет в голову назвать 3D-акселератором какой-нибудь S3 Trio 3D только из-за последних двух символов в названии. Поэтому сделаем небольшой экскурс в историю.
Первые звуковые карты с гордым клеймом 3D появились еще во времена господства шины ISA. Однако вся "трехмерность" звука у них заключалась в добавлении эффектов вроде реверберации, хоруса или расширения стереобазы. Вообще говоря, первые разработки в области позиционирования звука велись уже тогда, однако они не получили большого распространения ввиду относительной слабости процессоров (как звуковых так и центральных) и тормознутости шины ISA. Революция в трехмерном звуке произошла в 1997 году с появлением технологии A3D. Малоизвестная (тогда!) фирма Aureal, которая занималась разработкой звуковых решений для симуляторов виртуальной реальности NASA, выпустила чип Vortex AU8820, аппаратно реализующий эту технологию. Фактически звуковой процессор Aureal Vortex сделал для трехмерного звука то же, что и графический процессор 3dfx Voodoo для трехмерной графики. Кстати, судьба обоих чипов связана с фирмой Diamond Multimedia и торговой маркой Diamond Monster. Именно карты Diamond Multimedia основанные на этих чипах были в числе пионеров и завоевали особую популярность среди игроков. Долгое время A3D оставался в гордом одиночестве (показателен тот факт, что поддержка аппаратной акселерации 3D-звука была введена только DirectX 6.0). Однако другие производители звуковых карт и чипсетов не желали мирится с таким положением дел. Creative сделала ставку на микрософтовский DirectSound3D и разработала для него расширение EAX. Yamaha и ESS лицензировали разработки британской фирмы Sensaura. Несколько фирм применяют в своих продуктах технологию Q3D от QSound. Именно эти технологии мы и обсудим в данной статье. Но прежде хотелось бы сказать несколько общих слов о принципах 3D-звука.
Для получения трехмерного звука используются законы психоакустики (науки об особенностях восприятия звуковых волн человеком). Не секрет, что у большинства людей два уха, причем расположены они как правило симметрично :). Поэтому человек очень хорошо различает направления на источники звука "слева"-"справа". А вот различать направления "спереди"-"сзади" или "сверху"-"снизу" без дополнительной информации довольно-таки сложно. Само собой разумеется, что один и тот же источник звука сзади будет звучать не так, как спереди. Однако если источник, расположенный спереди заставить звучать "не так", то вполне может создаться впечатление что он расположен сзади. Тоже самое относится и к направлениям "сверху"-"снизу". Конечно, на самом деле все не так просто -- для достижения трехмерности звука используются сложные математические модели и алгоритмы. К сожалению рамки статьи не позволяют подробно останавливаться на описании этих алгоритмов, я лишь перечислю некоторые из них. Для того, чтобы получить трехмерный звук в наушниках используются алгоритмы HRTF (Head-Related Transfer Function). Для двух колонок в большинстве API применяются алгоритмы HRTF with TCC (Transaural Crosstalk-Cancellation). Для четырех колонок разные API применяют разные схемы (обычно для передней пары звук считается по тем же алгоритмам, что и для двух колонок, а задняя пара используется для панорамирования). Сложнее всего реализовывать трехмерный звук для двух колонок. Дело в том, что у каждого пользователя колонки расположены на разном расстоянии друг от друга, да и сами пользователи расположены :-) на разном расстоянии от колонок. Но это еще полбеды -- эти параметры можно учесть в настройках драйверов или приложений (однако в подавляющем большинстве случаев такие настройки отсутствуют). Основная проблема состоит в том, что зона трехмерности для двух колонок очень мала и при выходе слушателя из этой зоны позиционирование звука искажается. Использование четырех колонок несколько улучшает ситуацию. Естественно, улучшается распознавание направлений "спереди"-"сзади", а в некоторых случаях (например при использовании технологии Sensaura MultiDrive) еще и существенно расширяется зона трехмерности звука. Однако, вопреки распространенному мнению, наилучшее позиционирование звука получается отнюдь не на четырех колонках, а в наушниках. Что в принципе неудивительно, ведь проблема зоны трехмерности в этом случае отсутствует. Преимущества наушников по сравнению с колонками особенно проявляются при распознавании направлений "сверху"-"снизу". Более подробно о теории трехмерного звука можно почитать на http://ixbt.stack.net/multimedia/3dsound-tech.html, а мы перейдем непосредственно к описанию современных API.
Итак, начнем с самого распространенного API, который входит в состав DirectX и поддерживается практически всеми звуковыми 3D-картами.
DirectSound3D.
Звуковая картина в DirectSound3D создается довольно-таки просто. Каждому источнику звука в игре присваивается набор таких характеристик: исходная громкость, радиусы ближней и дальней зоны. Значение этих параметров проще всего пояснить на примере. Пусть исходная громкость объекта равна 100, радиус ближней зоны -- 5 метров, радиус дальней зоны -- 50 метров. Тогда, если расстояние между источником и слушателем составляет от 0 до 5 метров, громкость будет оставаться равной 100. На расстояниях от 5 до 50 метров громкость будет уменьшаться пропорционально 1/Rn (обычно n=1). И, наконец, после 50 метров громкость перестанет уменьшаться и будет оставаться постоянной (естественно, можно задать такой закон уменьшения громкости, что на 50 метрах звук практически затихнет или же просто сделать радиус дальней зоны бесконечным). Предусмотрена также возможность создания направленного звука. Для этого источнику звука сопоставляется условный конус, в пределах которого громкость будет максимальна, а за пределами постепенно затухать.
На основе информации о координатах и скоростях источников звука относительно слушателя формируется трехмерный звуковая картина. Координаты нужны для позиционирования и определения громкости объектов, а скорости используются для учета эффекта Доплера. Теперь осталось только с помощью специальных алгоритмов "отреэндерить" получившуюся звуковую картину с учетом того, что используется для воспроизведения звука -- наушники, две или четыре колонки. Если же звуковая карта не поддерживает аппаратную акселерацию трехмерного звука, DirectSound3D может произвести реэндеринг при помощи встроенного программного движка -- DirectSound3D HEL (Hardware Emulation Level), однако HEL обеспечивает только минимальны набор функций (никакой трехмерности практически не ощущается) и при этом потребляет огромное количество ресурсов CPU.
Как видите, DirectSound3D сам по себе умеет не так уж и много, однако этот интерфейс поддерживает расширения, которые могут дополнять его возможности ("голый" DirectSound3D в современных играх практически не используется). Наиболее популярным расширением DirectSound3D стал интерфейс EAX от Creative. Правда скоро EAX перестанет быть расширением и будет включен в состав DirectX 8.0. Но об EAX мы поговорим чуть позже, а пока рассмотрим самую первую и самую популярную (пока !?) технологию создания трехмерного звука.
A3D
A3D стал первым API, поддерживающим аппаратную акселерацию трехмерного звука. Можно сказать, что A3D сыграл такую же роль в становлении трехмерного звука, как Glide в становлении трехмерной графики.
A3D 1.х по своим возможностям примерно соответствует DirectSound3D. Однако у него есть несколько интересных особенностей, например улучшенная дистанционная модель, которая позволяет более реалистично описывать распространение звука в различных средах (чаще всего -- в воде или густом тумане). Но наиболее интересной, на мой взгляд, особенностью A3D 1.х является Менеджер Ресурсов, который управляет 3D-потоками, воспроизводимыми в игре. И если количество потоков очень большое то Менеджер Ресурсов решает, какие потоки наиболее важны для слушателя в данной ситуации и именно для них использует аппаратные возможности A3D звуковой карты. Остальные потоки могут воспроизводиться в режиме обыкновенного стерео или не воспроизводиться вовсе (если число аудио-потоков уж очень большое).
A3D 1.х является "родным" API для карт на чипсетах Aureal Vortex 1 (AU8820) и Vortex Advatage (AU8810). Перечислю наиболее популярные карты на этих чипсетах: Diamond Sonic Impact S90, Turtle Beach Montego, Aztech PCI-338-A3D, Genius SoundMaker 64 и, конечно же, одноименные чипсетам OEM карты Aureal. Естественно, стандарт A3D 1.х поддерживают и карты на Vortex 2, но о них -- чуть позже. Поддержка A3D 1.х на уровне драйверов реализована во многих картах для которых "родными" API являются Sensaura и Q3D. Драйвера этих карт просто преобразовывают команды A3D в команды родных API. Как и в случае с трехмерной графикой, качество реализации таких "врапперов" бывает разным и зависит от конкретного производителя. Стоит упомянуть драйвер A2D от Aureal который реализует поддержку A3D через DirectSound3D. Названием A2D Aureal подчеркивает неполноценность этого драйвера. Действительно A2D реализует далеко не все функции A3D 1.х (не говоря уже о более поздних версиях A3D), однако пусть буквосочетание 2D не вводит вас в заблуждение -- с помощью этого драйвера можно получить неплохой трехмерный звук в играх с поддержкой A3D. Особенно A2D пригодится для владельцев карт в которых DirectSound3D -- единственный API, применяющейся для позиционирования звука (например SB Live!).