DirectX - совокупность технологий, разработанных корпорацией Microsoft с целью превратить Windows в оптимальную платформу для мультимедийных приложений и компьютерных игр с полноцветной графикой, видео, трехмерной анимацией и объемным звуком.
До появления DirectX практически все игры для компьютеров PC реализовывались на платформе MS-DOS. Каждую программу разработчикам приходилось комплектовать множеством видео- и аудиодрайверов (с тем, чтобы охватить как можно больше установленных у пользователей аппаратных компонентов) и при этом применять расширители DOS для преодоления барьера в 640 Кбайт. Среда Windows, упростившая взаимодействие пользователей с ПК благодаря удобному графическому интерфейсу, не облегчила жизнь программистов: в Windows графические программы функционировали слишком медленно. Как ни парадоксально это звучит, Windows, являясь графической средой, не была приспособлена для выполнения быстрых графических операций.
Пытаясь поправить ситуацию, Microsoft разработала для создателей компьютерных игр и графических приложений технологию WinG, которая обеспечивала более быстрое выполнение графических операций, чем интерфейс GDI (Graphics Device Interface) Windows. В то же время корпорация не ограничивалась только решением проблем производительности. Разработчики стремились к тому, чтобы программисты могли создавать игровые и прикладные программы, не задумываясь о том, какие аппаратные компоненты имеются у конкретного пользователя. Сама операционная среда должна была содержать все необходимые драйверы и взять на себя взаимодействие программы с аппаратурой ПК, такой как аудио, видеоплаты и принтеры.
Между тем, даже после выхода в свет ОС Windows 95, платформа Microsoft по-прежнему не соответствовала заявленным обещаниям. Только сегодня, с появлением усовершенствованных технологий, получивших обобщенное название DirectX, положение начинает меняться.
Технология DirectX позволяет программистам создавать в Windows приложения со встроенным доступом к аппаратным средствам. При этом им не нужно знать специфику аппаратной конфигурации определенного компьютера - явного программирования конкретной платы не требуется. Фактически DirectX выполняет роль промежуточного звена между программой и драйвером, преобразуя обобщенные команды в команды, специфические для того или иного устройства.
Если первоначально DirectX была ориентирована на превращение Windows 95 в полноценную платформу для компьютерных игр, всегда стимулировавших развитие аппаратных средств ПК, то по мере проникновения в массовые приложения технологий мультимедиа комплект программных интерфейсов DirectX становится важной частью операционной системы.
DirectX включает в себя следующие API:
- DirectD
raw - обеспечивает доступ к аппаратным средствам, отвечающим за изображение. Предлагается возможность работать с двумерной графикой и напрямую управлять видеопамятью, оверлеями и сменой видеостраниц.- DirectSound - как видно из названия, этот компонент обеспечивает аппаратно независимый интерфейс воспроизведения звука. DirectSound позволяет приложениям полностью использовать возможности аппаратных компонентов, обеспечивающих работу со звуком, например, микширование без временных задержек.
- Directlnput -
обеспечивает аппаратно независимый ввод данных в систему в режиме реального времени. События, обрабатываемые Directlnput, формируются клавиатурой, мышкой и джойстиком.- DirectPlay - представляет собой независимый протокол для осуществления связи между компьютерами. Может применяться для многопользовательских игр, связь в которых осуществляется через Интернет, локальную сеть или прямое последовательное соединение с помощью кабеля. Интерфейс, именуемый DirectPlay Lobby, позволяет создавать онлайновые места встреч в Интернете, попадая в которые множество людей могут объединяться и совместно участвовать в играх.
- Direct3D - это подсистема создания трехмерных графических изображений. Состоит из API низкого уровня, который обеспечивает несколько базовых возможностей создания изображения, и API высокого уровня, который осуществляет комплекс операций, образующих изображение.
До появления DirectX создателям приложений мультимедиа для платформы Windows приходилось настраивать свои продукты для работы на широком спектре устройств и конфигураций. DirectX предусматривает так называемый уровень абстрагирования аппаратных средств HAL (Hardware Abstraction Layer). HAL функционирует как промежуточное звено между программным обеспечением и аппаратурой, позволяя разработчикам обращаться к тем или иным компонентам, не зная их марки, модели и других деталей. В результате они получают возможность писать лишь одну версию приложения, взаимодействующую с DirectX. Кроме того, DirectX предоставляет в распоряжение разработчиков инструментальные средства для достижения наивысшей производительности. Данный базовый слой определяет возможности аппаратуры компьютера и устанавливает соответствующие параметры приложения. Он обеспечивает также выполнение мультимедиа-приложений, использующих функции, не поддерживаемые в системе на аппаратном уровне. Это достигается за счет уровня HEL (Hardware Emulation Layer), с помощью которого DirectX программно эмулирует функции, не реализуемые самим устройством. Если аппаратное обеспечение не
совместимо с запрашиваемым программой сервисом, уровень HEL пытается эмулировать его наилучшим возможным образом. Чаще всего эмулируются средства 3D-графики. Хотя эмуляция и не так эффективна, как аппаратная реализация, зато разработчику не приходится писать несколько версий одной и той же программы.Интерфейс DirectDraw предоставляет разработчикам средства более прямого доступа к аппаратным компонентам, чем это возможно в системе Windows 95 с ее виртуальными драйверами устройств, а это в свою очередь приводит к существенному ускорению графических операций. С появлением DirectDraw разработчики стали наконец рассматривать Windows 95 как серьезную платформу для компьютерных игр и других мультимедийных приложений. Многие средства DirectDraw прямо или косвенно применяются в Direct3D.
Именно DirectDraw - единственный компонент DirectX, взаимодействующий с HAL. Использующие DirectDraw приложения взаимодействуют только с DirectDraw и не могут обращаться непосредственно к HAL. Этот интерфейс повышает производительность приложений за счет поддержки функций 2D-графики, быстрого выполнения" операций с растровыми изображениями, пересылки битовых блоков (blitting), прозрачного наложения объектов и управления несколькими слоями анимации.
По существу, DirectDraw представляет собой диспетчер видеопамяти. Он позволяет программисту хранить текстуры и манипулировать ими непосредственно в видеопамяти, используя преимущества пересылки блоков, реализованной на аппаратном уровне. Такая пересылка из одной области видеопамяти в другую осуществляется намного быстрее, чем передача из системной памяти в видеопамять (особенно в случае использования 64-разрядных видеоплат). К тому же данные операции выполняются независимо от ЦП. Тем самым процессор освобождается для иной работы. Кроме того, DirectDraw поддерживает другие механизмы аппаратного ускорения, реализуемые видеоплатой, такие как спрайты и Z-буферизация.
DirectDraw реализует интерфейс с видеопамятью, используя четыре объекта: DirectDraw. DirectDrawSurface. DirectDrawPalette и DirectDrawClipper. Объект DirectDraw, плата адаптера дисплея, является основным. Объект DirectDrawSurface представляет видеопамять, куда помещаются отображаемые данные. Обычно DirectDrawSurface используется следующим образом. В памяти создаются два
буфера (для смены изображений). Отображаемые фрагменты записываются в первый буфер (а не выводятся на экране непосредственно), а те, что должны отображаться следующими, во второй. Затем происходит переключение буферов - второй буфер становится текущим, и изображение обновляется. Direct3D позволяет выполнять приложение в режиме полного экрана или в окне, а также оперативно настраивать в программе разрешение дисплея.Объект DirectDrawPaiette допускает применение для каждого фрагмента собственной палитры из 256 цветов или использование общих палитр, а DirectDrawClipper позволяет приложениям, выполняемым в окне, работать в обход GDI, уменьшая задержки при выводе графики и предоставляя прозрачный доступ к аппаратуре графических ускорителей.
Компонент Direct3D помогает интегрировать с приложениями Windows 3D-графику. Он применяется для разработки интерактивных приложений трехмерной графики и программ реального времени. Несомненными его достоинствами являются независимость от устройств, общая модель драйверов (гарантирующая поддержку минимального набора средств и возможностей), простота включения в приложения функций трехмерной графики. Созданные с помощью Direct3D прикладные системы могут работать на разных аппаратных платформах, поскольку все средства D
irect3D реализуются "поверх" HAL. Кроме того, Direct3D предлагает разработчикам аппаратных средств спецификацию, помогающую создавать платы, изначально поддерживающие различные средства Direct3D. Одним из наиболее важных качеств Direct3D является прозрачный доступ к графическим ускорителям. Если аппаратная платформа не поддерживает какой-то функции, Direct3D реализует ее эквивалент программным путем. В процессе своего исполнения приложение может определять наличие аппаратных компонентов и использовать их возможности. Кроме того, Direct3D реализует быстрый программно выполняемый рендеринг, для чего применяется полный конвейер рендеринга 3D-графики. При наличии соответствующей аппаратной поддержки часть операций такого рода осуществляется аппаратурой компьютера.Пользователю средства Direct3D доступны через интерфейсы Retained Mode и Immediate Mode. Retained Mode базируется на Immediate Mode и некоторых средствах DirectDraw. Вместе с HAL эти интерфейсы по сути и образуют Direct3D. Direct3D Retained Mode (интерфейс отображения объектов Direct3D после их группирования) позволяет разработчикам комбинировать мультимедиа-информацию (например, графику и звук) для создания трехмерных сцен и управлять этими сценами в своих приложениях. Для корректного воспроизведения система файлов Direct3D хранит информацию, необходимую для трехмерного рендеринга, включая текстуры, порядок расположения объектов, маршрут анимации и другие детали.
Direct3D Immediate Mode (интерфейс непосредственного отображения объектов Direct3D) реализован на уровне DirectX Foundation и предоставляет разработчикам более прямой доступ к аппаратным средствам. Он обеспечивает повышенную скорость и гибкость, но в этом случае рендеринг сцены и управление ею должны осуществляться самим программистом. Кроме того, Direct3D работает совместно с HEL и реализует программную эмуляцию средств рендеринга 3d-графики, не поддерживаемых аппаратурой. Этот слой тесно интегрирован с DirectDraw HAL и драйверами GDI системы Win32, что помогает унифицировать модель драйверов для ускорения обработки трехмерной графики.
Один из наиболее важных элементов Direct3D - механизм рендеринга, отвечающий за определение сцены (как набора точек в трехмерном пространстве), различные спецификации текстур, источников света и камер. Функционально механизм рендеринга реализуется с помощью трех матриц: трансформации, освещенности и растеризации.
Модуль на основе этих матриц строит одну составную, которая и используется в вычислениях (в последних версиях Direct3D для ускорения вычислений применяется технология ММХ).
Модуль просчета освещенности использует для работы данные, полученные от модуля трансформации. Он учитывает положение источников света, уровень рассеянной освещенности и оптические свойства материалов. При этом допускается реализация двух моделей: монохромной и RGB. В монохромной модели для каждого источника света учитывается только монохромная интенсивность, и затем для данного участка вычисляется одно значение полутени. Цветовые компоненты светового потока игнорируются. Модель RGB помогает сделать сцену более реалистичной за счет учета цветовых характеристик источника света и материала освещаемого объекта.
Модуль растеризации отвечает непосредственно за отображение полученных данных. Он просматривает список вершин и генерирует их трансформированные образы для окончательной визуализации с учетом параметров отсечения и наличия скрытых поверхностей.
Таким образом, механизм рендеринга сводится к следующему: точки трехмерной модели преобразуются модулем трансформации в эквивалентные двухмерные данные, которые передаются модулю, вычисляющему интенсивность падающего на них света, а затем направляются модулю растеризации, определяющему прозрачность и налагающему текстуры.
Directlnput реализует поддержку в приложениях таких периферийных устройств управления, как джойстики. Он позволяет разработчикам программировать взаимодействие с этими устройствами, используя уровень HAL или HEL. В то же время Directlnput не ограничивается игровыми контроллерами и реализует интерфейс ввода данных с таких устройств, как графические планшеты.
Компонент DirectSound выполняет роль интерфейса с аппаратурой, предназначенной для воспроизведения звука. Он обеспечивает проигрывание файлов *.WAV и позволяет применять буферы разного типа (основные, вспомогательные, статические и потоковые). В основной буфер (используемый в данный момент компьютером) помещаются файлы из вспомогательных буферов (отведенных для каждого файла *.WAV). Небольшие файлы для ускорения доступа можно помещать
в статические буферы, а более длинные -циклически загружать в потоковые буферы по частям. Кроме того, DirectSound предоставляет микшер, управляющий различными параметрами воспроизведения (от громкости до эффектов объемного звучания, применяемых к вспомогательным буферам).Над базовым уровнем DirectX (DirectX Foundation) расположен мультимедийный слой DirectX Media. Если DirectX Foundation реализует функции нижнего уровня, то DirectX Media предоставляет средства высокого уровня для поддержки анимации, потоков мультимедиа (просмотр и прослушивание видео- и аудиофайлов, загружаемых из Internet), а также интерактивных функций.
DirectX Media, как и DirectX Foundation, состоит из нескольких интегрированных компонентов: DirectShow. DirectModel. Direct-Animation. DirectPlay. DirectSD Retained Mode (иногда в него включают и поддержку VRML). В частности, DirectShow и DirectPlay встроены в последние версии Microsoft Internet Explorer. С помощью набора взаимосвязанных фильтров (взаимодействующих с потоком данных через диспетчер фильтров) DirectShow выполняет функции воспроизведения потоков аудио и видео в различных форматах (MPEG, QuickTime, AVI и WAV). Этот компонент является одним из примеров реализации встраивания в операционную систему
тех средств, которые ранее предлагались в качестве интегрируемых модулей и программных дополнений, поставляемых независимыми разработчиками.Другие компоненты мультимедийного слоя обеспечивают иные функции высокого уровня, каждая из которых помогает разработчикам полностью использовать возможности аппаратных средств мультимедиа. DirectModel реализует рендеринг и взаимодействие с крупными объектами 30-графики. DirectAnimation позволяет разработчикам комбинировать звук с движением двух- и трехмерных изображений и связывать их с временными и инициируемыми пользователем событиями в целях создания сложных анимаций. Компонент DirectPlay спроектирован в основном для диалоговых игр с участием нескольких партнеров и приложений, в которых используются диалоговые коммуникации между пользователями сети. Он позволяет воспроизводить мультимедиа при работе в сети, осуществляя обмен информацией о ходе игры и сообщениями между ее участниками. Язык моделирования виртуальной реальности VRML
(Virtual Reality Modeling Language)
использует DirectX для реализации трехмерных "виртуальных миров" в Web-браузерах, что существенно увеличивает скорость их отображения.В целом мультимедийный слой DirectX помогает разработчикам решить одну из наиболее сложных задач, возникающих при создании высококачественных игровых программ для Windows и мультимедиа-приложений, - координировать различные типы мультимедийных эффектов. Это делается с помощью набора API-интерфейсов, синхронизирующих разные эффекты в рамках одного приложения. До появления
DirectX в подобной ситуации приходилось использовать API-интерфейсы разных производителей (средств видео, аудио или анимации), что затрудняло объединение элементов. Слой DirectX Media помогает разработчикам также синхронизировать воспроизведение мультимедиа, привязывая его элементы к единой шкале времени.DirectX Foundation и DirectX Media предоставляют разработчикам еще одно важное средство - библиотеку компонентов, которую можно использовать для создания компьютерных игр и мультимедиа-приложений. Такая библиотека упрощает процесс разработки, поскольку позволяет программистам применять большое число стандартных интерфейсов и элементов. Кроме того, реализуемые DirectX Media операции высокого уровня используются в следующем, компонентном слое, состоящем из приложений, построенных на основе базового и мультимедийного слоев. Такими компонентами являются, в частности, ActiveMovie, NetMeeting и NetShow, входящие в состав IE 4, Windows 98 и Windows NT 5.0.
DirectX дает возможность разрабатывать целую систему подобных компонентов, количество которых продолжает увеличиваться. Кроме того, компоненты, составляющие DirectX, предоставляют разработчикам гибкую платформу для использования самых современных технологий.В интерфейсе DirectX реализованы принципы модели COM (Component Object Model), что позволяет оформлять необходимые функции в виде компонентов или объектов. Значительное число API-интерфейсов DirectX представляет собой набор OLE-объектов. Все функции, поддерживаемые СОМ-объектом, можно использовать в качестве интерфейса при взаимодействии с этим объектом. Такой интерфейс представляет собой просто группу родственных функций, используемых для доступа к различным методам объекта. Применение СОМ-объектов в DLL-библиотеках дает ряд преимуществ перед экспортом обычных API-интерфейсов. Использовать указанные СОМ-объекты в приложении C++ или Object Pascal не труднее, чем любой другой API-интерфейс. Заголовочный файл DirectDraw описывает классы C++ для различных объектов DirectX. Экземпляры этих классов создаются путем вызова соответствующих функций "create". Естественно, создание Windows-приложений, использующих DirectX, требует навыков работы с инструментарием SDK или MFC.
Для компиляции и компоновки программы, использующей DirectX, прежде всего необходим комплект DirectX SDK. Он поставляется вместе со справочным файлом и полезными примерами программ. Кроме того, в системе должна быть установлена библиотека "DDRAW.DLL". Поскольку D
irectX представляет собой 32-разрядную технологию, необходим компилятор, способный генерировать приложения Win32 (такой, как Borland C++ 4.52 или C++ 5.0). Для выполнения программы в системе должны быть инсталлированы драйверы DirectX.