Планирование порта из OpenGL ES 2.0 в Direct3D
Важные API
Если вы переносите игру с платформ iOS или Android, вероятно, вы внесли значительные инвестиции в OpenGL ES 2.0. При подготовке к перемещению базы кода графического конвейера в Direct3D 11 и среда выполнения Windows необходимо учитывать несколько действий перед началом работы.
Большинство усилий по переносу обычно с участием первоначальной прогулки по базе кода и сопоставлению общих API и шаблонов между двумя моделями. Этот процесс будет немного проще, если вам потребуется некоторое время для чтения и просмотра этой статьи.
Ниже приведены некоторые моменты, которые следует учитывать при переносе графики из OpenGL ES 2.0 в Direct3D 11.
Заметки о конкретных поставщиках OpenGL ES 2.0
Разделы о переносе в этом разделе ссылаются на реализацию спецификации OpenGL ES 2.0, созданной группой Khronos. Все примеры кода OpenGL ES 2.0 были разработаны с помощью Visual Studio 2012 и базового синтаксиса Windows C. Если вы поступаете из базы кода Objective-C (iOS) или Java (Android), помните, что предоставленные примеры кода OpenGL ES 2.0 могут не использовать аналогичный синтаксис или параметры вызова API. Это руководство пытается оставаться как можно более не зависят от платформы.
В этой документации используются только API спецификации 2.0 для кода и ссылки OpenGL ES. Если вы переносите из OpenGL ES 1.1 или 3.0, это содержимое по-прежнему может оказаться полезным, хотя некоторые из примеров кода OpenGL ES 2.0 могут быть незнакомы.
Примеры Direct3D 11 в этих разделах используют Microsoft Windows C++ с расширениями компонентов (CX). Дополнительные сведения об этой версии синтаксиса C++ см. в visual C++, расширениях компонентов для платформ среды выполнения и кратком справочнике (C++\CX).
Общие сведения о требованиях к оборудованию и ресурсах
Набор функций обработки графики, поддерживаемых OpenGL ES 2.0, примерно сопоставляется с функциями, предоставляемыми в Direct3D 9.1. Если вы хотите воспользоваться более сложными функциями, предоставляемыми в Direct3D 11, ознакомьтесь с документацией Direct3D 11 при планировании порта или просмотрите разделы порта с DirectX 9 на универсальная платформа Windows (UWP) при выполнении первоначальных усилий.
Чтобы упростить первоначальное переносирование, начните с шаблона Visual Studio Direct3D. Он предоставляет базовый отрисовщик, уже настроенный для вас, и поддерживает функции приложения UWP, такие как восстановление ресурсов в изменениях окна и уровнях функций Direct3D.
Общие сведения об уровнях функций Direct3D
Direct3D 11 обеспечивает поддержку аппаратных "уровней компонентов" от 9_1 (Direct3D 9.1) для 11_1. Эти уровни функций указывают на доступность определенных графических функций и ресурсов. Как правило, большинство платформ OpenGL ES 2.0 поддерживают набор функций Direct3D 9.1 (уровень компонентов 9_1).
Просмотр графических функций и API DirectX
Семейство API | Description |
---|---|
DXGI | Инфраструктура графики DirectX (DXGI) предоставляет интерфейс между графическим оборудованием и Direct3D. Он задает адаптер устройства и конфигурацию оборудования с помощью интерфейсов COM IDXGIAdapter и IDXGIDevice1. Используйте его для создания и настройки буферов и других ресурсов окна. В частности, шаблон фабрики IDXGIFactory2 , используемый для получения графических ресурсов, включая цепочку буферов буферов (набор буферов кадров). Так как DXGI владеет цепочкой буферов, интерфейс IDXGISwapChain1 используется для представления кадров на экране. |
Direct3D | Direct3D — это набор API,которые предоставляют виртуальное представление графического интерфейса и позволяют рисовать графику с помощью этого интерфейса. Версия 11, примерно сравнима с функцией OpenGL 4.3. (С другой стороны, OpenGL ES 2.0 аналогичен DirectX9, функции и OpenGL 2.0, но с конвейером унифицированного шейдера OpenGL 3.0. Большая часть тяжелого подъема выполняется с интерфейсами ID3D11Device1 и ID3D11DeviceContext1, которые обеспечивают доступ к отдельным ресурсам и подресурсам и контексту отрисовки соответственно. |
Direct2D | Direct2D предоставляет набор API для отрисовки gpu с ускорением 2D. Его можно считать аналогичным в целях OpenVG. |
DirectWrite | DirectWrite предоставляет набор API-интерфейсов для отрисовки шрифтов с ускорением GPU. |
DirectXMath | DirectXMath предоставляет набор API и макросов для обработки общих линейных алгебр и тригонометрических типов, значений и функций. Эти типы и функции предназначены для работы с Direct3D и его операциями шейдера. |
DirectX HLSL | Текущий синтаксис HLSL, используемый шейдерами Direct3D. Он реализует модель шейдера Direct3D 5.0. |
Просмотрите API-интерфейсы среда выполнения Windows и библиотеку шаблонов
API-интерфейсы среда выполнения Windows предоставляют общую инфраструктуру для приложений UWP. Просмотрите их здесь.
К ключевым среда выполнения Windows API, используемым при переносе графического конвейера, относятся:
- Windows::UI::Core::CoreWindow
- Windows::UI::Core::CoreDispatcher
- Windows::ApplicationModel::Core::IFrameworkView
- Windows::ApplicationModel::Core:CoreApplicationView
Кроме того, библиотека шаблонов C++ (WRL) среда выполнения Windows C++ — это библиотека шаблонов, которая предоставляет низкоуровневый способ создания и использования компонентов среда выполнения Windows. API Direct3D 11 для приложений UWP лучше всего используются в сочетании с интерфейсами и типами в этой библиотеке, такими как смарт-указатели (ComPtr). Дополнительные сведения о WRL см. в среда выполнения Windows библиотеке шаблонов C++ (WRL).
Изменение системы координат
Одно из различий, которое иногда путает усилия раннего порта, является изменение традиционной системы координат OpenGL правой стороны на систему координат Direct3D по умолчанию. Это изменение в моделировании координат влияет на многие части игры, от настройки и настройки буферов вершин до многих математических функций матрицы. Ниже перечислены два наиболее важных изменения, которые необходимо внести:
- Переверните порядок вершин треугольника, чтобы Direct3D пересекает их по часовой стрелке с передней стороны. Например, если вершины индексируются как 0, 1 и 2 в конвейере OpenGL, передайте их в Direct3D как 0, 2, 1.
- Используйте матрицу представления для масштабирования мирового пространства на 1,0f в направлении z, эффективно возвращая координаты оси Z. Для этого переверните знак значений на позициях M31, M32 и M33 в матрице представления (при переносе значения в тип матрицы ). Если M34 не равен 0, также перевернуть его знак.
Однако Direct3D может поддерживать правую систему координат. DirectXMath предоставляет ряд функций, которые работают как в системах координат с левой, так и правой рукой. Их можно использовать для сохранения некоторых исходных данных сетки и обработки матриц. К ним относятся:
Функция матрицы DirectXMath | Description |
---|---|
XMMatrixLookAtLH | Создает матрицу представления для левой системы координат с помощью позиции камеры, направления вверх и фокуса. |
XMMatrixLookAtRH | Создает матрицу представления для правой системы координат с помощью позиции камеры, направления вверх и фокуса. |
XMMatrixLookToLH | Создает матрицу представления для левой системы координат с помощью позиции камеры, направления вверх и направления камеры. |
XMMatrixLookToRH | Создает матрицу представления для правой системы координат с помощью позиции камеры, направления вверх и направления камеры. |
XMMatrixOrthographicLH | Создает матрицу ортогональной проекции для левой системы координат. |
XMMatrixOrthographicOffCenterLH | Создает настраиваемую матрицу ортогональной проекции для системы координат слева. |
XMMatrixOrthographicOffCenterRH | Создает настраиваемую матрицу ортогональной проекции для правой системы координат. |
XMMatrixOrthographicRH | Создает матрицу ортогональной проекции для правой системы координат. |
XMMatrixPerspectiveFovLH | Создает матрицу проекции перспективы слева на основе поля зрения. |
XMMatrixPerspectiveFovRH | Создает матрицу проекции правой стороны на основе поля зрения. |
XMMatrixPerspectiveLH | Создает матрицу проекции с левой стороны. |
XMMatrixPerspectiveOffCenterLH | Создает пользовательскую версию матрицы проекции перспективы слева. |
XMMatrixPerspectiveOffCenterRH | Создает пользовательскую версию матрицы проекции правой стороны. |
XMMatrixPerspectiveRH | Создает матрицу проекции правой стороны. |
Часто задаваемые вопросы о переносе OpenGL ES2.0 в Direct3D 11
- Вопрос: "Как правило, можно ли искать определенные строки или шаблоны в коде OpenGL и заменить их эквивалентами Direct3D?"
- Ответ: Нет. OpenGL ES 2.0 и Direct3D 11 происходят из различных поколений моделирования графического конвейера. Хотя существуют некоторые поверхностные сходства между понятиями и API, такими как контекст отрисовки и отрисовка шейдеров, следует ознакомиться с этим руководством, а также ссылкой На Direct3D 11, чтобы можно было сделать лучший выбор при повторном создании конвейера вместо попытки сопоставления 1–1. Однако при переносе из GLSL в HLSL создание набора общих псевдонимов для переменных, встроенных и функций GLSL не только упрощает перенос, но и позволяет поддерживать только один набор файлов кода шейдера.