Библиотека

Обзор DirectX9

Антон Звягинцев

   Источник: http://www.gamedev.ru/articles/?id=10103

От себя.

В этой статье я постараюсь рассмотреть большинство интересных нововведений (насколько мне это позволит мой воспалённый житейскими неурядицами и радостями разум) DirectX 9, по возможности разбавляя сухие выдержки из прилагаемой с СДК документации своими собственными наблюдениями. Эта статья будет также полезна и для новичков, так как я постараюсь затронуть некоторые общие аспекты, без которых приведённое описание для человека впервые начавшего заниматься компьютерной графикой и DirectX в частности, будет неполным. Тем не менее, это всего лишь первый беглый взгляд, обзор возможностей... и обзор субъективный.

Если ранее можно было сомневаться на счёт будущего DirectX, когда скажем в версии DX 3.0, DirectInput представлял из себя враппер над Win32 функциями, то сейчас, когда с каждой новой версией объём возможностей расширяется, а написание программного обеспечения упрощается, ни у кого уже не возникает сомнения, ставить ли новую версию DirectX библиотек или нет. Тем более, вряд ли у кого-то из разработчиков, если конечно они не ориентируются на конкретную версию с определенной целью, возникнет сомнение на счёт перехода на новую версию SDK. Впрочем, ещё раз подчеркну, что это лишь моё субъективное мнение :)

Это страшное слово - DirectX.

Знатоки могут пропустить следующие несколько абзацев. Что же такое DirectX? Это набор мультимедийных драйверов, которые зачастую в обход стандартных сервисов ОС позволяют напрямую обращаться к конечному оборудованию используя по все его аппаратные возможности. Более того, некоторые Win32 сервисы используют DirectX ядро для своих собственных нужд. Набор мультимедийных АПИ и  драйверов высокого уровня -  пожалуй, это будет наилучшим определением. Высокого, потому что в цепочке между самим DirectX и конечным оборудованием стоят ещё и драйвера производителя конкретного оборудования. Всегда следует помнить обобщенную схему взаимодействия конечного приложения с аппаратным обеспечением: Приложение - DirectX - Драйвера - Оборудование.

DirectX состоит из нескольких компонент. Каждая из компонент обеспечивает функциональность в определенном направлении, как-то:

· DirectX Graphics - 2D/3D графика.
· DirectShow - Потоковое видео.
· DirectInput - Различные устройствами ввода.
· DirectSound и DirectMusic - Звук.
· DirectPlay - Стандартный интерфейс для создания сетевого взаимодействия на базе различных сетевых протоколов и провайдеров  (Под провайдером, конечно, понимается не та фирма у которой ты дорогой читатель приобретаешь доступ в интернет :).

Примечание: Среди выше перечисленных компонент не упомянут DirectSetup - небольшой API для работы с установкой DX на конечном компьютере.

Большая часть функциональности девятой и предыдущих версий DX строится на основе COM объектов, доступ к которым мы получаем через интерфейсы. Если коротко - COM модель представляет собой более жесткое определение объектно-ориентированной модели. С COM объектами мы работаем только через интерфейсы. Каждая компонента DirectX будь то, к примеру, DirectInput или DirectSound содержит некоторое количество интерфейсов с использованием функций которых мы получаем доступ к возможностям объекта. Грубо говоря, интерфейс представляет собой класс, содержащий в себе указатели на функции, с помощью которых и происходит взаимодействие с объектом.

На заметку:

DirectX ни первая попытка MS сделать Windows игровой платформой! Первой попыткой исправить положение с созданием игр под новоявленную линейку операционных систем Windows был WinG API. Занимался он исключительно растровой графикой и особого распространения не получил, хотя под него было написано некоторое количество игр (например ремейк под Windows первой Цивилизации). Попробуем выстроить общую хронологию... Приблизительно в 1995 году после выхода ОС Windows 95 Microsoft выпускает Game SDK - первая версия DirectX. Основной упор - растровая двумерная графика. Кроме этого работа со звуком, сетью и устройствами ввода. 1996 год вместе с выходом Microsoft Developers Kit ознаменовывается появлением уже DirectX 2. Первые шаги в составе DirectX делает Direct3D. Всё тот же 96 - DirectX 3 можно назвать самым универсальным из всех имеющихся DirectX'ов на планете :) Его функциональность доступна даже на NT 4.0. Пятая версия (ну не любят они цифру 4 :) выходит в 98 году и радует обновленной DirectInput компонентой которая по сути стала самостоятельной, а не враппером над Win32 функциями. Всё тот же 98 - шестая версия Direct3D (DirectX 6) уже поддерживает мультитекстурирование,stencil и w-buffer'ы. Конец 1999 года - по-своему революционная версия DirectX 7. Ура - золотая эра в компьютерной графике, о которой так долго говорили Кармаки, началась. T&L (аппаратные трансформации и освещение) и видео карты. Поддержка T&L в DirectX 7. Размышления над фиксированным конвейером. Конец 2000 года - на сцену победно выступает DirectX 8 - программируемый конвейер, шейдеры, как средство программирования (заветам Pixar мы верны!) очередной шаг от компьютерной графики к реальности. DirectDraw умер... Да здравствует DirectX Graphics!

