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:
- 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.
- 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.
- Formando a linguagem de sombreamento usada para processamento de vértice e pixel nos sombreadores de vértice e fragmento, respectivamente.
- Exibindo o cubo renderizado na tela.
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
- Microsoft Visual C++
- OpenGL ES 2.0
Pré-requisitos
- Opcional. Examine o código EGL da porta para DXGI e Direct3D. Leia este tópico para entender melhor a interface gráfica fornecida pelo DirectX.
Passos
Tópico | Descrição |
---|---|
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. |
|
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. |
|
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. |
|
Por fim, portamos o código que desenha o cubo giratório para a tela. |
Recursos adicionais
- Preparar seu ambiente de desenvolvimento para o desenvolvimento de jogos UWP DirectX
- Criar um novo projeto DirectX 11 para UWP
- Mapear conceitos e infraestrutura do OpenGL ES 2.0 para Direct3D 11