Загрузка...
 
Печать

Эволюция DirectX. От версии к версии (обзор)




Игрокодинг до появления DirectX


Image
Ultima IV: Quest of the Avatar (1985, ORIGIN systems)


Программирование игр для MS DOS

Первая версия операционной системы MS DOS (Microsoft Disc Operating System) вышла в свет в 1981 году. Она являлась предшественницей семейства ОС Windows и предоставляла программисту абсолютную свободу действий. Графических API в то время не было вовсе. Игры были аппаратно зависимыми. То есть, программист самостоятельно создавал в игре необходимые процедуры (чаще всего на низкоуровневом языке Ассемблер) для доступа к графическому адаптеру, устройствам ввода и звуковым устройствам. Ситуация осложнялась ещё и тем, что модели от разных производителей этих устройств программировались по-разному. Причём, даже в тех случаях, когда они относились к одному и тому же стандарту (CGA, EGA, VGA, SVGA). Таким образом программист тратил уйму времени на написание процедур сначала для одной видеокарты, затем для другой, затем для разных звуковых устройств и т.д. Тем не менее, игры под ОС MS DOS появлялись и с каждым годом их становилось всё больше.
Стандарт VESA, появившийся в начале 1990-х годов, значительно улучшил ситуацию. Несмотря на это, даже при включении в игру поддержки VESA, к ней обязательно прилагался список несовместимого оборудования.

Программирование игр для MS Windows

Первую версию MS Windows компания Microsoft показала на международной компьютерной выставке в 1985 году. Одна из главных целей нового семейства ОС от софтверного гиганта стала аппаратная независимость. Согласно замыслу, программа в среде Windows не работает с устройством напрямую. Это делает операционная система, которая получает всю информацию от специального драйвера устройства, поставляемого производителем. С этих пор обязанность по созданию аппаратно-независимых драйверов устройств легла на плечи создателей этих устройств. Что вполне справедливо. Microsoft же, в свою очередь, сконцентрировалась на развитии мультимедийных функций ОС Windows. Об играх под Windows тогда, вроде, речи не шло (Microsoft ориентировала свою ОС преимущественно на нужды бизнеса).

Graphics Device Interface (GDI)

Параллельно с развитием ОС MS Windows, совершенствовался и инструментарий для управления графикой в ней. GDI (Graphics Device Interface) являлся первым набором библиотек для программирования графических приложений. Он включает в себя огромное количество функций самой разной направленности (рисование в "канве", поддержка шрифтов True Type и т.д.). Основным его недостатком было низкое быстродействие. Именно поэтому долгое время игры под Windows представляли собой всевозможные карточные пасьянсы.
Microsoft делала попытку исправить положение с помощью библиотеки WinG, которая впервые появилась ещё в Windows 3.x и должная была стать графическим стандартом. Но из-за крайне узкой специализации и небольших возможностей она также не получила широкого распространения среди игрокодеров.

DirectX - это...

Представляет собой набор низкоуровневых интерфейсов программирования приложений (API) для создания игр и других мультимедиа-приложений.
  • Поддерживает 2D (двухмерную) и 3D (трёхмерную) графику, музыку, звуковые эффекты, устройства ввода и поддержку взаимодействия по сети.1
  • Не является набором для создания игр.
  • Является своеобразным посредником между программером, ОС и низкоуровыми функциями аппаратных устройств.
Он призван лишь помочь в разработке игровых приложений, предоставляя специальные API, которые избавляют от необходимости напрямую обращаться к аппаратным устройствам компьютера. Если то или иное устройство поставляется с DirectX-драйвером, то программер может обращаться ко всем фичам девайса посредством DirectX-интерфейсов. Если в видеокарте нет 3D-ускорения, DirectX организует его эмуляцию, переложив обработку графики на центральный процессор (CPU).
По сути DirectX предоставляет удобные интерфейсы для работы с графикой/звуком/вводом/сетью, избавляя программера от изучения подноготной своего железа. DirectX-приложения будут работать на подавляющем большинстве компьютеров под управлением ОС MS Windows. DirectX бесплатно распространяется в виде:
  • DirectX Runtime Library - набор библиотек для запуска DirectX приложений на ПК под управлением ОС MS Windows.
  • DirectX SDK - набор библиотек, заголовочных файлов и документации для разработки DirectX-приложений.
