На каком языке написан directx

Обновлено: 06.07.2024

Содержание

DirectX API

Практически все части DirectX API представляют собой наборы COM-совместимых объектов.

В целом, DirectX подразделяется на:

История

Изначально нацеленный на разработку видеоигр, DirectX стал популярен и в других областях разработки программного обеспечения. К примеру, DirectX, наряду с OpenGL, получил очень широкое распространение в инженерном/математическом ПО.

DOS позволяла разработчику получить прямой доступ к видеокарте, клавиатуре/мыши/джойстику и прочим частям системы, в то время как Windows 95, с её защищённой моделью памяти, предоставляла более стандартизованный, но в то же время весьма ограниченный и накладный доступ к устройствам. Microsoft нуждалась в новом способе дать разработчику всё, что ему необходимо. Айслер (Eisler), Сэйнт Джон (St. John), и Энгстром (Engstrom) решили эту проблему, назвав само решение DirectX.

Первый релиз DirectX был выпущен в сентябре 1995 года, под названием «Windows Game SDK».

DirectX является базой для Xbox API. Xbox API схож с DirectX 8.1, но обновление версии, как и на других консолях того времени, невозможно.

В 2002 году Microsoft выпустила DirectX 9 с улучшенной и расширенной поддержкой шейдеров. С 2002 года DirectX неоднократно обновлялся. В августе 2004 года в DirectX была добавлена поддержка шейдеров версии 3.0 (DirectX 9.0c).

В апреле 2005 интерфейс DirectShow был перемещён в Microsoft Platform SDK.

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

Ключевые особенности версий

Совместимость

Многие современные устройства имеют DirectX-совместимые драйверы, иными словами, пользователь должен установить DirectX для использования всех возможностей устройства. На данный момент система обновления драйверов Windows Update позволяет загружать только необходимые библиотеки, а не весь драйвер целиком.

Поддерживаемые операционные системы:

    , Windows 98, Windows 98 Second Edition, Windows Millenium Edition; , Windows 2000, Windows 2000 Advanced Server, Windows 2000 Professional Edition, Windows 2000 Server, Windows 2000 Service Pack 2, Windows 2000 Service Pack 3, Windows 2000 Service Pack 4; , Windows Server 2003 Service Pack 1, Windows Server 2003 Datacenter x64 Edition, Windows Server 2003 Enterprise x64 Edition, Windows Server 2003 Standard x64 Edition, Windows Small Business Server 2003; , Windows XP 64-bit, Windows XP Home Edition, Windows XP Media Center Edition, Windows XP Professional Edition, Windows XP Service Pack 1, Windows XP Service Pack 2, Windows XP Service Pack 3, Windows XP Starter Edition, Windows XP Tablet PC Edition; ; ; , Windows Server 2008 R2; .

Будущее DirectX

DirectX 11.1 включен в состав Windows 8. Поддерживает WDDM 1.2 для увеличения производительности, с улучшенной интеграцией Direct2D, Direct3D, и DirectCompute, и включает в себя DirectXMath, XAudio2, и XInput библиотеки из XNA framework. Также есть возможность стереоскопического 3D для поддержки игр и видео. [2]

См. также

Литература

Примечания

Ссылки

Контакты • DVD Maker • Факсы и сканирование • Internet Explorer • Журнал • Экранная лупа • Media Center • Проигрыватель Windows Media • Программа совместной работы • Центр устройств Windows Mobile • Центр мобильности • Экранный диктор • Paint • Редактор личных символов • Удалённый помощник • Распознавание речи • WordPad • Блокнот • Боковая панель • Звукозапись • Календарь • Калькулятор • Ножницы • Почта • Таблица символов • Исторические: Movie Maker • NetMeeting • Outlook Express • Диспетчер программ • Диспетчер файлов • Фотоальбом

Chess Titans • Mahjong Titans • Purble Place • Пасьянсы (Косынка • Паук • Солитер) • Сапёр • Пинбол • Червы

Autorun.inf • Фоновая интеллектуальная служба передачи • Файловая система стандартного журналирования • Отчёты об ошибках • Планировщик классов мультимедиа • Теневая копия • Планировщик задач • Беспроводная настройка

