Перенос простого отрисовщика OpenGL ES 2.0 в Direct3D 11
В качестве упражнения в переносе начнем с основ — с переноса простого обработчика для вращающегося куба с затенением по вершинам из OpenGL ES 2.0 в Direct3D, чтобы он соответствовал шаблону "Приложение DirectX 11 (универсальные приложения для Windows)" из Visual Studio 2015. Из разбора этого процесса переноса вы узнаете следующее:
- как переносить простой набор буферов вершин в буферы ввода Direct3D;
- как переносить однородности и атрибуты в буферы констант;
- как настраивать объекты шейдеров Direct3D;
- как базовая семантика HLSL используется в разработке шейдеров Direct3D;
- как переносить очень простой GLSL в HLSL.
Этот раздел начинается сразу после создания нового проекта DirectX 11. Чтобы узнать, как создавать новые проекты DirectX 11, ознакомьтесь с разделом Создание нового проекта DirectX 11 для универсальной платформы Windows (UWP).
В проекте, созданном на основании любой из этих ссылок, уже подготовлен весь нужный код для инфраструктуры Direct3D, что позволяет немедленно начать процесс переноса обработчика из Open GL ES 2.0 в Direct3D 11.
В этом разделе подробно разобраны две ветви кода, выполняющие одну и ту же базовую задачу обработки графики: отображение вращающегося куба с затененными вершинами. В обоих случаях код включает следующий процесс.
- Создание сетки куба из встроенных данных. Эта сетка представлена как список вершин, каждая из которых обладает положением, нормальным вектором и вектором цвета. Эта сетка помещается в буфер вершин для обработки конвейера затенения.
- Создание объектов шейдера для обработки сетки куба. Есть два шейдера: вершинный шейдер, который обрабатывает вершины для растеризации, и шейдер фрагментов, который окрашивает отдельные пиксели куба после растеризации. Эти пиксели записываются в однобуферную прорисовку для отображения.
- Формирование языка затенения, который используется для обработки вершин и пикселей в вершинных шейдерах и шейдерах фрагментов соответственно.
- Отображение отрисованного куба на экране.
По завершении этого пошагового руководства вы должны знать о следующих фундаментальных различиях между Open GL ES 2.0 и Direct3D 11:
- отображение буферов и данных вершин;
- процесс создания и настройки шейдеров;
- языки затенения, а также входные и выходные данные объектов шейдеров;
- поведение при прорисовке экрана.
В этом руководстве мы будем говорить о простой и стандартной структуре обработчика OpenGL, которая определена следующим образом.
typedef struct
{
GLfloat pos[3];
GLfloat rgba[4];
} Vertex;
typedef struct
{
// Integer handle to the shader program object.
GLuint programObject;
// The vertex and index buffers
GLuint vertexBuffer;
GLuint indexBuffer;
// Handle to the location of model-view-projection matrix uniform
GLint mvpLoc;
// Vertex and index data
Vertex *vertices;
GLuint *vertexIndices;
int numIndices;
// Rotation angle used for animation
GLfloat angle;
GLfloat mvpMatrix[4][4]; // the model-view-projection matrix itself
} Renderer;
У этой структуры имеется один экземпляр, и он содержит все необходимые компоненты для прорисовки очень простой сетки с затенением по вершинам.
Примечание Любой код OpenGL ES 2.0 в этом разделе основан на реализации API Windows, предоставляемой группой Khronos, и использует синтаксис программирования Windows C.
Это важно знать
Технологии
- Microsoft Visual C++
- OpenGL ES 2.0
Предварительные требования
- Необязательный элемент. Просмотрите раздел Перенос кода EGL в DXGI и Direct3D. Прочитайте этот раздел, чтобы лучше понять графический интерфейс, предоставляемый DirectX.
Этапы
Раздел | Описание |
---|---|
При переносе простого обработчика из OpenGL ES 2.0 прежде всего следует задать эквивалентные объекты вершинного шейдера и шейдера фрагментов в Direct3D 11 и убедиться, что основная программа может связываться с объектами шейдера после их компиляции. |
|
На этом шаге вы определите буферы вершин, которые будут содержать ваши сетки, и буферы индексов, которые позволят шейдерам обходить вершины в указанном порядке. |
|
После переноса кода, который создает и настраивает буферы и объекты шейдеров, следует перенести внутренний код шейдеров из версии GLSL (GL Shader Language) для OpenGL ES 2.0 в HLSL (High-level Shader Language) для Direct3D 11. |
|
Наконец, мы переносим код, который отрисовывает вращающийся куб на экране. |
Дополнительные ресурсы
- Подготовка среды разработки для разработки игр UWP DirectX
- Создание нового проекта DirectX 11 для UWP
- Сопоставьте концепции и инфраструктуру OpenGL ES 2.0 и Direct3D 11
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по