В DirectX SDK 8, помимо всего прочего, включены различные классы-помощники (helper classes) и библиотеки-помощники (например D3DX).
Новые версии DirectX появляются регулярно. DirectX 10 уже встроен в Windows 10. В каждой новой версии не только появляются новые фичи, но и преобразуются входящие в него компоненты. Так, например в DirectX 7 за 2D-графику отвечал компонент DirectDraw, а за 3D - Direct3D. В DirectX 8 два этих компонента объединили в один под общим названием DirectX Graphics. Та же история с DirectSound и DirectMusic: в DirectX 8 всё это дело стало называться DirectX Audio. Если вдруг очень надо использовать DirectDraw, то можно просто подключить к проекту соответствующую библиотеку из DirectX SDK 7. Это никак не скажется на совместимости игры, т.к. (благодаря COM) DirectX обратно совместим со своими старыми версиями. Т.е. игра, созданная под DirectX 7 без труда пойдёт на компе с DirectX 8, 9 или более поздними версиями библиотеки времени выполнения (DirectX Runtime Library).

Хронология версий DirectX


Windows Game SDK (сентябрь 1995 г.)

Именно так называлась первая версия DirectX SDK. Содержал компоненты:
  • DirectDraw (отвечает за графику в играх),
  • DirectPlay (отвечает за сетевые соединения),
  • DirectSound (отвечает за звук в играх),
  • DirectInput (обрабатывает пользовательский ввод; например с клавиатуры, мыши или джойстика),
  • DirectSetup (создаёт красивую оболочку для инсталляции игр).
Большинство компонентов являлись обычными надстройками над Windows API (Win32 API). Компонент DirectDraw обладает следующими преимуществами:
  • Уровень аппаратной абстракции (Hardware Abstraction Level - HAL) предоставляет интерфейсы для прямого доступа к видеопамяти, что значительно увеличивает производительность программ.
  • DirectDraw распознаёт все возможности видеоадаптеров и использует их. К примеру, если видеоадаптер поддерживает аппаратное копирование данных, DirectDraw обязательно будет пользоваться этой возможностью. При отсутствии такой поддержки, данная функция будет эмулироваться программно на уровне аппаратной эмуляции (Hardware Emulation Level - HEL), часто с существенной потерей производительности.
  • DirectDraw предназначен для работы в среде MS Windows и поэтому предоставляет 32-битный доступ к памяти и использование её "плоской" модели.
  • Поддержка переключения видеостраниц. При этом допускается создание нескольких вторичных страниц и их последующее размещение как в видео-, так и в системной памяти.
  • Поддержка полноэкранных режимов, трёхмерных Z-буферов, динамических палитр, изменение разрешения экрана.
  • DirectDraw существенно упрощает создание графических приложений. Все действия программиста сводятся к получению информации о видеоадаптере и копированию данных на экран или в системную память. В то же время DirectDraw можно использовать одновременно с GDI.
  • Уже здесь появляется функция SetCooperativeLevel. Для полноэкранного режима в неё передаётся параметр exclusive, чтобы никакое другое полноэкранное приложение не могло использовать графический адаптер, кроме текущего.2

DirectX 2.0

Многочисленные изменения во всех компонентах. Появился новый компонент Direct3D (для работы с трёхмерной графикой). Больше всего нововведений появилось в компоненте DirectDraw:
  • Представлен новый формат файлов .x для хранения 3D-моделей (в текстовом виде). В .x-файлах хранится вся необходимая информация о полигональных сетках (мешах), используемых текстурах и анимации + кастомные объекты, созданные игрокодерами. Согласно замыслу, их основное назначение - компьютерные игры.3
  • Добавлены интерфейсы IDirectDraw2 и IDirectDrawSurface2.
  • Функция IDirectDraw2::SetDisplayMode() теперь имеет на 2 параметра больше. Это dwRefreshRate (указывает частоту обновления монитора) и dwFlags, задающий флаги.
  • Добавлена функция IDirectDraw2::EnumDisplayModes(), перечисляющая рабочие видеорежимы.
  • Добавлена функция IDirectDraw2::GetAvailableVidMem(), возвращающая через параметры размер свободной для использования видеопамяти.
  • Количество интерефейсов IDirectDraw, которые можно создавать одновременно, теперь неограничено (теоретически). Причём каждый созданный интерфейс будет абсолютно независим от других.
  • Улучшена работа с цветовыми палитрами.
  • Множество других изменений.