Active Directory • Службы развёртывания • Служба репликации файлов • DNS • Домены • Перенаправление папок • Hyper-V • IIS • Media Services • MSMQ • Защита доступа к сети (NAP) • Службы печати для UNIX • Удалённое разностное сжатие • Службы удаленной установки • Служба управления правами • Перемещаемые профили пользователей • SharePoint • Диспетчер системных ресурсов • Удаленный рабочий стол • WSUS • Групповая политика • Координатор распределённых транзакций

Инициа́ция (лат. initiatio — совершение таинства, посвящение) — обряд, знаменующий переход на новую ступень развития в рамках какой-либо социальной группы или мистического общества.
Википедия

Как понятно из написанного выше, сейчас я буду приобщать вас к некому таинству, переводить на следующую ступень знаний. Этим таинством будет программирование трехмерной графики и создание собственных игр. Курс будет состоять из нескольких лекций, знакомящих с основами DirectX, необходимыми для создания игр. Постепенно изучая DirectX, на протяжении всего курса мы и будем делать простую игру.

Большинство современных игр написано на зыке программирования С++ в связке с DirectX API. DirectX это разработанный компанией Микрософт интерфейс прикладного программирования (API - Application Programming Interface), который содержит в себе все структуры, константы, функции и объекты, необходимые для программирования игр вообще и трехмерной графики в частности. Ранее, до того, как Микрософт додумалась это сделать, каждому программисту приходилось писать все самостоятельно. Представляете, какой это адский труд. Хотя вряд ли представляете. Ну, можете просто поверить мне на слово.
Первая версия DirectX появилась в далеком 1995 году. На данный момент уже доступна одиннадцатая. Но поскольку официально ни 10 ни 11 версии не работают в Windows ХР, являющейся на данный момент самой распространенной операционной системой из семейства Windows, использовать мы будем DirectX 9. Все новые версии имеют полную совместимость с предыдущими, так что не переживайте на счет того, что мы взяли старую.
Еще стоит упомянуть, что для работы технология DirectX 9 должна поддерживаться видеокартой, но на данный момент это уже неактуально, поскольку вам вряд ли сейчас удастся найти видеокарту, которая его не поддерживает.

DirectX состоит из нескольких компонентов, каждый из которых служит для своих целей.

1. DirectX Graphics – набор интерфейсов для работы с трехмерной графикой.
2. DirectInput: - предназначен для обработки данных, поступающих с устройств ввода – мыши клавиатуры, иных манипуляторов.
3. DirectPlay: - интерфейс поддержки сети.
4. DirectSound: - интерфейс для работы со звуком. Ранее в составе DirectX находился еще один звуковой интерфейс – DirectMusic, но с 2008 года он был исключен. По слухам та же участь ждет и DirectSound.
5. DirectShow: - интерфейс, используемый для ввода/вывода видео и аудиоданных.

На этом знакомство закончим и перейдем к более насущным темам.






А для звука можно использовать Adobe Audition или Sound Forge.



Кроме перечисленных можно взять любые другие, просто с этими я работал и в случае чего могу что-то подсказать. В лекциях описывать методы работы с этими программами я не буду, только в крайнем случае. Если вам это нужно, воспользуйтесь дополнительной литературой.
Ну и на последок. На компьютере, на котором предполагается запуск ваших игр, должен быть установлен DirectX runtime. Это пакет библиотек, необходимых для функционирования DirectX. В вашем случае он установится вместе с SDK. Ну а другим пользователям придется скачать его с интернета, это если он у них еще не установлен, поскольку поставляется с большинством современных игр.
Не думаю, что у вас возникнут какие-то проблемы с установкой всего необходимого ПО, но один момент все же объясню. Установка DirectX SDK должна производится после установки Microsof Visual Studio, чтобы в настройках среды прописались необходимые пути к заголовочным файлам и библиотекам. Если этого по каким-то причинам не произошло(например вам не по трафику скачать полное SDK и вы смогли достать только нужные файлы), то эту работу придется проделать вручную.
Делается это так:
Открываем Microsof Visual Studio и кликаем на пункте меню Сервис→Параметры и видим вот такое окно Параметры:


Затем объявляем три переменные:
Первая - это структура, содержащая различные параметры окна(Они описаны в комментариях в исходном коде.)