Почему именно DirectX?

Собственно, в своем старом обзоре на примере DirectX 7 я привел доводы в пользу использования DirectX или хотя бы части его компонент. Стремление разработчиков абстрагироваться от конечного конкретного оборудования понятно - никто сейчас не хотел бы изучать спецификации работы с каждой конкретной видео или звуковой картой. Чёткое разделение области системного и прикладного программирования (в первом случае я говорю о разработчиках драйверов и соответствующих DDK (Driver Development Kit) с которым мы прикладные программисты не сталкиваемся вообще, во втором это наш DirectX SDK), жестко определенный для каждой новой версии стандарт, гарантированность работы с предыдущими версиями (по стандарту, будучи однажды определенным, COM интерфейс не может меняться - оно и понятно почему) это и есть сущность DirectX. Альтернатив DirectX не существует - существуют отдельные компоненты, но лишь OpenGL можно назвать полностью самостоятельно заменой Direct3D. Я не буду сравнивать и спорить что лучше - у меня иная цель... Кто-то может сказать - "А вот если взять стремительно развивающийся OpenAL? Чем не альтернатива DirectSound?" Проблема в том, что OpenAL под Windows не что иное, как надстройка над тем же DirectSound - просто более универсальная и удобная в использовании, а отнюдь не полноценный собственный API. Здесь решать только вам - использовать библиотеки врапперы или использовать напрямую DirectX. Прежде чем использовать тот или иной API внимательно изучите его спецификации, посмотрите импорты в DLL-ках, а самое главное прикиньте производительность  - возможно, это совсем не то, что вам действительно нужно.

"Вот, наконец, настал тот час..."

Процесс распаковки закончен, и я имею удовольствие лицезреть новую версию DirectX (далее просто DX) SDK. Отмечу - DirectX рантайм не существует для Windows 95 и NT. Для NT DirectX "умер" ещё на цифре три, последней официально поддерживаемой версии для этой операционной системы (необходимо установить как минимум третий сервис пак). Отказ от поддержки '95 назревал достаточно давно и вот, наконец-то, это свершилось. Достаточно типичная структура каталогов. Слегка пополневший набор Мастеров-Визардов (App Wizard) и утилит в /bin/Util- ничего примечательного. Главный мастер для создания DX приложения претерпел минимальные изменения - в нём добавили возможность работы с меню и реестром. Первое что бросается в глаза - наличие примеров под C#. Теперь каждый, при желании конечно, без особых проблем с реализацией и потери времени для написания вспомогательных библиотек врапперов или же создания своего собственного скриптового языка может повторить опыт разработчиков Ил-2 или Blade of Darkness (первые использовали Sun Java Runtime, вторые - Python) и реализовать всю логику игры на основе более высокоуровневого языка.

Что день грядущий нам готовит.

Прежде всего, как утверждает документация, основная причина выхода DX 9 на свет это именно DirectX Graphics. Впрочем, то же самое было сказано и в DX 8.1 SDK. Для тех, кто умудрился пропустить несколько версий DX'а с прискорбием сообщаю, что DirectDraw почил нас своим присутствием и отошел в мир иной. Будучи поглощенным Direct3D, DirectDraw с версии DX 8.0 образовал DirectX Graphics. В DX 9 он вернулся, но скорее в виде истлевшей тушки, о чём немного позже.

Попробуем рассмотреть все компоненты DX начиная с наименее "пострадавших" от изменений, при этом кратко для новичков обсудим для чего каждая из компонент предназначена:

· DirectInput основными изменения стала работа над улучшением совместимости, изменений в самом API нет.
· DirectMusic увеличение производительности; несколько новых Визардов  (App Wizards) для Developer Studio.
· DirectSound частота звуковых буферов поднята до 200 КГц, проведена работа над увеличением производительности, некоторое количество незначительных изменений.
· DirectPlay парочка новых провайдеров; а также поддержка Windows Powered Pocket PC 2002, куча мелких изменений и усовершенствований в API.
· DirectShow новые примеры; новые фильтры; расширенная поддержка фильтров для различных версий ОС Windows.
· DirectXGraphics поддержка пиксельных и вершинных шейдеров реализована теперь через COM интерфейсы; изменения при работе с вершинными шейдерами; поддержка карт смещения (displacement maps); антиалиазинг линий; версия 2.0 и 3.0 пиксельных и вершинных шейдеров; 2D возможности; HLSL (High-Level Shader Language); двусторонние операции со стенсил буфером (Two-Sided Stencil Ops - полезно при рендеринге теней с использованием теневых объёмов); адаптивная тесселяция.