DirectX 3.0

Макрос INITGUID теперь не требуется опеределять. Вместо этого необходимо включать в проект файл dxguid.lib.
Многочисленные изменения и улучшения во всех компонентах. Самые значительные изменения - в DirectPlay:
  • Переименован библиотечный файл DirectPlay: с "play.lib" на "playx.lib".
  • Добавлен новый системный провайдер, использующий протокол TCP/IP.
  • Создан новый интерфейс IDirectPlayLobby, предназначенный для поиска игроков в сети, предоставления им возможности совместно играть и общаться.
  • Одноранговые соединения получили возможность изменять сервер имён (например в случае, когда текущий сервер по какой-либо причине покинул сеанс).
  • Появилась рассылка данных игрока. При каждом изменении статуса любого из игроков другие участники сеанса автоматически информируются об этом при помощи системных сообщений.
  • Поддержка двоичных .x-файлов.
Кроме этого:
  • В DirectDraw создание интерфейса IDirectDraw2 при помощи функции CoCreateInstance() отныне невозможно. Вместо него рекомендуется использовать для этого метод QueryInterface() из предыдущей версии интерфейса IDirectDraw. Кроме того, Microsoft заявила о возникновении ошибки при переключении поверхностей функцией IDirectDraw2
    Flip(). Для этого рекомендовалось применять IDirectDraw
    Flip().
  • В DirectSound появилась поддержка объёмного звука при помощи DirectSound3D. Помимо этого, новый компонент был дополнен новым флагом DBSCAPS_GLOBALFOCUS (режим "глобального звука").
  • В DirectInput добавлена поддержка клавиатуры и мыши! Для этого в функции IDirectInput::CreateDevice() достаточно указать параметры GUID_SysKeyboard и GUID_SysMouse соответственно. До этого в DirectInput поддерживались одни лишь джойстики.

DirectX 4.0

Был анонсирован, но так и не вышел. (Был?) доступен как бета для Windows NT 4.0 .4 Рэймонд Чен из Microsoft объяснил в своей книге "Старая новая вещь", что после выхода DirectX 3 Microsoft начала разрабатывать версии 4 и 5 одновременно. Версия 4 должна была быть краткосрочным релизом с небольшими функциями, в то время как версия 5 будет более существенным релизом. Отсутствие интереса со стороны разработчиков игр к функциям, заявленным для DirectX 4, привело к тому, что она была отложена, а большое количество документов, которые уже отличали две новые версии, привело к тому, что Microsoft решила не использовать версию 4 повторно для описания функций, предназначенных для версии 5.

DirectX 5.0

Значительные изменения во всех компонентах, связанные, в основном, с подддержкой новых аппаратных устройств. В DirectDraw:
  • Появился новый интерфейс IDirectDrawSurface3, предназначенный для работы с поверхностями.
  • Для поддержки аппартаных видеопортов введены интерфейсы IDirectDrawVideoPort и IDDVideoPortContainer, которые предоставляют возможность перенаправлять поток данных, полученного с видеопорта, на поверхность DirectDraw.
  • Для перечисления стандартных видеорежимов VGA был введён новый флаг DDEDM_STANDARTVGAMODES. Стандартными видеорежимами называют режимы, которые инициализируются с помощью VGA BIOS (например, режим 13h - 320x200x8).
  • Появилась поддержка набора команд процессора MMX. DirectDraw проверяет наличие поддержки MMX, и если она есть, использует её для увеличения производительности работы с поверхностями.
  • Новый метод IDirectDrawSurface3::SetSurfaceDesc() применяется для изменения парметров поверхности.
  • Новый интерфейс IDirectDrawColorControl используется для изменения параметров отображения цветов в непалитровых режимах, без изменения первичной поверхности.
  • DirectDraw теперь позволяет создавать внеэкранные поверхности большей ширины, чем первичная. Эта возможность должна поддерживаться видеоадаптером, о чём можно узнать с помощью флага DDCAPS2_WIDESURFACES структуры DDCAPS.
  • Появилась поддержка AGP (Advanced Graphics Port - расширенный графический порт). Использование AGP можно указать при помощи поля DDCAPS_LOCALVIDMEM структуры DDCAPS (только в ОС MS Windows 98 и более поздних).
  • Появилась поддержка использования нескольких мониторов одновременно (только в ОС MS Windows 98 и более поздних).