Microsoft DirectX - это набор интерфейсов прикладного программирования (API) для обработки задач, связанных с мультимедиа , особенно с программированием игр и видео, на платформах Microsoft . Первоначально все названия этих API-интерфейсов начинались с «Direct», например Direct3D , DirectDraw , DirectMusic , DirectPlay , DirectSound и т. Д. Название DirectX было придумано как сокращенное обозначение для всех этих API ( X заменяет конкретные имена API) и вскоре стало названием коллекции. Когда Microsoft позже решила разработать игровую консоль, X использовался в качестве основы для названия Xbox, чтобы указать, что консоль основана на технологии DirectX. Первоначальный X был перенесен в именование API-интерфейсов, разработанных для Xbox, таких как XInput и Cross- Platform Audio Creation Tool (XACT), в то время как шаблон DirectX был продолжен для API-интерфейсов Windows, таких как Direct2D и DirectWrite .

Direct3D (API трехмерной графики в DirectX) широко используется при разработке видеоигр для Microsoft Windows и линейки консолей Xbox . Direct3D также используется другими программными приложениями для задач визуализации и графики, таких как проектирование CAD / CAM. Поскольку Direct3D является наиболее широко разрекламированным компонентом DirectX, часто встречаются взаимозаменяемые названия «DirectX» и «Direct3D».

Комплект разработки программного обеспечения DirectX (SDK) состоит из библиотек времени выполнения в распространяемой двоичной форме, а также сопроводительной документации и заголовков для использования при кодировании. Первоначально среды выполнения устанавливались только играми или явно пользователем. Windows 95 не запускалась с DirectX, но DirectX был включен в Windows 95 OEM Service Release 2. Windows 98 и Windows NT 4.0 поставлялись с DirectX, как и все версии Windows, выпущенные с тех пор. SDK доступен для бесплатной загрузки. Хотя среды выполнения являются проприетарным программным обеспечением с закрытым исходным кодом, исходный код предоставляется для большинства образцов SDK. Начиная с выпуска Windows 8 Developer Preview, DirectX SDK был интегрирован в Windows SDK.

СОДЕРЖАНИЕ

История развития

В конце 1994 года Microsoft была готова выпустить Windows 95 , свою следующую операционную систему . Важным фактором, определяющим ценность, которую будут придавать потребители, были программы, которые на нем можно было бы запускать. Сотрудник Microsoft Алекс Сент-Джон обсуждал с различными разработчиками игр, какова вероятность того, что они перенесут свои игры MS-DOS в Windows 95, и нашел ответы в основном отрицательными; программисты сочли, что среда Windows более трудна для разработки по сравнению с MS-DOS или другими игровыми платформами. Также были сильные опасения по поводу совместимости; Примечательным примером этого является «Анимированная книга рассказов Диснея: Король Лев», основанная на программном интерфейсе WinG . Из-за множества несовместимых графических драйверов от новых компьютеров Compaq , которые не тестировались с интерфейсом WinG, поставляемым вместе с игрой, он так часто вылетал на многих настольных компьютерах, что родители переполняли службы поддержки Disney .

Сент-Джон осознал, что сопротивление разработке игр под Windows будет ограничением, и нанял еще двух инженеров, Крейга Эйслера и Эрика Энгстрома , чтобы разработать лучшее решение, которое позволит большему количеству программистов разрабатывать игры для Windows. Проект получил кодовое название «Манхэттенский проект», поскольку в отношении одноименного проекта времен Второй мировой войны идея заключалась в замене разработанных в Японии игровых консолей персональными компьютерами под управлением операционной системы Microsoft. Первоначально он использовал символ радиации в качестве своего логотипа, но Microsoft попросила команду изменить логотип. Руководство не согласилось с проектом, поскольку они уже списали Windows как игровую платформу, но все трое взяли на себя обязательства по развитию этого проекта. Их бунтарский характер привел к тому, что Брэд Сильверберг , старший вице-президент по офисным продуктам Microsoft, назвал трио «Beastie Boys».

Большая часть работы этих троих была проделана среди других назначенных проектов, начиная с конца 1994 года. В течение четырех месяцев и при участии нескольких производителей оборудования команда разработала первый набор интерфейсов прикладного программирования (API), который они представили на конференции. 1995 Конференция разработчиков игр . В SDK входили такие библиотеки, как DirectDraw для графических программ, DirectSound для аудио и DirectPlay для сетевых коммуникаций. «Прямая» часть библиотеки была названа, поскольку эти процедуры обычно обходили основные процедуры Windows 95 и напрямую обращались к аппаратному обеспечению компьютера. Хотя команда назвала его «Game SDK» ( комплект для разработки программного обеспечения ), имя «DirectX» пришло от одного журналиста, который высмеивал схему именования различных библиотек. Команда решила продолжить использовать эту схему именования и назвать проект DirectX.

