Planeación de la portación de OpenGL ES 2.0 a Direct3D

API importantes

Si va a hacer la portabilidad de un juego desde las plataformas iOS o Android, probablemente haya realizado una inversión significativa en OpenGL ES 2.0. Al preparar la portabilidad del código base de canalización de gráficos a Direct3D 11 y Windows Runtime, hay algunas cosas que debe tener en cuenta antes de empezar.

La mayoría de los esfuerzos de portabilidad normalmente implican repasar inicialmente el código base y asignar API comunes y patrones entre los dos modelos. Encontrará este proceso un poco más fácil si dedica un tiempo a leer y revisar este tema.

Estas son algunas de las cosas que debe tener en cuenta al realizar la portabilidad de gráficos de OpenGL ES 2.0 a Direct3D 11.

Notas sobre proveedores específicos de OpenGL ES 2.0

Los temas de portabilidad de esta sección hacen referencia a la implementación de Windows de la especificación OpenGL ES 2.0 creada por el Grupo Khronos. Todos los ejemplos de código de OpenGL ES 2.0 se desarrollaron con Visual Studio 2012 y la sintaxis básica de Windows C. Si procede de un código base de Objective-C (iOS) o Java (Android), tenga en cuenta que los ejemplos de código de OpenGL ES 2.0 proporcionados no pueden usar parámetros o sintaxis de llamada API similares. Esta guía intenta permanecer tan independiente de la plataforma como sea posible.

Esta documentación solo usa las API de especificación 2.0 para el código y la referencia de OpenGL ES. Si va a migrar desde OpenGL ES 1.1 o 3.0, este contenido puede resultarle útil, aunque algunos de los ejemplos de código y el contexto de OpenGL ES 2.0 pueden ser desconocidos.

Los ejemplos de Direct3D 11 de estos temas usan Microsoft Windows C++ con Extensiones de componente (CX). Para obtener más información sobre esta versión de la sintaxis de C++, lea Visual C++, Extensiones de componente para plataformas de entorno de ejecución y Referencia rápida (C++\CX).

Descripción de los requisitos y recursos de hardware

El conjunto de características de procesamiento de gráficos compatibles con OpenGL ES 2.0 se asigna aproximadamente a las características proporcionadas en Direct3D 9.1. Si quiere aprovechar las características más avanzadas que se proporcionan en Direct3D 11, revise la documentación de Direct3D 11 al planear la portabilidad o revise los temas Portabilidad de DirectX 9 a Plataforma universal de Windows (UWP) cuando haya terminado con el esfuerzo inicial.

Para simplificar el esfuerzo de portabilidad inicial, comience con una plantilla de Direct3D de Visual Studio. Proporciona un representador básico ya configurado y admite características de la aplicación para UWP, como volver a crear recursos en los cambios de ventana y niveles de características de Direct3D.

Descripción de los niveles de características de Direct3D

Direct3D 11 proporciona compatibilidad con "niveles de características" de hardware de 9_1 (Direct3D 9.1) para 11_1. Estos niveles de características indican la disponibilidad de determinadas características y recursos gráficos. Normalmente, la mayoría de las plataformas OpenGL ES 2.0 admiten un conjunto de características de Direct3D 9.1 (nivel de características 9_1).

Revisión de las características y API de gráficos de DirectX

Familia de API Descripción
DXGI La infraestructura de gráficos de DirectX (DXGI) proporciona una interfaz entre el hardware gráfico y Direct3D. Establece el adaptador de dispositivo y la configuración de hardware mediante las interfaces COM IDXGIAdapter e IDXGIDevice1. Úselo para crear y configurar los búferes y otros recursos de ventana. En particular, el patrón de fábrica IDXGIFactory2 que se usa para adquirir los recursos gráficos, incluida la cadena de intercambio (un conjunto de búferes de fotogramas). Dado que DXGI posee la cadena de intercambio, la interfaz IDXGISwapChain1 se usa para presentar fotogramas a la pantalla.
Direct3D Direct3D es el conjunto de API que proporciona una representación virtual de la interfaz gráfica y permite dibujar gráficos con él. La versión 11 es aproximadamente comparable en cuanto a características a OpenGL 4.3. (OpenGL ES 2.0, por otro lado, es similar a DirectX9, por características, y OpenGL 2.0, pero con la canalización de sombreador unificada de OpenGL 3.0). La mayor parte del trabajo pesado se realiza con las interfaces ID3D11Device1 y ID3D11DeviceContext1 que proporcionan acceso a recursos individuales y subrecursos, y el contexto de representación, respectivamente.
Direct2D Direct2D proporciona un conjunto de API para la representación 2D acelerada por GPU. Se puede considerar similar en propósito a OpenVG.
DirectWrite DirectWrite proporciona un conjunto de API para la representación de fuentes aceleradas por GPU y de alta calidad.
DirectXMath DirectXMath proporciona un conjunto de API y macros para controlar tipos, valores y funciones comunes de álgebra lineal y trigonométrica. Estos tipos y funciones están diseñados para funcionar bien con Direct3D y sus operaciones de sombreador.
DirectX HLSL La sintaxis HLSL actual que usan los sombreadores de Direct3D. Implementa Direct3D Shader Model 5.0.

 

