Compartilhar via


Planejar a portabilidade do OpenGL ES 2.0 para o Direct3D

APIs importantes

Se você está fazendo a portabilidade de um jogo das plataformas iOS ou Android, você provavelmente fez um investimento significativo no OpenGL ES 2.0. Ao se preparar para mover sua base de código de pipeline de elementos gráficos para o Direct3D 11 e o Windows Runtime, há algumas coisas que você deve considerar antes de começar.

A maioria dos esforços de portabilidade geralmente envolve inicialmente percorrer a base de código e mapear APIs e padrões comuns entre os dois modelos. Você achará esse processo um pouco mais fácil se dedicar algum tempo para ler e revisar este tópico.

Aqui estão algumas coisas a serem observadas ao fazer a portabilidade de elementos gráficos do OpenGL ES 2.0 para o Direct3D 11.

Notas sobre provedores específicos do OpenGL ES 2.0

Os tópicos de portabilidade nesta seção fazem referência à implementação do Windows da especificação OpenGL ES 2.0 criada pelo Khronos Group. Todos os exemplos de código do OpenGL ES 2.0 foram desenvolvidos usando o Visual Studio 2012 e a sintaxe básica do Windows C. Se você estiver vindo de uma base de código Objective-C (iOS) ou Java (Android), esteja ciente de que os exemplos de código OpenGL ES 2.0 fornecidos podem não usar sintaxe ou parâmetros de chamada de API semelhantes. Essa orientação tenta se manter o mais independente possível da plataforma.

Esta documentação usa apenas as APIs de especificação 2.0 para o código e a referência do OpenGL ES. Se você estiver fazendo a portabilidade do OpenGL ES 1.1 ou 3.0, este conteúdo ainda pode ser útil, embora alguns dos exemplos de código e contexto do OpenGL ES 2.0 possam não ser familiares.

Os exemplos do Direct3D 11 nestes tópicos usam o Microsoft Windows C++ com extensões de componente (CX). Para obter mais informações sobre esta versão da sintaxe C++, leia Visual C++, Extensões de componente para plataformas de tempo de execução e Referência rápida (C++\CX).

Compreender seus requisitos e recursos de hardware

O conjunto de recursos de processamento gráfico suportados pelo OpenGL ES 2.0 mapeia em termos gerais para os recursos fornecidos no Direct3D 9.1. Se você quiser aproveitar os recursos mais avançados fornecidos no Direct3D 11, revise a documentação do Direct3D 11 ao planejar a portabilidade ou examine o tópico Portabilidade do DirectX 9 para a Plataforma Universal do Windows (UWP) quando terminar o esforço inicial.

Para simplificar seu esforço inicial de portabilidade, comece com um modelo Direct3D do Visual Studio. Ele fornece um renderizador básico já configurado para você e oferece suporte a recursos de aplicativo da UWP, como a recriação de recursos em alterações de janela e níveis de recursos do Direct3D.

Compreender os níveis de recursos do Direct3D

O Direct3D 11 fornece suporte para "níveis de recursos" de hardware do 9_1 (Direct3D 9.1) para o 11_1. Esses níveis de recurso indicam a disponibilidade de determinados recursos e recursos gráficos. Normalmente, a maioria das plataformas OpenGL ES 2.0 oferece suporte a um conjunto de recursos Direct3D 9.1 (nível de recurso 9_1).

Revisar os recursos gráficos e as APIs do DirectX

Família de API Descrição
DXGI O DirectX Graphics Infrastructure (DXGI) fornece uma interface entre o hardware gráfico e o Direct3D. Ele define o adaptador de dispositivo e a configuração de hardware usando as interfaces COM IDXGIAdapter e IDXGIDevice1. Use-o para criar e configurar seus buffers e outros recursos de janela. Notavelmente, o padrão de fábrica IDXGIFactory2 é usado para adquirir os recursos gráficos, incluindo a cadeia de troca (um conjunto de buffers de quadros). Como o DXGI possui a cadeia de troca, a interface IDXGISwapChain1 é usada para apresentar quadros à tela.
Direct3D Direct3D é o conjunto de APIs que fornecem uma representação virtual da interface gráfica e permitem que você desenhe elementos gráficos usando-a. A versão 11 é aproximadamente comparável, em termos de recursos, ao OpenGL 4.3. (O OpenGL ES 2.0, por outro lado, é semelhante ao DirectX9, em termos de recursos, e ao OpenGL 2.0, mas com o pipeline de sombreador unificado do OpenGL 3.0.) A maior parte do trabalho pesado é feito com as interfaces ID3D11Device1 e ID3D11DeviceContext1, que fornecem acesso a recursos e subrecursos individuais e ao contexto de renderização, respectivamente.
Direct2D O Direct2D fornece um conjunto de APIs para renderização 2D acelerada por GPU. Ele pode ser considerado semelhante em propósito ao OpenVG.
DirectWrite O DirectWrite fornece um conjunto de APIs para renderização de fonte de alta qualidade acelerada por GPU.
DirectXMath O DirectXMath fornece um conjunto de APIs e macros para lidar com álgebra linear comum e tipos, valores e funções trigonométricas. Esses tipos e funções são projetados para funcionar bem com o Direct3D e suas operações de sombreador.
DirectX HLSL A sintaxe HLSL atual usada por sombreadores Direct3D. Ele implementa o Direct3D Shader Model 5.0.

 