Первая версия DirectX была выпущена в сентябре 1995 года как Windows Games SDK. Это была замена Win32 для API DCI и WinG для Windows 3.1 . DirectX позволял всем версиям Microsoft Windows, начиная с Windows 95, включать высокопроизводительные мультимедиа. Эйслер написал в своем блоге об безумном стремлении создать DirectX 1–5.

Чтобы получить больше разработчиков на борту DirectX, Microsoft подошел ID Software «s Джон Кармак и предложил порт Гибели и Doom 2 из MS-DOS в DirectX, бесплатно, с идентификатором сохраняя все издательские права на игру. Кармак согласился, и Гейб Ньюэлл из Microsoft возглавил проект по переносу. Первая игра была выпущена как Doom 95 в августе 1996 года, первая опубликованная игра DirectX. Microsoft активно продвигала игру, и Билл Гейтс появлялся в рекламе этой игры.

DirectX 2.0 стал компонентом самой Windows с выпуском Windows 95 OSR2 и Windows NT 4.0 в середине 1996 года. Поскольку сама Windows 95 была еще новой и для нее было выпущено мало игр, Microsoft активно продвигала DirectX среди разработчиков, которые в целом не доверяли способности Microsoft создать игровую платформу на Windows. Алекс Сент-Джон, проповедник DirectX, устроил тщательно продуманное мероприятие на конференции разработчиков компьютерных игр 1996 года, которую разработчик игр Джей Барсон описал как римскую тему, включая настоящих львов , тоги и что-то похожее на карнавал в помещении. Именно на этом мероприятии Microsoft впервые представила Direct3D и DirectPlay и продемонстрировала многопользовательский режим MechWarrior 2, в который можно играть через Интернет.

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

До DirectX Microsoft включала OpenGL в свою платформу Windows NT . В то время OpenGL требовал "высококлассного" оборудования и был ориентирован на разработку и использование САПР . Direct3D задумывался как контролируемая Microsoft альтернатива OpenGL, изначально ориентированная на использование в играх. По мере роста 3D-игр OpenGL был разработан, чтобы включить лучшую поддержку методов программирования для интерактивных мультимедийных приложений, таких как игры, предоставляя разработчикам выбор между использованием OpenGL или Direct3D в качестве API 3D-графики для своих приложений. С этого момента началась «битва» между сторонниками кроссплатформенного OpenGL и Direct3D только для Windows. Между прочим, OpenGL поддерживался в Microsoft командой DirectX. Если разработчик решил использовать API трехмерной графики OpenGL, другие API-интерфейсы DirectX часто объединяются с OpenGL в компьютерных играх, поскольку OpenGL не включает в себя все функции DirectX (например, поддержку звука или джойстика).

В версии для консоли DirectX использовался в качестве основы для консольных API Microsoft Xbox , Xbox 360 и Xbox One . API был разработан совместно Microsoft и Nvidia , которые разработали специальное графическое оборудование, используемое в оригинальной Xbox. Xbox API был похож на DirectX версии 8.1, но не подлежал обновлению, как и другие консольные технологии. Кодовое название Xbox было DirectXbox, но было сокращено до Xbox из-за его коммерческого названия.

В 2002 году Microsoft выпустила DirectX 9 с поддержкой использования гораздо более длинных шейдерных программ, чем раньше, с пиксельными и вершинными шейдерами версии 2.0. С тех пор Microsoft продолжала обновлять пакет DirectX, представив Shader Model 3.0 в DirectX 9.0c, выпущенном в августе 2004 года.

В апреле 2005 года DirectShow был удален из DirectX и вместо этого перемещен в Microsoft Platform SDK .

Было подтверждено присутствие DirectX в Microsoft Windows Phone 8 .

Трассировка лучей в реальном времени была объявлена ​​как DXR в 2018 году.

Логотипы