В DirectSound:
  • Новый интерфейс IKsPropertySet предназанчен для использования расширенных возможностей звуковых карт, которые были определены их производителями.
  • Новый интерфейс DirectSoundCapture предназначен для захвата звука со входа звуковой карты.
  • Появилась система оповещения (notification) предназначенная для отслеживания состояния проигрывания звука в DirectSound. Она устанавливает событие всякий раз, когда проигрывание данных из буфера достигает указанной метки.
  • Появилась аппаратная поддержка DirectSound3D, что существенно увеличило быстродействие. Это также позволило снизить загрузку процессора при микшировании трёхмерного звука.
  • Теперь при обработке трёхмерного звука учитывается количество колонок, их вид и расположение. Для этого в DirectSound3D были добавлены новые алгоритмы. Конфигурация звуковых динамиков берётся из пользовательских настроек, которые производятся в Панели управления MS Windows.

В DirectPlay:
  • Добавлены интерфейсы IDirectPlay3 и IDirectPlayLobby3.
  • Появилась возможность подавлять стандартные диалоги системных провайдеров при помощи IDirectPlayLobby.
  • Функция IDirectPlay3;:EnumSessions() теперь поддерживает асинхронный метод перечисления открытых в сети сеансов (сессий).
  • Появился новый тип соединения - с повышенной безопасностью. Для идентификации пользователя может использоваться провайдер безопасности NTLM. Это позволяет интегрировать DirectPlay в локальную сеть Microsoft.

В DirectInput:
  • Добавлен COM-интерфейс для работы с джойстиками, что существенно расширило его возможности.
  • Добавлена поддержка устройств с обратной связью(external link) (Force Feedback).

DirectX 6.0

Добавлено мультитекстурирование.

В DirectDraw:
  • Новые интерфейсы IDirectDraw4 и IDirectDrawSurface4 для работы с видеоадаптерами.
  • Новые структуры DDSCAPS2 и DDSURFACEDESC2 применяются для упрощения получения информации о совместимости.
  • Новая функция IDirectDrawSurface4::TestCooperativeLevel(), возвращающая статус уровня кооперации. Данная функция очень полезна для предотвращения ошибочных попыток восстановить потерянные поверхности (например, после того, как приложение было свёрнуто, а затем восстановлено).
  • Добавлен интерфейс IDirectDrawGammaControl, который позволяет изменять уровень цветов на первичной поверхности без её измеения.

В DirectSound:
  • Документация по DIrectSound была дополнена новыми обзорами и примерами.

В DirectPlay:
  • Добавлены интерфейсы IDirectPlay4 и IDirectPlayLobby3.
  • Новый протокол DirectPlay выполняет проверку доставки для всех сетевых пакетов.
  • Появилась поддержка асинхронных сообщений. При их отправке система не дожидается ответа о доставке сообщения, а сразу возвращает управление программе. Если сообщение было успешно доставлено, приложение получает соответствующее системное сообщение.
  • Введена возможность постоянно проверять связь между клиентом и сервером. Если связь оборвётся, информация об этом будет получена немедленно, а не при следующей попытке отправки сообщения.
  • Появилась опция искусственного сокащения скорости исходящего трафика: так называемый throttling (англ. -"удушение"). Это полезно для сетей с низкой пропускной способностью и для предупреждения переполнения очереди сообщений на получающем компьютере.
  • В IDirectPlayLobby3 все клиенты информируются о миграции сервера.
  • Новые функции IDirectPlayLobby3, RegisterApplication и IDirectPlayLobby3 UnregisterApplication применяются для регистрации и удаления лобби-ориентированных приложений. Кроме того, лобби-клиенты получили возможность передавать все данные для соединения уже запущенным программам.

В DirectInput:
  • Была немного изменена документация.

