Перенос простого отрисовщика OpenGL ES 2.0 в Direct3D 11Port a simple OpenGL ES 2.0 renderer to Direct3D 11

В качестве упражнения в переносе начнем с основ — с переноса простого обработчика для вращающегося куба с затенением по вершинам из OpenGL ES 2.0 в Direct3D, чтобы он соответствовал шаблону "Приложение DirectX 11 (универсальные приложения для Windows)" из Visual Studio 2015.For this porting exercise, we'll start with the basics: bringing a simple renderer for a spinning, vertex-shaded cube from OpenGL ES 2.0 into Direct3D, such that it matches the DirectX 11 App (Universal Windows) template from Visual Studio 2015. Из разбора этого процесса переноса вы узнаете следующее:As we walk through this port process, you will learn the following:

  • как переносить простой набор буферов вершин в буферы ввода Direct3D;How to port a simple set of vertex buffers to Direct3D input buffers
  • как переносить однородности и атрибуты в буферы констант;How to port uniforms and attributes to constant buffers
  • как настраивать объекты шейдеров Direct3D;How to configure Direct3D shader objects
  • как базовая семантика HLSL используется в разработке шейдеров Direct3D;How basic HLSL semantics are used in Direct3D shader development
  • как переносить очень простой GLSL в HLSL.How to port very simple GLSL to HLSL

Этот раздел начинается сразу после создания нового проекта DirectX 11.This topic starts after you have created a new DirectX 11 project. Чтобы узнать, как создавать новые проекты DirectX 11, ознакомьтесь с разделом Создание нового проекта DirectX 11 для универсальной платформы Windows (UWP).To learn how to create a new DirectX 11 project, read Create a new DirectX 11 project for Universal Windows Platform (UWP).

В проекте, созданном на основании любой из этих ссылок, уже подготовлен весь нужный код для инфраструктуры Direct3D, что позволяет немедленно начать процесс переноса обработчика из Open GL ES 2.0 в Direct3D 11.The project created from either of these links has all the code for the Direct3D infrastructure prepared, and you can immediately start into the process of porting your renderer from Open GL ES 2.0 to Direct3D 11.

В этом разделе подробно разобраны две ветви кода, выполняющие одну и ту же базовую задачу обработки графики: отображение вращающегося куба с затененными вершинами.This topic walks two code paths that perform the same basic graphics task: display a rotating vertex-shaded cube in a window. В обоих случаях код включает следующий процесс.In both cases, the code covers the following process:

  1. Создание сетки куба из встроенных данных.Creating a cube mesh from hardcoded data. Эта сетка представлена как список вершин, каждая из которых обладает положением, нормальным вектором и вектором цвета.This mesh is represented as a list of vertices, with each vertex possessing a position, a normal vector, and a color vector. Эта сетка помещается в буфер вершин для обработки конвейера затенения.This mesh is put into a vertex buffer for the shading pipeline to process.
  2. Создание объектов шейдера для обработки сетки куба.Creating shader objects to process the cube mesh. Есть два шейдера: вершинный шейдер, который обрабатывает вершины для растеризации, и шейдер фрагментов, который окрашивает отдельные пиксели куба после растеризации.There are two shaders: a vertex shader that processes the vertices for rasterization, and a fragment (pixel) shader that colors the individual pixels of the cube after rasterization. Эти пиксели записываются в однобуферную прорисовку для отображения.These pixels are written into a render target for display.
  3. Формирование языка затенения, который используется для обработки вершин и пикселей в вершинных шейдерах и шейдерах фрагментов соответственно.Forming the shading language that is used for vertex and pixel processing in the vertex and fragment shaders, respectively.
  4. Отображение отрисованного куба на экране.Displaying the rendered cube on the screen.

Простой куб OpenGL

По завершении этого пошагового руководства вы должны знать о следующих фундаментальных различиях между Open GL ES 2.0 и Direct3D 11:Upon completing this walkthrough, you should be familiar with the following basic differences between Open GL ES 2.0 and Direct3D 11:

  • отображение буферов и данных вершин;The representation of vertex buffers and vertex data.
  • процесс создания и настройки шейдеров;The process of creating and configuring shaders.
  • языки затенения, а также входные и выходные данные объектов шейдеров;Shading languages, and the inputs and outputs to shader objects.
  • поведение при прорисовке экрана.Screen drawing behaviors.

В этом руководстве мы будем говорить о простой и стандартной структуре обработчика OpenGL, которая определена следующим образом.In this walkthrough, we refer to an simple and generic OpenGL renderer structure, which is defined like this:

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;

У этой структуры имеется один экземпляр, и он содержит все необходимые компоненты для прорисовки очень простой сетки с затенением по вершинам.This structure has one instance and contains all the necessary components for rendering a very simple vertex-shaded mesh.

Примечание    . Любой код OpenGL ES 2,0 в этом разделе основан на реализации API Windows, предоставляемой группой Кхронос, и использует синтаксис программирования Windows C.Note  Any OpenGL ES 2.0 code in this topic is based on the Windows API implementation provided by the Khronos Group, and uses Windows C programming syntax.

 

Что необходимо знатьWhat you need to know

ТехнологииTechnologies

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

  • Необязательный элемент.Optional. Просмотрите раздел Перенос кода EGL в DXGI и Direct3D.Review Port EGL code to DXGI and Direct3D. Прочитайте этот раздел, чтобы лучше понять графический интерфейс, предоставляемый DirectX.Read this topic to better understand the graphics interface provided by DirectX.
РазделTopic ОписаниеDescription

Перенос объектов шейдеровPort the shader objects

При переносе простого обработчика из OpenGL ES 2.0 прежде всего следует задать эквивалентные объекты вершинного шейдера и шейдера фрагментов в Direct3D 11 и убедиться, что основная программа может связываться с объектами шейдера после их компиляции.When porting the simple renderer from OpenGL ES 2.0, the first step is to set up the equivalent vertex and fragment shader objects in Direct3D 11, and to make sure that the main program can communicate with the shader objects after they are compiled.

Перенос буферов вершин и данныхPort the vertex buffers and data

На этом шаге вы определите буферы вершин, которые будут содержать ваши сетки, и буферы индексов, которые позволят шейдерам обходить вершины в указанном порядке.In this step, you'll define the vertex buffers that will contain your meshes and the index buffers that allow the shaders to traverse the vertices in a specified order.

Перенос GLSLPort the GLSL

После переноса кода, который создает и настраивает буферы и объекты шейдеров, следует перенести внутренний код шейдеров из версии GLSL (GL Shader Language) для OpenGL ES 2.0 в HLSL (High-level Shader Language) для Direct3D 11.Once you've moved over the code that creates and configures your buffers and shader objects, it's time to port the code inside those shaders from OpenGL ES 2.0's GL Shader Language (GLSL) to Direct3D 11's High-level Shader Language (HLSL).

Рисование на экранеDraw to the screen

Наконец, мы переносим код, который отрисовывает вращающийся куб на экране.Finally, we port the code that draws the spinning cube to the screen.

 

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