Оригинальный логотип напоминал деформированный предупреждающий знак радиации . Как ни странно, первоначальное название проекта DirectX было «Манхэттенский проект», отсылка к инициативе США по созданию ядерного оружия . Алекс Сент-Джон , глава евангелизации Microsoft DirectX в то время, утверждает, что коннотация окончательного результата Манхэттенского проекта ( ядерная бомбардировка Японии ) является преднамеренной, и что DirectX и его родственный проект Xbox (который разделяет подобный логотип), были призваны вытеснить японских производителей видеоигр с их доминирующего положения в индустрии видеоигр . Однако Microsoft публично отрицает эту учетную запись, вместо этого заявляя, что логотип является просто художественным дизайном.

Пока в природе не существовало DirectX, большинство игровых программ для персональных компьютеров работали под управлением Ms Dos.
Чтобы запустить такие игры, пользователям приходилось бороться, в прямом смысле этого слова, с конфигурационными файлами системы, такими, как AUTOEXEC.BAT, CONFIG.SYS, и с настройками драйверов типа EMM386.EXE и т.д. лишь ради того, чтобы получить несколько дополнительных свободных байт из доступных 640Кб базовой памяти, даже если на компьютере установлено 16Мб оперативной памяти.

Жизнь разработчиков программного обеспечения была не сахар, потому что для преодоления ограничения в 640Кб приходилось использовать различные драйверы для каждой разновидности видеоадаптеров и звуковых карт.

С выходом в свет технологии компании Microsoft DirectX для Windows 95 все указанные выше проблемы становятся историей.

Теперь разработчики могут использовать аппаратно независимый интерфейс программирования, с помощью которого создаются новые игры, для участия в которых пользователю достаточно лишь вставить в устройство чтения компакт-диск с данными и наслаждаться игрой. Теперь писать игры и играть в них стало гораздо приятнее.

Но разработка игр с использованием DirectX остается все еще непростой задачей. Иногда все еще достаточно трудно найти грамотную документацию, и начинающие разработчики тратят много времени на поиск знаний о том, как использовать такие новшества, как DirectDraw, Z-буферы или DirectSound, а также многие другие сложные, но полезные инструменты.

Цель этой статьи — помочь разработчикам, использующим DirectX, несколькими советами, основанными на моем собственном опыте написания программ. Обычные пользователи смогут получить из этого обзора общее представление о том, что такое DirectX.

Что такое DirectX ?

DirectX представляет собой набор из нескольких API (application programming interface — интерфейс программирования приложений), позволяющих разработчикам игр и других интерактивных приложений получать доступ к специфическим функциям аппаратного обеспечения без необходимости написания аппаратнозависимого программного кода. DirectX основан на наборе интерфейсов COM или классов. COM расшифровывается, как Component Object Model (Компонентная Модель Объектов), и представляет собой спецификацию интерфейса, в котором функции вызываются через указатели. Таким образом, объекты COM могут описываться такими языками программирования, как C/C++, Delphi или даже Basic. Все примеры, ссылка на которые была выше, написаны на C++, т.к. я пользуюсь именно этим языком. Интерфейс COM используется не только в DirectX, но и на уровне операционной системы в качестве модели объектов и является сердцем одной из самой широко применяемой технологии — OLE (Objects Linking and Embedding — связывание и встраивание объектов).

  • DirectDraw — обеспечивает доступ к аппаратным средствам, отвечающим за изображение. Предлагается возможность работать с двумерной графикой и напрямую управлять видеопамятью, оверлеями и сменой видеостраниц.
  • DirectSound — как видно из названия, этот компонент обеспечивает аппаратнонезависимый интерфейс воспроизведения звука. DirectSound позволяет приложениям полностью использовать возможности аппаратных компонентов, обеспечивающих работу со звуком, например, микширование без временных задержек.
  • DirectInput — Обеспечивает аппаратнонезависимый ввод данных в систему в режиме реального времени. События, обрабатываемые DirectInput, формируются клавиатурой, мышкой и джойстиком.
  • DirectPlay — представляет собой независимый протокол для осуществления связи между компьютерами. Может применяться для многопользовательских игр, связь в которых осуществляется через Интернет, локальную сеть или прямое последовательное соединение с помощью кабеля. Интерфейс, именуемый DirectPlay Lobby, позволяет создавать онлайновые места встреч в интернете, попадая в которые множество людей могут объединяться и совместно участвовать в играх.
  • Direct3D — это подсистема создания трехмерных графических изображений. Состоит из API низкого уровня, который обеспечивает несколько базовых возможностей создания изображения, и API высокого уровня, который осуществляет комплекс операций, образующих изображение.