Revisar as APIs do Windows Runtime e a biblioteca de modelos

As APIs do Windows Runtime fornecem a infraestrutura geral para aplicativos de UWP. Revise-as aqui.

As principais APIs do Windows Runtime usadas na portabilidade do pipeline gráfico incluem:

Além disso, a WRL (Biblioteca de Modelos C++ do Windows Runtime) é uma biblioteca de modelos que fornece uma maneira de baixo nível para criar e usar componentes do Windows Runtime. As APIs do Direct3D 11 para aplicativos de UWP são mais bem usadas em conjunções com as interfaces e tipos nessa biblioteca, como ponteiros inteligentes (ComPtr). Para obter mais informações sobre a WRL, leia Biblioteca de Modelos C++ do Windows Runtime (WRL).

Alterar o sistema de coordenadas

Uma diferença que às vezes confunde os primeiros esforços de portabilidade é a mudança do tradicional sistema de coordenadas destro do OpenGL para o sistema de coordenadas canhoto padrão do Direct3D. Essa alteração na modelagem de coordenadas afeta muitas partes do jogo, desde a instalação e configuração dos buffers de vértice até muitas das funções matemáticas da matriz. As duas mudanças mais importantes a serem feitas são:

  • Inverta a ordem dos vértices do triângulo para que o Direct3D os percorra no sentido horário a partir da frente. Por exemplo, se seus vértices estiverem indexados como 0, 1 e 2 no pipeline do OpenGL, passe-os para o Direct3D como 0, 2, 1.
  • Use a matriz de exibição para dimensionar o espaço mundial em -1,0f na direção z, invertendo efetivamente as coordenadas do eixo z. Para fazer isso, inverta o sinal dos valores nas posições M31, M32 e M33 em sua matriz de exibição (ao fazer a portabilidade para o tipo Matriz). Se M34 não for 0, inverta seu sinal também.

No entanto, o Direct3D pode oferecer suporte a um sistema de coordenadas destro. O DirectXMath fornece uma série de funções que operam em e entre sistemas de coordenadas canhotos e destros. Eles podem ser usados para preservar alguns de seus dados de malha originais e processamento de matriz. Elas incluem:

Função de matriz do DirectXMath Descrição
XMMatrixLookAtLH Cria uma matriz de exibição para um sistema de coordenadas canhoto usando uma posição de câmera, uma direção para cima e um ponto focal.
XMMatrixLookAtRH Cria uma matriz de exibição para um sistema de coordenadas destro usando uma posição de câmera, uma direção para cima e um ponto focal.
XMMatrixLookToLH Cria uma matriz de exibição para um sistema de coordenadas canhoto usando uma posição de câmera, uma direção para cima e uma direção de câmera.
XMMatrixLookToRH Cria uma matriz de exibição para um sistema de coordenadas destro usando uma posição de câmera, uma direção para cima e uma direção de câmera.
XMMatrixOrtographicLH Cria uma matriz de projeção ortogonal para um sistema de coordenadas canhoto.
XMMatrixOrthographicOffCenterLH Cria uma matriz de projeção ortogonal personalizada para um sistema de coordenadas canhoto.
XMMatrixOrthographicOffCenterRH Cria uma matriz de projeção ortogonal personalizada para um sistema de coordenadas destro.
XMMatrixOrthographicRH Cria uma matriz de projeção ortogonal para um sistema de coordenadas destro.
XMMatrixPerspectiveFovLH Cria uma matriz de projeção de perspectiva canhota com base em um campo de visão.
XMMatrixPerspectiveFovRH Cria uma matriz de projeção de perspectiva destra com base em um campo de visão.
XMMatrixPerspectiveLH Cria uma matriz de projeção de perspectiva canhota.
XMMatrixPerspectiveOffCenterLH Cria uma versão personalizada de uma matriz de projeção de perspectiva canhota.
XMMatrixPerspectiveOffCenterRH Cria uma versão personalizada de uma matriz de projeção de perspectiva destra.
XMMatrixPerspectivaRH Cria uma matriz de projeção de perspectiva destra.

 

Perguntas frequentes sobre a portabilidade do OpenGL ES2.0 para o Direct3D 11

  • Pergunta: "Em geral, posso procurar determinadas cadeias de caracteres ou padrões no meu código OpenGL e substituí-los pelos equivalentes do Direct3D?"
  • Resposta: Não. O OpenGL ES 2.0 e o Direct3D 11 vêm de diferentes gerações de modelagem de pipeline gráfico. Embora existam algumas semelhanças superficiais entre conceitos e APIs, como o contexto de renderização e a instanciação de sombreadores, você deve revisar esta orientação, bem como a referência do Direct3D 11 para que possa fazer as melhores escolhas ao recriar seu pipeline em vez de tentar um mapeamento de 1 para 1. No entanto, se você estiver fazendo a portabilidade de GLSL para HLSL, criar um conjunto de aliases comuns para variáveis, intrínsecos e funções de GLSL pode não apenas facilitar a portabilidade, mas também permitir que você mantenha apenas um conjunto de arquivos de código de sombreador.