Revisar las API de Windows Runtime y la biblioteca de plantillas

Las API de Windows Runtime proporcionan la infraestructura general para las aplicaciones para UWP. Revíselos aquí.

Entre las API clave de Windows Runtime que se usan para migrar la canalización de gráficos se incluyen las siguientes:

Además, la biblioteca de plantillas de C++ de Windows Runtime (WRL) es una biblioteca de plantillas que proporciona una manera de bajo nivel de crear y usar componentes de Windows Runtime. Las API de Direct3D 11 para aplicaciones para UWP es mejor utilizarlas junto con las interfaces y los tipos de esta biblioteca, como punteros inteligentes (ComPtr). Para obtener más información sobre WRL, lea Biblioteca de plantillas de C++ de Windows Runtime (WRL).

Cambiar el sistema de coordenadas

Una diferencia que a veces causa confusión en los esfuerzos iniciales de portabilidad es el cambio del sistema de coordenadas tradicional de OpenGL al predeterminado del sistema de coordenadas izquierdo de Direct3D. Este cambio en el modelado de coordenadas afecta a muchas partes del juego, desde la instalación y la configuración de los búferes de vértices a muchas de las funciones matemáticas de matrices. Los dos cambios más importantes que se van a realizar son:

  • Voltear el orden de los vértices de triángulo para que Direct3D los recorra en el sentido de las agujas del reloj desde el frente. Por ejemplo, si los vértices se indexan como 0, 1 y 2 en la canalización de OpenGL, páselos a Direct3D como 0, 2, 1 en su lugar.
  • Utilice la matriz de vista para escalar el espacio global en -1.0f en la dirección z, lo que invierte eficazmente las coordenadas del eje Z. Para ello, voltee el signo de los valores en las posiciones M31, M32 y M33 en la matriz de vista (al migrarlos al tipo Matrix). Si M34 no es 0, voltee también su signo.

Sin embargo, Direct3D puede admitir un sistema de coordenadas derecho. DirectXMath proporciona una serie de funciones que funcionan en y entre sistemas de coordenadas izquierdos y derechos. Se pueden usar para conservar algunos de los datos de malla originales y el procesamiento de matrices. Incluyen:

Función de matriz DirectXMath Descripción
XMMatrixLookAtLH Crea una matriz de vista para un sistema de coordenadas izquierdo mediante una posición de cámara, una dirección ascendente y un punto focal.
XMMatrixLookAtRH Crea una matriz de vista para un sistema de coordenadas derecho mediante una posición de cámara, una dirección ascendente y un punto focal.
XMMatrixLookToLH Crea una matriz de vista para un sistema de coordenadas izquierdo mediante una posición de cámara, una dirección ascendente y una dirección de cámara.
XMMatrixLookToRH Crea una matriz de vista para un sistema de coordenadas derecho mediante una posición de cámara, una dirección ascendente y una dirección de cámara.
XMMatrixOrthographicLH Crea una matriz de proyección ortogonal para un sistema de coordenadas izquierdo.
XMMatrixOrthographicOffCenterLH Crea una matriz de proyección ortogonal personalizada para un sistema de coordenadas izquierdo.
XMMatrixOrthographicOffCenterRH Crea una matriz de proyección ortogonal personalizada para un sistema de coordenadas derecho.
XMMatrixOrthographicRH Crea una matriz de proyección ortogonal para un sistema de coordenadas derecho.
XMMatrixPerspectiveFovLH Crea una matriz de proyección de perspectiva izquierda basada en un campo de vista.
XMMatrixPerspectiveFovRH Crea una matriz de proyección de perspectiva derecha basada en un campo de vista.
XMMatrixPerspectiveLH Crea una matriz de proyección de perspectiva izquierda.
XMMatrixPerspectiveOffCenterLH Crea una versión personalizada de una matriz de proyección de perspectiva izquierda.
XMMatrixPerspectiveOffCenterRH Crea una versión personalizada de una matriz de proyección de perspectiva derecha.
XMMatrixPerspectiveRH Crea una matriz de proyección de perspectiva derecha.

 

Preguntas más frecuentes sobre la portabilidad de OpenGL ES2.0 a Direct3D 11

  • Pregunta: "De forma general, ¿puedo buscar ciertas cadenas o patrones en mi código openGL y reemplazarlos por los equivalentes de Direct3D?"
  • Respuesta: No. OpenGL ES 2.0 y Direct3D 11 proceden de diferentes generaciones de modelado de canalización de gráficos. Aunque hay algunas similitudes de superficie entre conceptos y API, como el contexto de representación y la creación de instancias de sombreadores, debe revisar esta guía, así como la referencia de Direct3D 11 para poder elegir las mejores opciones al volver a crear la canalización en lugar de intentar una asignación de 1 a 1. Sin embargo, si va a migrar de GLSL a HLSL, la creación de un conjunto de alias comunes para variables GLSL, intrínsecos y funciones no solo puede facilitar la portabilidad, sino que le permite mantener un solo conjunto de archivos de código de sombreador.