DirectX 5.0 SDK (Software Development Kit — Набор разработчика программ), доступен для загрузки с сайта Microsoft.

Справочник по DirectX для начинающих

Если Вы не являетесь разработчиком игровых программ, но Вам нравиться играть на персональном компьютере, Вы точно должны были слышать о DirectX. Почему?

Потому что DirectX широко используется в современном поколении компьютерных игр. Каждая игрушка, имеющая логотип "for Windows 95", прежде, чем запуститься на Вашем компьютере, требует наличия установленного в системе DirectX. Вот почему DirectX это не просто "нечто для программистов", это принципиально необходимое нечто для игроков.

В тоже время если какая-то из таких современных игр установленна на Вашем компьютере, значит, DirectX тоже установлен, и Вы можете узнать об этом, обратив внимание на несколько новых файлов, которые появились в директории WindowsSystem, например DDRAW.DLL или DPLAY.DLL. Это компоненты DirectX, которые используются всеми играми, установленными в Вашей системе и работающими через интерфейс DirectX.

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

  • Улучшенные многопользовательские игры
    Причина, почему хороших многопользовательских игр не так много, в том, что они очень сложны в создании. DirectPlay делает создание таких игр менее болезненной проблемой и упрощает их установку. Вот почему мы вправе ожидать увеличения количества новых классных многопользовательских игр.
  • Завораживающие 3D-игры
    Вы знаете, почему трехмерные игры идут на Вашем компьютере так медленно? Причина в том, что изображение 3D-объектов на плоском экране требует огромного количества математических вычислений. Если эти вычисления осуществляются центральным процессором системы, то такие процессы обсчитываются слишком медленно, так как процессор выполняет еще и другие системные операции. Одним из решением этой проблемы является возложение задач по обработке трехмерных процессов на специальные 3D-видеоакселераторы.

Такие карты имеются в продаже, но многие игры не используют аппаратные возможности специализированных плат, потому что создатели игры должны написать соответствующий драйвер, а иногда бывает проблематично переписать заново целые фрагменты кода для того, чтобы использовать преимущества аппаратной обработки 3D. Компонент Direct3D, впервые включенный во вторую версию DirectX, обеспечивает стандарт на использование видеоадаптеров, обеспечивающих аппаратную 3D-акселлерацию, и его применение, несомненно, заставит трехмерные игрушки работать быстрее.

Очень часто встречаются различные заблуждения по поводу этих двух API.

Я попытался изложить в этой статье основные факты, которые следует знать как разработчикам, так и конечным пользователям.

Так как тема очень холиварная, я старался придерживаться максимально нейтрального тона.

Взгляд с высоты птичьего полёта

Оба API предоставляют доступ к функциям аппаратного ускорения 3D-графики.

Direct3D — проприетарная разработка Microsoft, созданная специально для Windows. В настоящее время используется так же и на Microsoft Xbox. На других платформах недоступен (если не брать в учёт эмуляцию API, предоставляемую Wine, а также виртуализацию).

OpenGL — открытый стандарт, разрабатываемый некоммерческой организацией Khronos Group при участии сообщества. Все крупные производители GPU (nVidia, AMD, Intel), так или иначе, влияли на OpenGL. В отличие от Direct3D, доступен на очень большом количестве платформ. В частности, OpenGL является основным API для взаимодействия с GPU в Linux и Mac OS.

«Внешние» технические различия API

Direct3D основан на технологии COM. COM — это, по сути, стандарт бинарного представления компонентов. Как известно, классы на чистом C++ не могут быть использованы из других языков программирования, так как они не имеют стандартизованного бинарного представления. В частности, каждый компилятор использует свой собственный метод декорирования имён. COM же позволяет работать с объектно-ориентированной концепцией из любого языка, его поддерживающего. COM — это тоже Windows-specific технология (использует такие специфичные для Windows вещи, как реестр).

