Compartilhar via


Portar um renderizador OpenGL ES 2.0 simples para o Direct3D 11

Para este exercício de portabilidade, começaremos com o básico: trazer um renderizador simples para um cubo giratório sombreado por vértice do OpenGL ES 2.0 para o Direct3D, de modo que ele corresponda ao modelo de Aplicativo DirectX 11 (Universal Windows) do Visual Studio 2015. À medida que percorremos esse processo de portabilidade, você aprenderá o seguinte:

  • Como portar um conjunto simples de buffers de vértice para buffers de entrada do Direct3D
  • Como portar uniformes e atributos para buffers constantes
  • Como configurar objetos de sombreador Direct3D
  • Como a semântica HLSL básica é usada no desenvolvimento do sombreador Direct3D
  • Como portar GLSL muito simples para HLSL

Este tópico começa depois que você cria um novo projeto do DirectX 11. Para saber como criar um novo projeto DirectX 11, leia Criar um novo projeto DirectX 11 para a Plataforma Universal do Windows (UWP).

O projeto criado a partir de qualquer um desses links tem todo o código para a infraestrutura do Direct3D preparado e você pode iniciar imediatamente o processo de portabilidade do renderizador do Open GL ES 2.0 para o Direct3D 11.

Este tópico percorre dois caminhos de código que executam a mesma tarefa gráfica básica: exibir um cubo sombreado de vértice giratório em uma janela. Nos dois casos, o código abrange o seguinte processo:

  1. Criando uma malha de cubo a partir de dados codificados. Essa malha é representada como uma lista de vértices, com cada vértice possuindo uma posição, um vetor normal e um vetor de cor. Essa malha é colocada em um buffer de vértice para que o pipeline de sombreamento seja processado.
  2. Criando objetos de sombreador para processar a malha do cubo. Há dois sombreadores: um sombreador de vértice que processa os vértices para rasterização e um sombreador de fragmento (pixel) que colore os pixels individuais do cubo após a rasterização. Esses pixels são gravados em um destino de renderização para exibição.
  3. Formando a linguagem de sombreamento usada para processamento de vértice e pixel nos sombreadores de vértice e fragmento, respectivamente.
  4. Exibindo o cubo renderizado na tela.

Cubo OpenGL simples

Ao concluir este passo a passo, você deve estar familiarizado com as seguintes diferenças básicas entre o Open GL ES 2.0 e o Direct3D 11:

  • A representação de buffers de vértice e dados de vértice.
  • O processo de criação e configuração de sombreadores.
  • Linguagens de sombreamento e as entradas e saídas para objetos de sombreador.
  • Comportamentos de desenho de tela.

Neste passo a passo, nos referimos a uma estrutura de renderizador OpenGL simples e genérica, que é definida assim:

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;

Essa estrutura tem uma instância e contém todos os componentes necessários para renderizar uma malha sombreada por vértice muito simples.

Observação Qualquer código OpenGL ES 2.0 neste tópico é baseado na implementação da API do Windows fornecida pelo Khronos Group e usa a sintaxe de programação do Windows C.

 

O que você precisa saber

Tecnologias

Pré-requisitos

Passos

Tópico Descrição

Portar os objetos de sombreador

Ao portar o renderizador simples do OpenGL ES 2.0, a primeira etapa é configurar os objetos de sombreador de vértice e fragmento equivalentes no Direct3D 11 e garantir que o programa principal possa se comunicar com os objetos de sombreador depois que eles forem compilados.

Portar os buffers de vértice e os dados

Nesta etapa, você definirá os buffers de vértice que conterão suas malhas e os buffers de índice que permitem que os sombreadores percorram os vértices em uma ordem especificada.

Portar o GLSL

Depois de mover o código que cria e configura seus buffers e objetos de sombreador, é hora de portar o código dentro desses sombreadores da GLSL (GL Shader Language) do OpenGL ES 2.0 para a HLSL (High-level Shader Language) do Direct3D 11.

Desenhar na tela

Por fim, portamos o código que desenha o cubo giratório para a tela.

 

Recursos adicionais