DirectX 6.1

Добавлен новый компонент DirectMusic, позволяющий управлять MIDI-секвенсором, встроенным в большинство дискретных звуковых карт (либо его программной версией, встроенной в MS Windows). Поддерживается управление как на высоком, так и на самом низком уровне.

DirectX 7.0

Microsoft делает бОльшую ставку на язык программирования Visual Basic. В состав включены необходимые компоненты и документация для использования DirectX совместно с Visual Basic. Добавлена аппаратная поддержка обрезания, преобразований и освещения.

В DirectDraw:
  • Для создания нового экземпляра объекта IDirectDraw7 теперь рекомендуется использовать функцию DirectDrawCreateEx().
В DirectSound:
  • Появилась аппаратная поддержка голосового управления.
  • Введена возможность выбора одного из трёх алгоритмов просчёта трёхмерного звука: NO_VIRTUALIZATION, HRTF_LIGHT, HRTF_FULL.
  • В MS Windows 98 SE и MS Windows 2000 появилась возможность создавать и проигрывать многоканальные звуковые буферы, используя для этого WDM-драйверы.
  • При использовании Debug (отладочной) версии DirectSound, во время проигрывания звукового буфера к нему добавляется статический шум. Это помогает определить, осуществляется ли воспроизведение звука, если буфер не содержит звуковых данных.

В DirectMusic:
  • Добавлена поддержка DLS второго уровня. В DirectPlay:
  • Добавлена поддержка так называемого "разделённого запуска" (когда одно приложение запускается при помощи другого). Данная функция обеспечивает более высокий уровень безопасности.

В DirectInput:
  • Введена возможность отключать дополнительные клавиши Windows при использовании эксклюзивного режима кооперации.
  • Добавлен Fedit и новые интерфейсы для упрощения управления устройствами.

DirectX 8.0

Значительные изменения во всех компонентах. Самое заметное - увеличение производительности аппаратного 3D-ускорения при работе с трёхмерной графикой. Новый компонент DirectX Audio - результат объединения DirectSound и DirectMusic. Компонент DirectDraw полностью вошёл в состав Direct3D и представляет собой один общий компонент DirectX Graphics, отвечающий за всю графику в играх. Начиная с этой версии DirectX, компания Microsoft предлагает эмулировать всё 2D через 3D.
Добавлена шейдерная модель 1.1 .

В Direct3D:
  • Все 3D devices заменены на три: HAL Device, Pure HAL Device и Reference Rasterizer.
  • Index Buffer (в дополнение к Vertex Buffer).
  • Pixel Shader, Vertex Shader.
