Перенос простого отрисовщика 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.

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

  1. Создание сетки куба из встроенных данных. Эта сетка представлена как список вершин, каждая из которых обладает положением, нормальным вектором и вектором цвета. Эта сетка помещается в буфер вершин для обработки конвейера затенения.
  2. Создание объектов шейдера для обработки сетки куба. Есть два шейдера: вершинный шейдер, который обрабатывает вершины для растеризации, и шейдер фрагментов, который окрашивает отдельные пиксели куба после растеризации. Эти пиксели записываются в однобуферную прорисовку для отображения.
  3. Формирование языка затенения, который используется для обработки вершин и пикселей в вершинных шейдерах и шейдерах фрагментов соответственно.
  4. Отображение отрисованного куба на экране.

Простой куб OpenGL

По завершении этого пошагового руководства вы должны знать о следующих фундаментальных различиях между 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.

 

Это важно знать

Технологии

Предварительные требования

  • Необязательный элемент. Просмотрите раздел Перенос кода EGL в DXGI и Direct3D. Прочитайте этот раздел, чтобы лучше понять графический интерфейс, предоставляемый DirectX.

Этапы

Раздел Описание

Перенос объектов шейдеров

При переносе простого обработчика из OpenGL ES 2.0 прежде всего следует задать эквивалентные объекты вершинного шейдера и шейдера фрагментов в Direct3D 11 и убедиться, что основная программа может связываться с объектами шейдера после их компиляции.

Перенос буферов вершин и данных

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

Перенос GLSL

После переноса кода, который создает и настраивает буферы и объекты шейдеров, следует перенести внутренний код шейдеров из версии GLSL (GL Shader Language) для OpenGL ES 2.0 в HLSL (High-level Shader Language) для Direct3D 11.

Рисование на экране

Наконец, мы переносим код, который отрисовывает вращающийся куб на экране.

 

Дополнительные ресурсы