В приложении на Direct3D используются указатели на интерфейсы объектов. Работа с объектом осуществляется путём вызова методов его интерфейса. Например, интерфейс так называемого device-а (device в Direct3D — это контекст выполнения для конкретного окна), имеет название (примеры для Direct3D 9) IDirect3DDevice9, для объекта текстуры — IDirect3DTexture9, и т.д. Создание объектов происходит как вызовы методов интерфейса IDirect3DDevice9, например, для текстуры это будет IDirect3DDevice9::CreateTexture.

В Direct3D 10 произошло значительное количество изменений. Direct3D 10 не является обратно совместимым с Direct3D 9. Т.е. чтобы перенести программу на новый API потребуется переписать весь код, относящийся к рендерингу. Подробнее о Direct3D 10 ниже.

OpenGL использует обычные функции языка C. Для них существует стандартизированный ABI, а это значит, что OpenGL может быть использован из любого языка, который поддерживает вызов функций native библиотек (т.е., практически говоря, из любого вообще).

В OpenGL используется так называемая машина состояний (конечный автомат). Результат вызовов функций OpenGL зависит от внутреннего состояния, и может изменять его. В OpenGL, чтобы получить доступ к конкретному объекту (например, текстуре), нужно сначала выбрать его в качестве текущего функцией glBindTexture, а затем уже можно влиять на объект, например, задание содержимого текстуры осуществляется вызовом glTexImage2D.

Аналогом концепции device-а в Direct3D здесь является контекст. Контекст OpenGL привязан к конкретному окну, так же, как и device в Direct3D.

Общим для двух API является то, что обе не предоставляют чего либо за пределами работы с графикой. А именно, нет функций ни для создания окна, ни для работы с вводом с клавиатуры/мыши, ни для работы со звуком (здесь я не затрагиваю другие части DirectX, такие как DirectInput и DirectSound). Т.е. они не являются библиотеками высокого уровня.

В самой упрощённой форме можно сказать так: OpenGL и Direct3D позволяют рисовать треугольники. И всё. Суть в том, что треугольники можно рисовать очень по-разному (текстуры, освещение, преобразования, и т.д.).

Самое важное различие

Имя ему — расширения (extensions).

Direct3D по сути фиксирован в пределах одной мажорной версии. Какие-либо изменения/дополнения происходят только при выпуске следующей версии.

В OpenGL реально доступное API определяется производителем GPU. Реализация OpenGL позволяет определять расширения к основной спецификации. Приложение может получить список поддерживаемых расширений во время выполнения, и проверить на доступность те, которые оно желает использовать.

На самом деле практически весь функционал OpenGL — это расширения. Развитие OpenGL идёт так: появляется новая фишка, производитель реализовывает её в своём драйвере и документирует доступное расширение. Приложения могут использовать новые функции прямо сейчас, не дожидаясь включения в официальную спецификацию. Если это расширение специфично для конкретного производителя, то в названии оно несёт его имя (например, вот так: GL_NV_point_sprite, где NV — значит nVidia). Если расширение реализовано многими вендорами, то в названии используется EXT (например, GL_EXT_draw_range_elements).

Со временем, если расширение широко используется, оно стандартизируется в ARB, и после этого содержит в имени ARB (например, GL_ARB_vertex_buffer_object). Такое расширение имеет официальный статус.

Самые важные расширения со временем становятся частью основной спецификации. Каждая новая версия OpenGL — это по сути старая версия+несколько новых интегрированных расширений. При этом новые функции продолжают быть доступными как расширения. Т.е. на самом деле с точки зрения программы может быть вообще всё равно, какая версия OpenGL. Главное — какие доступны расширения. Версия OpenGL — это просто способ указать, какой набор расширений гарантированно поддерживается.

Что нового в Direct3D 10/11 и OpenGL 3.x

Microsoft сделали радикальную переработку API в Direct3D 10. Сейчас оно имеет более унифицированный и современный вид. Были выброшены некоторые устаревшие вещи, такие как fixed function rendering (без использования шейдеров). Ещё был выполнен переход к новой модели работы драйвера. В частности, реализация Direct3D теперь может иметь не только kernel-space часть, а и user-space. Это позволяет экономить время на переключения user-space/kernel-space. Однако, из-за новой модели драйвера, Direct3D 10 и выше недоступен на Windows XP. Учитывая всё ещё большую популярность Windows XP, это довольно грустно.

Реализация OpenGL изначально была разделена на user-space и kernel-space части, так что там такой проблемы и не было. Ещё различие в том, что до сих пор не вносилось изменений в OpenGL API, которые не были бы обратно совместимы. Каждое нововведение — это расширение.