Компания Microsoft придумала некий псевдо-ассемблер для программирования мультитекстурных эффектов. Он (псевдоассемблер) включает в себя следующие понятия:
  • registers (vertex color registers, factor registers and temporary registers),
  • инструкции (add, sub, mult, madd(mult + add и 3 arguments), blend, dp3 (dot product 3), cmul ((ARG0.A > 0.5 ? ARG2 : ARG1*ARG2) ),
  • Texture Address Operations (ie Perturbations): texcoord (sample texture directly at given texcoords), kill (mask out pixel if any texcoord <0), bumpenvmap (2x2 scene-wide-matrix multiply, add, and dependent read), beml (above with luminance correction), indexar (use specified input as texcoords to this stage), indexgb (use specified input as texcoords to this stage), mat2x3 (2x3 interpolated matrix multiply/read), mat3x3 (3x3 interpolated matrix multiply/read), reflect (reflection calculation),
  • модификаторы инструкций (bias/unbias (+0.5/-0.5), 2x, 4x, 8x, 1/2, 1/4, 1/8),
  • модификаторы аргументов инструкций (inv (1-color for each component), alpha (replicate alpha), blue (use blue component as alpha channel)).
Теперь multitexture effect ограничен только фантазией автора... + в некоторых случаях это может спасти текстурное пространство, т.к. до этого делались промежуточные текстуры для реализации эффектов, а теперь они не понадобятся.
  • Поддержка нескольких input geometry streams (несколько VB+IB на входе и один на выходе).
  • Z-buffer отделён от render surface.
С DX6 появилась интересная функциональная возможность — render to texture. Но для использования её надо было создавать для текстуры свой собственный z-buffer (если z-buffer использовался и для основного rendering). Это было неудобно и криво. Теперь в DX8 z-buffer уже не является принадлежностью render surface, они объединяются вместе вызовом функции SetRenderTarget, в которую передаётся z-buffer и render surface. Теперь можно при одном и том же z-buffer^ менять render target!
  • Добавлен debug device.
Эта функциональность введена исключительно для отладки программы с DX. Debug device позволяет устанавливать break points на события внутри драйверов и получать всяческие внутренние переменные.

DirectX 8.1

Улучшена стабильность работы. Добавлен ряд функций по работе с динамическими тенями. Поддержка пиксельных шейдеров 1.4 и вершинных шейдеров 1.1 .

DirectX 9.0

Наиболее продвинутая из стабильных версий. Добавлены функции просчета сложных эффектов освещения, продвинутые алгоритмы текстурирования, в том числе и псевдообъемного, улучшена прорисовка воды. Поддержка шейдерной модели 2.0. Состоит из следующих компонентов:
  • DirectX Graphics: сочетает в себе возможности интерфейсов DirectDraw и Direct3D предыдущих версий, предназначенных для программирования графики.
  • DirectInput: предоставляет возможности по обработке пользовательского ввода с самых разнообразных устройств — таких, как игровые манипуляторы и "мыши".
  • DirectPlay: содержит средства для создания сетевых приложений (например, многопользовательских игр).
  • DirectX Audio (в этот компонент объединены DirectSound, DirectMusic и DirectX Media Objects) предоставляют средства программирования звука и MIDI-музыки.
  • DirectShow: средства для захвата и воспроизведения мультимедийных потоков. В версии 9.0 впервые появились DirectShow Editing Services (DES): набор объектов, позволяющих легко создавать программы для нелинейного монтажа или проигрывателей аудио и видео с применением real-time эффектов и красивых переходов между роликами.
  • DirectSetup: программный интерфейс, позволяющий настраивать установку DirectX на системах пользователей.
  • DirectX Diagnostics: программный интерфейс для диагностики драйверов и оборудования.

DirectX 9.0b

Поддержка пиксельных шейдеров 2.0b и вершинных шейдеров 2.0 .

DirectX 9.0c

Поддержка шейдерной модели 3.0

DirectX 9.0L

Версия DirectX 9.0 для Windows Vista (Longhorn).

DirectX 10

Основной упор сделан на увеличение детализации и реалистичности анимированных изображений. Разработан специально для операционной Windows Vista. Поддержка шейдерной модели 4.0 (только Windows Vista и выше)
  • Более реалистичная анимация шерсти меха и растений.
  • Более мягкие и более чёткие тени.
  • Более насыщенные ландшафты с более сложной окружающей обстановкой.
  • Значительно более тщательно прорисованный лес, более масштабные и детальные сцены баталий.
  • Более динамичные и чаще меняющиеся по ходу событий сценарии игр.
  • Больший реализм и уменьшение смазывания движущихся объектов.
  • Объёмные эффекты.
  • Уточнённый, более реалистичный дым и облака.
  • Более реалистичные отражения и преломления на отражающих поверхностях - воде, автомобилях, стекле и др.
  • Снижение загрузки CPU, перераспределение обсчёта ряда процессов на GPU, снижение вероятности подтормаживания и зависания системы при сложном геймплее.

DirectX 10.1

Поддержка шейдерной модели 4.1 (только Windows Vista и выше).

DirectX 11

Поддержка шейдерной модели 5.0 (только Windows Vista и выше).

DirectX 11.1

Поддержка шейдерной модели 5.0 (только Windows 7 SP1 и выше).

DirectX 11.2

Поддержка шейдерной модели 5.0 (только Windows 8.1).

Источники:


1. Adams J. Programming Role Playing Games with DirectX 8.0. - Premier Press. 2002
2. Calvert C. Delphi 2 Unleashed. Second ed. - SAMS Publishing, 1996


Последние изменения страницы Пятница 14 / Июль, 2023 23:02:33 MSK

Последние комментарии wiki

No records to display

Search Wiki Page

Точное совпадение

Категории

|--> C#
|--> C++