На заметку:

Возвращаясь к акценту Microsoft на DX Graphics, начинаешь склоняться к мысли, что это действительно так. Если проанализировать в данный момент положение вещей на игровых фронтах, то можно отметить следующую тенденцию - для работы с графикой и устройствами ввода разработчики обычно используют DX интерфейсы или OpenGL напрямую, без использования дополнительных библиотек (или при их минимальном вмешательстве в критические по производительности части кода), в то время как при работе с сетью, звуком и видео, в первом случае большинство использует функциональность самой ОС, а во втором и третьем библиотеки третьих фирм. Почему так? DirectPlay по сути представляет собой универсальную обёртку (пусть и достаточно тонкую) над сервисами операционной системы. Основное  его достижение, это наверное стандартизация работы. Кроме того - архитектурно вам эта обёртка может просто не подойти или быть избыточной. Во втором случае - развитые вспомогательные библиотеки, по сути, сами используют DX для своих нужд, однако, кроме того, сочетают в себе дополнительные вспомогательные функции будь то аудио компрессия, 3D эффекты, или же, к примеру, расширенная функциональность - не поддерживается эта версия DirectSound на данном компьютере, попробую другую; не сработает она - воспользуюсь вызовами ядра... С видео приблизительно та же ситуация. В результате чего в сфере звука и видео уже начинают определяться свои лидеры - работа с аудио это конечно  Miles Sound System и бесплатные FMOD (для некоммерческого использования), OGG или OpenAL. Вспоминая о видео нельзя не упомянуть SMK/BNK форматы и библиотеки для работы с ними.

Как видите, основное число изменений действительно коснулось именно работы с графикой. Кратко рассмотрим наиболее интересные аспекты. С этой версии разработчикам доступен HLSL (High-Level Shader Language) - высокоуровневый язык работы с шейдерами. В качестве его альтернативы можно вспомнить соответствующее предложение от NVidia, а именно Cg. Сложно предсказать дальнейшее развитие обоих языковых платформ. Скорее всего, оба языка будут существовать и продолжать развиваться, как и в случае D3D vs OpenGL. Хотя в данном случае за спиной Cg стоит только NVidia. Программно реализована поддержка второй и третьей версии (!) пиксельных и вершинных шейдеров. Со второй версии вершинных шейдеров, поддержка которых представлена в DX 9, появился контроль над исполнением хода шейдера - условия if/else/endif, циклы loop/endloop и подпрограммы. Взаимодействие с контекстом GDI, а также IDirect3DDevice9::StretchRect() на пару с IDirect3DDevice9::ColorFill(), смахивает на попытку поднятия из могилы недавно положенного туда DirectDraw. Воистину неисповедимы пути Майкрософта :) Впрочем, заверения о полной интеграции этих возможностей в 3D конвейер и освобождение программиста от написания небольшой обёртки для взаимодействия с 2D через 3D несомненно похвально. Формат пикселя с 10 битным каналом на каждую цветовую компоненту и 2 битами на альфа канал может показаться временным выходом из ситуации для жаждущих 64-битного представления цвета, тем не менее, аппаратная поддержка, а также в некоторых случаях совместимость оставляют желать лучшего. Карты смещения (Displacement Maps) - модификация базовой геометрии полигона вдоль нормали к нему. Карта смещения, по сути, представляет собой определенного вида текстуру. (Кто сталкивался с картами высот при рендеринге ландшафтов - это почти оно :)) В данном случае это та же текстура, с которой работает вершинный пайплайн. На данный момент небольшое количество видеокарт могут похвастаться аппаратной поддержкой этой фишки, так что в ближайшее время польза от неё сомнительна, однако как и водится достаточно соблазнительна."Многоголовость" (MultiHead ;)) последней версии позволяет работать с адаптерами обладающими несколькими DAC'ами и позволяющими подключать несколько мониторов. Не будем обсуждать ценовой барьер конечного пользователя ;). Сам по себе панорамный обзор на несколько мониторов может быть ещё одним робким шажком в сторону глубокого погружения пользователя в игру. D3DX, если сравнивать его с тем же GLU в OpenGL, однозначно выигрывает по возможностям и функциональности. Я предпочитаю OpenGL и очень завидую этому :) Наверняка в интернете найдётся подобная библиотека для OpenGL, однако факт остаётся фактом - всегда приятно осознавать, что столько возможностей находятся в стандартной поставке и полностью совместимы с самим DirectX. Остаётся желать только одного - чтобы при всей своей функциональности она не превратилась в монстроидальную поделку, половина функций которой останется не востребованными.

В целом охарактеризовать выход DX 9 можно одним простым и ёмким словом - успех :) Акцент на графику как наиболее стремительно развивающуюся область и оптимизация в других компонентах как мне кажется, является правильным направлением на данный момент. Ждём DirectX 10 :)