Функционал, появившийся в Direct3D 10, например, геометрические шейдеры, доступен в OpenGL на любой платформе через расширение, или, начиная с OpenGL 3.2, как часть основной спецификации. Стоит особо подчеркнуть, это важно, функционал Direct3D 10/11 доступен в OpenGL на любой платформе, в том числе и Windows XP. Таким образом у многих сложилось впечатление, что Direct3D 10 не доступен на Windows XP исключительно по политическим причинам, а не из-за каких-то реальных технических проблем. Впрочем, я не могу судить здесь, сохраняя нейтральный тон, о том, были ли действительно такие проблемы при введении новой модели видео-драйверов.

Теперь о нововведениях в OpenGL 3.x. Начиная с OpenGL 3.0 появилась так называемая deprecation model. Часть старой функциональности, относящаяся к fixed function rendering, а также к рендерингу, основанному на glBegin/glEnd, и многие другие устаревшие и неактуальные вещи, были объявлены как deprecated, и были впоследствии удалены из основной спецификации OpenGL 3.1. Это позволяет сохранять основную спецификацию в актуальной и современной форме.

Казалось бы, это должно сломать совместимость со старыми программами. Ведь раньше, когда программа создавала контекст OpenGL, она просто получала контекст версии максимально доступной. Это было ОК, т.к. новые версии всегда являлись надстройками над предыдущими. Чтобы избежать нарушений совместимости, программы, которые хотят получить контект OpenGL 3.x должны использовать новый метод создания контекста, который позволяет указать, какую именно версию OpenGL нужно получить.

Но, как следует из того, что уже было написано раньше про расширения, и это важно, функционал OpenGL 3.x можно получить через расширения, не создавая контекст новым методом. Т.е. OpenGL 1.1 + расширения = OpenGL 3.2! Таким образом, сохраняется полная обратная совместимость. Например, геометрические шейдеры — это расширение GL_ARB_geometry_shader4.

Распространённые заблуждения

OpenGL отстаёт от Direct3D, и вообще, судя по таким вялым изменениям в спецификации, наверное уже совсем мёртв.

Собственно, причина такого заблуждения — это незнание о расширениях. Вообще говоря, OpenGL может и часто опережает (!) Direct3D в плане инноваций, т.к. производитель может добавить расширение к OpenGL, не дожидаясь никого, в то время как в Direct3D изменения может внести только Microsoft.

OpenGL — это для программ профессиональной графики, а Direct3D — это для игр.

Это заблуждение имеет историческую причину. OpenGL исходно разрабатывался как библиотека 3D графики, которая МОЖЕТ, но НЕ ОБЯЗАНА ускоряться аппаратно. Это также объясняет наличие некоторых функций, например рендеринг стерео-изображений, которые не нужны играм. Direct3D же разрабатывался гораздо позже, сразу с расчётом на ускорение на GPU. В момент появления многих пакетов профессиональной работы с графикой Direct3D просто не было.

Интересные нюансы

Microsoft поставляет вместе с Windows драйверы без поддержки OpenGL. OpenGL будет рендерить без ускорения, или эмулироваться через DirectX. Так что, если нужна поддержка OpenGL под Windows, нужно ставить драйвер с сайта производителя. Причины для такого неприятия OpenGL, скорее всего, опять чисто политические.

Так что же делать, как жить?

Примечание: А вот эта часть носит весьма субъективный характер.

Если Вы — разработчик, и решаете, какое API использовать, то задумайтесь над следующим:
За OpenGL — массовая кроссплатформенность, в частности, доступность всех новых функций и на Windows XP, где Direct3D 10/11 нет, и никогда не будет.
Против OpenGL — драйвера в Windows из коробки не имеют поддержки OpenGL, так что ставить их нужно с сайта производителя.

Если Вы — новичок в разработке 3D-приложений, и желаете освоить эту область, то я бы рекомендовал сделать так: сначала разобраться с Direct3D (причина тому проста — Microsoft предоставляет очень качественный SDK), а затем разобраться с OpenGL (это будет очень просто после Direct3D). К сожалению, такой вещи, как SDK, для OpenGL нет. Поэтому осваивать с нуля будет сложнее.

Читайте также: