Введение. Основы работы с Direct3D
Для того чтобы составить свою первую программу под DirectX9, необходимо установить DirectX9 SDK (Software Development Kit) на своём компьютере. DirectX9 SDK можно взять с сайта Microsoft c этой страницы:
Microsoft DirectX 9.0 Downloads.
SDK представляет собой набор необходимых компонент для работы с DirectX. В него входят заголовочные файлы, статические библиотеки, документация, примеры, а так же сам DirectX (runtime). DirectX представляет собой набор COM объектов. Каждый объект отвечает за свою работу. Это может быть: работа с графикой, со звуком, с сетью и т.д.
Нас интересует работа с 3D графикой. За это отвечает Direct3D.
В этом уроке мы попробуем создать несложное windows приложение на С++, использующее Direct3D.
Некоторые понятия о работе 3D приложения.
Обычные приложения, осуществляющие вывод 3D графики имеют такую структуру:
Вначале происходит инициализация. Сюда входит создание главного окна приложения, инициализация Direct3D, инициализация неких данных, нужных приложению и т.п. Инициализация Direct3D у нас будет в функции InitD3D().
Como ativar DirectDraw, Direct3D e Textura AGP (Windows 7)
Далее осуществляется вывод самой графики (render). Рендер 3D приложения обычно повторяется в цикле. Например, у нас будет функция DrawScene(), которая будет постоянно вызываться, в ней и будет происходить вывод 3D объектов.
В конце, необходимо освободить (уничтожить) все задействованные нами ресурсы и закончить работу приложения. Перед выходом также нужно освободить объекты, относящиеся к Direct3D. Это мы сделаем в функции ReleaseD3D();
Объявление этих трёх функций мы поместим в заголовочный файл firstD3D.h
// firstD3D9.h bool InitD3D( HWND hWnd); long DrawScene( ); void ReleaseD3D( );
Построение windows приложения для нашего примера, то есть то, что относится не к Direct3D, а к созданию главного окна приложения и обработке windows сообщений, возьмём из этого урока: Работаем с MS Visual Studio.
Инициализация.
Direct3D представляет собой несколько интерфейсов. Каждый интерфейс также отвечает за отдельные части в Direct3D. Например, есть интерфейс для работы с текстурами, интерфейс для работы с вершинными буферами, вершинными шейдерами и т.д. Работа осуществляется через методы (функции), предоставляемые интерфейсами.
Чтобы работать с Direct3D, необходимо включить заголовочный файл d3d9.h:
#include
Кроме того, подключите статическую библиотеку d3d9.lib
Самый основной интерфейс называется IDirect3D9.
Вообще в DirectX-е принято все названия интерфейсов начинать с «I», далее следует название COM объекта, в нашем случае — Direct3D. Девятка в конце означает номер версии DirectX-а. Все интерфейсы Direct3D достаются из этого основного IDirect3D9. Только сам IDirect3D9 создаётся обычной функцией:
IDirect3D9 * pD3D; pD3D = Direct3DCreate9( D3D_SDK_VERSION);
Здесь D3D_SDK_VERSION — обычный макрос, определённый в d3d9.h, указывающий на текущую версию SDK.
ЧТО ТАКОЕ DirectX | Зачем нужен DirectX и как определить версию DirectX
Приведённая функция возвращает указатель на интерфейс IDirect3D9. Если функция вернула NULL, значит, скорее всего, Direct3D 9-й версии не установлен на компьютер пользователя вашего приложения. Если же она вернула значение отличное от нуля — это значение и есть указатель на интерфейс IDirect3D9.
Второй по значимости интерфейс является интерфейсом устройства, называется он IDirect3DDevice9. Этот интерфейс всегда создаётся вторым после IDirect3D9. Отвечает он за вывод изображения, за создание ресурсов, создание шейдеров и т.п. Неудивительно, что этот интерфейс предоставляет самое большое количество методов.
IDirect3DDevice9 создаётся методом IDirect3D9::CreateDevice(). Вот описание параметров этого метода:
HRESULT CreateDevice(
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS *pPresentationParameters,
IDirect3DDevice9** ppReturnedDeviceInterface
);
Парметры:
Adapter — выставляйте в D3DADAPTER_DEFAULT.
DeviceType — тип устройства. От установки этого параметра будет зависеть, используете ли вы акселерацию видео карты — или нет. Значение D3DDEVTYPE_HAL, означает, что мы будем пользоваться возможностями видеокарты для вывода геометрии, что ускорит работу графического приложения.
hFocusWindow -выставляется handle окна. В нашем случае — это главное окно приложения.
BehaviorFlags — здесь можно указать, как обрабатываются вершины: видеокартой или программно. Если ваша карта поддерживает акселерацию для обработки вершин — используйте D3DCREATE_HARDWARE_VERTEXPROCESSING, если нет — попробуйте D3DCREATE_SOFTWARE_VERTEXPROCESSING или D3DCREATE_MIXED_VERTEXPROCESSING.
Основное место в методе CreateDevice() занимает объект структуры D3DPRESENT_PARAMETERS. Рассмотрим нужные нам элементы этой структуры:
Windowed — выставляем здесь TRUE, если наше приложение оконное, а не на весь экран.
BackBufferFormat — Формат для back буфера. Это специальный буфер, в котором формируется изображение, после того как изображение готово, этот буфер показывается в окне приложения. Здесь выставляем D3DFMT_UNKNOWN, поскольку наше приложение оконное, то формат возьмётся автоматически в соответствии с текущими настройками экрана.
SwapEffect — Здесь D3DSWAPEFFECT_DISCARD. Это значение полезно выставлять, пока вы только начинаете разрабатывать свою программу. Буфер заполняется шумом, если вы забудете сделать нужные операции по работе с выводом объектов, то вы увидите этот шум, что укажет вам на ошибку, то есть это полезно для режима debug.
Последний параметр ppReturnedDeviceInterface в методе CreateDevice() — есть результат этого метода, собственно здесь вы получаете указатель на интерфейс IDirect3DDevice9.
В итоге имеем функцию инициализирующую Direct3D:
IDirect3D9 * pD3D; IDirect3DDevice9 * pDevice; bool InitD3D( HWND hWnd) < // Создание объекта Direct3D pD3D = Direct3DCreate9( D3D_SDK_VERSION); if( !pD3D) return false; // Создание устройства рендера. D3DPRESENT_PARAMETERS d3dpp = 0>; d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; HRESULT hr; hr = pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, pDevice ); if( FAILED( hr) || !pDevice) return false; return true; >
Поскольку каждый кадр строится заново, вам необходимо вначале очистить экран функцией
pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,128), 1.0f, 0);
Из всех параметров, сейчас нас интересуют только следующие:
D3DCLEAR_TARGET — говорит о том, что мы будем очищать буфер цвета, то есть содержащий саму картинку.
D3DCOLOR_XRGB(0,0,128) — это макрос для синего цвета, то есть фактически мы будем не очищать буфер цвета, а заполнять его указанным синим цветом.
В Direct3D есть такое понятие как Сцена (scene). В сцену входят со своими свойствами все 3D объекты, которые вы собираетесь отобразить в окне приложения. Перед началом вывода сцены, необходимо вызвать специальный метод:
pDevice->BeginScene();
соответственно, после того, как вы отобразили сцену, вызвать метод:
pDevice->EndScene();
То есть, вывод всех объектов, должен происходить между этими двумя функциями.
Поскольку всё изображение формируется в невидимом буфере (backbuffer), необходимо после формирования изображения показать этот буфер. Для этого, нужно вызвать метод:
pDevice->Present( NULL, NULL, NULL, NULL );
Итак, мы получили функцию DrawScene(), которая отвечает за рендер сцены:
long DrawScene( ) < pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0,0,128), 1.0f, 0 ); pDevice->BeginScene( ); DrawObject( ); pDevice->EndScene( ); pDevice->Present( NULL, NULL, NULL, NULL ); return 0; >
Здесь функция DrawObject(); отвечает за вывод некоторого объекта (рассмотрим ниже).
Завершение работы с Direct3D.
Освобождение объектов Direct3D происходит перед выходом из вашей программы. Осуществляется это методом Release(), предоставленным каждым интерфейсом объектов Direct3D. Заметьте, что освобождение объектов происходит в обратной последовательности по отношению к последовательности, в которой они создавались. То есть, если вы попытаетесь освободить объект Direct3D раньше, чем объект Direct3DDevice, то это будет неверно.
Получаем функцию, которую вызываем перед завершением программы:
void ReleaseD3D( ) < if( pDevice) pDevice->Release( ); if( pD3D) pD3D->Release( ); >
Страницы: 1 2 Следующая »
30 мая 2002 (Обновление: 13 июня 2009)
Источник: gamedev.ru
Direct3D
Direct3D — это низкоуровневый API для рисования примитивов с конвейером отрисовки или для выполнения параллельных операций с шейдером вычислений. Дополнительные сведения см. в приведенном ниже содержимом.
Сведения о получении и установке Direct3D см. в разделе о настройке среды программирования Direct3D 12.
В этом разделе
Начало работы с Direct3D | Подробно описывает Direct3D, различные модели приложений, разные версии, отрисовку и вычисления. |
Графика Direct3D 12 | Direct3D 12 предоставляет API и платформу, которая позволяет приложению использовать преимущества графических и вычислительных возможностей компьютеров, оснащенных одним или несколькими gpu, совместимыми с Direct3D 12. |
Графика Direct3D 11 | Вы можете использовать графику Microsoft Direct3D 11 для создания трехмерной графики для игр и научных и классических приложений. |
DXGI | DXGI обрабатывает перечисление графических адаптеров, перечисление режимов отображения, выбор форматов буферов, совместное использование ресурсов между процессами и представление отрисованных кадров в окно или монитор для отображения. |
HLSL | HLSL — это высокоуровневый язык шейдера для DirectX. С помощью HLSL можно создавать программируемые шейдеры C для конвейера Direct3D. |
DDS | Формат файлов поверхности DirectDraw (DDS) поддерживает несжатые и сжатые (DXTn) текстуры, MIP-карты, карты кубов и карты томов. Он поддерживается DirectXTex, DirectXTK, устаревшими средствами D3DX и другими средствами DirectX. |
Источник: learn.microsoft.com
Какую функцию выполняет Direct3D?
Доброго дня вам, мои уважаемые читатели. Я подготовил для вас очередной сюрприз в виде рассказа о Direct3D, который заинтересует не только геймеров, но и всех желающих разобраться в вопросе: каким образом на плоском экране монитора создается полное ощущение объемного пространства. Когда утверждают, что за графику в современных играх отвечает Директ Икс – это не совсем корректно. Данный многофункциональный API комплексно решает более глобальные задачи, связанные с со всем мультимедийным контентом. А вот Direct3D (D3D) как раз является составляющим элементом DirectX, отвечающим именно за трехмерную графику.
История, о которой многие не знают
Можно сказать что DirectX появился благодаря D3D. Дело в том, что до 1995 года Microsoft для работы с изображениями пользовался сторонним продуктом OpenGL. И желание создать собственный графический API, подтолкнуло их к разработке Direct 3D и проекта Директ Икс в целом. Но справедливости ради надо отметить, что работы велись не с чистого листа.
Дело в том, что еще в 1992 компания RenderMorphics, основанная и Дугом Рабсоном и Серваном Кеонджяном, добилась серьезных успехов при создании API-интерфейса для медицинского оборудования. Их детище, названное Reality Lab, эффективно выполняло задачи связанные с САПР и 3D визуализацией. Майкрософт вовремя купил эту компанию, и теперь ее основатели, представляющие наибольшую интеллектуальную ценность, уже трудились над графическим движком для Виндовс 95. А уже в июне 1996 появилась первая DirectX версии 2.0, имевшая в своей комплектации первый полноценный Direct3D 2.0.
Прогресс технологий 3Д визуализации
Естественно, что прогресс не стоял на месте. Конструкторы компьютерного железа предлагали новые решения, постоянно наращивая мощность, быстродействие, количество процессорных ядер и объемы памяти. Вслед за ними стремились и программисты, оптимизирующие и совершенствующие Direct3D. Дальше я кратко представлю эволюцию D3D:
- Версия 3.0 появилась спустя 116 дней после премьеры Direct3D;
- четвертая версия ничем существенным не порадовала и даже была отменена.
- новинка 5.0 отличилась тем, что было введено разделение на два режима Immediate (непосредственный) и Retained (сохраненный). Они требуют отдельного внимания, и я уделю его позже.
- в 1998 отметился прорывом в технологиях компьютерного железа и D3D 6.0 обеспечил взаимодействие с ним;
- 7.0 предложил обновленный формат .dds и задействовал аппаратную память для вершинных буферов;
- Direct 3D 8.0 впервые показал возможности работы с шейдерами;
- Директ 3Д 9.0 одна из самых стабильных версий, где работа с шейдерами получила максимум оптимизации и получила высокоуровневый язык описания процессов. И вообще здесь был ряд инновационных новинок для работы с 3D графикой;
- множество вариаций 10-ой и 11-ой версий отличились постоянными доработками, связанными с выходом новых операционок, игровых консолей и более современного железа (обо всем и не напишешь);
- самой актуальной на сегодня является Direct 3D 12.0. О ней я расскажу немного подробнее.
Direct 3D 12.0 – вершина технологии трехмерной графики
Двенадцатый Директ Х вместе с D3D 12 были представлены в 2015 году в качестве серьезной поддержки Windows 10. Поэтому разработчики реализовали в этом системном API все имеющиеся на тот момент возможности для создания 3D изображений:
- оптимизация кода, функций и алгоритмов выразилась в существенном увеличении производительности;
- новый подход к использованию многоядерных CPU и GPU и современных графических ускорителей;
- видеокарты от разных производителей теперь получили возможность работы в совместном режиме;
- снизился уровень аппаратного абстрагирования;
- консервативная растеризация оптимизировала процесс определения столкновения и отсечения объектов;
- в целом появился инструмент, позволяющий создавать сцены и эффекты высокой сложности
Обычно, новая Direct 3D, не слишком дружелюбна к старому железу. Но здесь разработчики постарались, чтобы обладатели старых видеокарт хоть в какой-то степени ощутили прелести 12-й версии. Это достигается за счет работы отдельно взятых функций и позволяет говорить о частичной поддержке D3D 12.
Перечень GPU, поддерживаемых «двенадцаткой», выглядит так: Intel (Haswell, Broadwell, Skylake), Qualcomm, Nvidia GeForce и AMD Radeon. Понятно, что этой чести удостоились не все, а только самые последние и наиболее производительные представители.
Не забыл Microsoft и о современных гаджетах. Теперь Direct 3D стала родной не только для ПК на Виндовс 10 и консоли Xbox One, но и для планшетов и смартфонов.
Как работает Direct 3D?
Как же работает Директ 3 D? И за счет чего из набора данных образуется картинка виртуальной реальности? Для этого необходимо себе представить инструменты, находящиеся в распоряжении D3D и здесь я вернусь к его режимам.
Immediate Mode (непосредственный) отвечает за аппаратную поддержку, и позволяет разработчику минимально зависеть от используемого ПО. Так же в этом режиме графические примитивы реализуются, минуя буферы выполнения.
А уже за создание самой картинки отвечает сохраненный режим Retained Mode. С его помощью осуществляется программная обработка с помощью множество алгоритмов и методов обработки, среди которых:
- Z- и W –буферизация;
- буфер трафарета;
- пространственное сглаживание;
- смешивание цветов и текстур;
- альфа-смешивание;
- mipmapping;
- отсечение и отбраковка;
- перспективное текстурное картирование;
- имитация атмосферных эффектов;
- работа с программируемыми HLSL-шейдерами.
Помимо этого имеется и активная интеграция с другими элементами DirectX и технологиями.
Как формируется изображение?
Некоторые вышеописанные «приемы» D3D могут использоваться на нескольких стадиях обработки. Давайте рассмотрим этот сложный вычислительный процесс создания картинки:
- Чтобы описать объект в цифровом виде его сначала необходимо смоделировать. Делается это с помощью триангуляции – разбивки большой сложной поверхности на отдельные плоские треугольники. Координаты каждого их них можно описать математически. Что в свою очередь позволяет применять к ним алгоритм пересчета местоположения при перемещении, деформации или разделении.
- Дальше происходит текстурирование – на поверхность одевается «одежда», представляющая собой рисунок (заливку) с определенными свойствами. Она может иметь шероховатость, быть с определенной прозрачностью или зеркальностью (в стекле, например эти свойства совмещаются).
- В сцене с готовыми моделями расставляется освещение, определяется яркость поверхностей. Так же здесь может учитываться видимость предметов с учетом их отдаленности.
- Когда статическая комбинация готова в работу включаются программы имитирующие перемещение и взаимодействие объектов между собой. А так же с природными и прочими фантастическими силами.
- Далее настает очень ответственный момент. Когда вся объемная картинка как бы фотографируется и получается ее плоское изображение. Этот процесс называется рендеринг. И сложность его заключается в том, что все происходит путем математического расчета лучей, идущих от каждого элемента (пикселя) трехмерной сцены. Вычисление производится для каждого кадра. И теперь вы должны понимать, какой мощностью должна обладать видеокарта, чтобы обработать 4K графику с частотой 60 fps. Многие игры поддерживают стерео режим, поэтому rendering производится сразу для двух рядом расположенных точек.
- Кроме того в процессе рендеринга так же производится дополнительная обработка изображения — композитинг (делать это на данной стадии намного целесообразнее).
Готовые кадры отправляются в буфер видеопамяти. А от туда, непрерывным цифровым потокам на экран, где мы воспринимаем их уже как красивый захватывающий сюжет.
Все, дорогие друзья.
Я с чувством выполненного долга заканчиваю свой рассказ о Direct3D.
На этом я с вами прощаюсь, но только до новых встреч.
Источник: profi-user.ru
Ускорение Direct 3D или DirectDraw недоступно в Windows 11
Некоторые пользователи Windows сообщают, что они сталкиваются с проблемами при доступе к ускорению Direct 3D или DirectDraw на своих ПК с Windows 11/10. В этой статье мы подробно расскажем, из-за чего эта функция может быть недоступна для вас в некоторых случаях и как вы можете решить эту проблему. Наиболее частыми жертвами этой проблемы являются пользователи приложений Windows с интенсивным использованием графики, геймеры и пользователи сортировщика.
Что такое Direct 3D, DirectDraw или DirectX?
Прежде чем мы начнем, позвольте мне кратко ознакомить вас с несколькими терминами:
- Direct3D — это Windows API, который помогает отображать трехмерную графику в приложениях, требующих высокой производительности. Утилита может сделать это с помощью аппаратного ускорения, если это поддерживает видеокарта. Короче говоря, он предлагает большую помощь в использовании приложений более высокого уровня с точки зрения графики. Вы можете узнать, поддерживает ли ваш компьютер Direct3D, запустив инструмент диагностики DirectX.
- DirectDraw устарел. Теперь это подмножество DirectX.
- DirectX содержит Direct3D, который является основной частью DirectX для обработки графики. Он связан с DirectX API и помогает отображать 2D-графику в любой программе на компьютере с Windows.
Почему ускорение Direct3D и DirectDraw недоступно в Windows?
- Аппаратное обеспечение вашего ПК может не соответствовать минимальным требованиям для загрузки конкретной 3D-графики.
- Ускорение DirectDraw отключено или не установлено на вашем ПК
- Вашему видеоадаптеру не хватает памяти
- Последняя версия DirectX, загруженная на ваш компьютер, была прервана или повреждена.
Ускорение Direct3D и DirectDraw недоступно на ПК с Windows
Здесь обсуждается проблема, когда на вашем ПК отображается сообщение о том, что Direct3D или DirectDraw недоступны, и вот как вы можете исправить это.
- Убедитесь, что ускорение Direct3D и DirectDraw включено
- Включить аппаратное ускорение
- Перезагрузите Windows в состоянии чистой загрузки
- Включите устаревшую версию DirectPlay на панели управления
1]Убедитесь, что ускорение Direct3D и DirectDraw включено.
Прежде чем приступить к маневрированию, лучше всего убедиться, что настройка включена или нет. Вот как это сделать:
- Откройте диалоговое окно «Выполнить» и введите там команду «dxdiag».
- Это откроет средство диагностики DirectX. В списке вкладок вверху выберите Показать.
- Здесь, в разделе функций DirectX, вы найдете ускорение Direct3D и DirectDraw. Убедитесь, что рядом с ними написано Доступно
- Если это не так, вы можете приступить к реализации изменений, о которых говорится ниже.
Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)
Если вы обнаружите, что ни один из этих вариантов не означает, что они доступны. приступайте к выполнению следующих действий.
2]Включить аппаратное ускорение
Вот как можно включить аппаратное ускорение на ПК с Windows:
- Откройте диалоговое окно «Выполнить» и введите «desk.cpl». Это откроет настройки рабочего стола. Прокрутите вниз и нажмите Расширенные настройки дисплея.
- В этом отдельном окне вы увидите параметр «Свойства адаптера дисплея для отображения». Нажмите здесь
- В диалоговом окне свойств графики выберите вкладку Устранение неполадок, если вы не видите эту вкладку, обновите драйверы и повторите попытку.
- Здесь выберите «Изменить настройки» и в следующем диалоговом окне отрегулируйте ползунок «Аппаратное ускорение».
- Чтобы включить ускорение Direct3D, вы можете увеличить его.
3]Перезагрузите Windows в состоянии чистой загрузки.
Если на утилиту DirectDraw влияет сторонняя служба, это также может вызвать эту проблему. Решением является перезагрузка Windows на вашем компьютере только с помощью служб Microsoft. Вот как:
- Откройте диалоговое окно «Выполнить» и введите команду «msconfig», чтобы открыть окно «Конфигурация системы Microsoft».
- Выберите здесь вкладку «Службы» и установите флажок «Скрыть все службы Microsoft» в правом нижнем углу.
- Теперь нажмите «Отключить все», затем «Применить» и, наконец, «ОК», чтобы перезагрузить систему только со службами Windows 10.
5 Подождите, пока процесс завершится, и проверьте, можете ли вы теперь использовать службы DirectPlay или нет.
4]Включите устаревшую версию DirectPlay на панели управления.
- Откройте панель управления, нажмите «Просмотр по категориям» и выберите «Программы».
- Далее выберите «Программы и компоненты» и из опций слева от вас выберите «Включение или отключение компонентов Windows».
- Это откроет отдельное диалоговое окно со списком параметров, найдите здесь устаревшие компоненты и разверните его, чтобы просмотреть DirectPlay.
- Установите флажок DirectPlay и примените эти изменения, чтобы разрешить установку DirectPlay на ваш компьютер.
Это должно помочь вам решить проблему с вашими утилитами Direct3D и DirectDraw.
Как мне проверить свой уровень функций DirectX?
Распространенная ошибка, с которой сталкивается DirectX, — это когда вашему движку требуется обновление функции. В таких случаях вам, возможно, придется выяснить, на каком уровне находится ваша функция DirectX, чтобы вы могли найти соответствующее обновление уровня функции. Вот как это сделать:
- Откройте диалоговое окно «Выполнить» и выполните здесь команду dxdiag.
- Это откроет средство диагностики DirectX. На вкладке по умолчанию «Система» находится вся системная информация.
- В нижней части свойств вашей системы указана версия DirectX. Это ваш уровень возможностей DirectX
Это наиболее часто применимое решение проблемы, когда ускорение Direct3D и DirectView недоступно на вашем ПК. Если ни один из них не работает, вы также можете попробовать получить доступ к утилите из новой учетной записи пользователя. Мы надеемся, что эта статья помогла вам и что теперь вы можете использовать функции набора инструментов DirectX.
.
Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)
Источник: okzu.ru
Сравнение OpenGL и Direct3D
Очень часто встречаются различные заблуждения по поводу этих двух 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 нет. Поэтому осваивать с нуля будет сложнее.
Вот вроде и всё. Успехов в разработке!
Источник: habr.com