Поделиться через


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

После перемещения по коду, который создает и настраивает буферы и объекты шейдеров, пора перенести код внутри этих шейдеров из OpenGL ES 2.0 в ЯЗЫК шейдеров GL (GLSL) на высокоуровневый язык шейдеров Direct3D 11 (HLSL).

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

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

 

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