Planear la migración de OpenGL ES 2.0 a Direct3DPlan your port from OpenGL ES 2.0 to Direct3D

API importantesImportant APIs

Si vas a migrar un juego de plataformas iOs o Android, probablemente has hecho una gran inversión en OpenGL ES 2.0.If you are porting a game from the iOS or Android platforms, you have probably made a significant investment in OpenGL ES 2.0. Cuando te preparas para trasladar el código base de la canalización de gráficos a Direct3D 11 y Windows Runtime, debes considerar algunas cosas antes de empezar.When preparing to move your graphics pipeline codebase to Direct3D 11 and the Windows Runtime, there are a few things you should consider before you start.

La mayor parte de la tarea de migración consiste en dar los primeros pasos por el código base y la asignación de patrones y API comunes entre los dos modelos.Most porting efforts usually involving initially walking the codebase and mapping common APIs and patterns between the two models. Encontrarás que este proceso es bastante fácil si te tomas algo de tiempo para leer y revisar este tema.You'll find this process a bit easier if you take some time to read and review this topic.

Estas son algunas de las cosas que debes tener en cuenta para migrar gráficos de OpenGL ES 2.0 a Direct3D 11.Here are some things to be aware of when porting graphics from OpenGL ES 2.0 to Direct3D 11.

Notas sobre proveedores específicos de OpenGL ES 2.0Notes on specific OpenGL ES 2.0 providers

Los temas de migración de esta sección hacen referencia a la implementación de Windows de la especificación de OpenGL ES 2.0 creada por Khronos Group.The porting topics in this section reference the Windows implementation of the OpenGL ES 2.0 specification created by the Khronos Group. Todas las muestras del código de OpenGL ES 2.0 se desarrollaron con Visual Studio 2012 y la sintaxis básica de Windows C.All OpenGL ES 2.0 code samples were developed using Visual Studio 2012 and basic Windows C syntax. Si partes de un código base de Objective-C (iOS) o Java (Android), ten en cuenta que las muestras de código de Open GL ES 2.0 que se proporcionan pueden no usar parámetros o sintaxis de llamadas API similares.If you are coming from an Objective-C (iOS) or Java (Android) codebase, be aware that the provided OpenGL ES 2.0 code samples may not use similar API calling syntax or parameters. Esta orientación intenta no involucrarte con las plataformas en la medida que sea posible.This guidance tries to stay as platform agnostic as possible.

La documentación solo usa API de la especificación 2.0 para el código de OpenGL ES y la referencia.This documentation only uses the 2.0 specification APIs for the OpenGL ES code and reference. Si vas a migrar de OpenGL ES 1.1 o 3.0, este contenido puede serte útil, aunque algunos de los ejemplos del código de OpenGL ES 2.0 y el contexto pueden resultarte desconocidos.If you are porting from OpenGL ES 1.1 or 3.0, this content can still prove useful, although some of the OpenGL ES 2.0 code examples and context may be unfamiliar.

Las muestras de Direct3D 11 de estos temas usan Microsoft Windows C++ con extensiones de componentes (CX).The Direct3D 11 samples in these topics use Microsoft Windows C++ with Component Extensions (CX). Para obtener más información sobre esta versión de la sintaxis de C++, lea Visual C++, extensiones de componentes para plataformas en tiempo de ejecucióny referencia rápida (C++ \ CX).For more info on this version of the C++ syntax, read Visual C++, Component Extensions for Runtime Platforms, and Quick Reference (C++\CX).

Comprender los requisitos y recursos de hardwareUnderstand your hardware requirements and resources

El conjunto de características para procesar gráficos en OpenGL ES 2.0 se asigna en términos generales a las características proporcionadas en Direct3D 9.1.The set of graphics processing features supported by OpenGL ES 2.0 roughly maps to the features provided in Direct3D 9.1. Si quieres sacar provecho de las características más avanzadas de Direct3D 11, revisa la documentación de Direct3D 11 cuando planees una migración o revisa los temas Migrar de DirectX 9 a la Plataforma universal de Windows (UWP) cuando ya hayas realizado el esfuerzo inicial.If you want to take advantage of the more advanced features provided in Direct3D 11, review the Direct3D 11 documentation when planning your port, or review the Port from DirectX 9 to Universal Windows Platform (UWP) topics when you're done with the initial effort.

Para simplificar tu primera migración, empieza con la plantilla Direct3D de Visual Studio.To make your initial porting effort simple, start with a Visual Studio Direct3D template. Esta proporciona un representador básico ya configurado y admite características de aplicaciones para UWP, como recrear recursos en cambios de Windows y niveles de características de Direct3D.It provides a basic renderer already configured for you, and supports UWP app features like recreating resources on window changes and Direct3D feature levels.

Comprender los niveles de característica de Direct3D Understand Direct3D feature levels

Direct3D 11 proporciona compatibilidad con los niveles de características de hardware de 9 _ 1 (Direct3D 9,1) para 11 _ 1.Direct3D 11 provides support for hardware "feature levels" from 9_1 (Direct3D 9.1) for 11_1. Estos niveles de característica indican la disponibilidad de ciertos recursos y características de gráficos.These feature levels indicate the availability of certain graphics features and resources. Normalmente, la mayoría de las plataformas de OpenGL ES 2,0 admiten un conjunto de características de Direct3D 9,1 (nivel de característica 9 _ 1).Typically, most OpenGL ES 2.0 platforms support a Direct3D 9.1 (feature level 9_1) set of features.

Revisar API y características de gráficos de DirectXReview DirectX graphics features and APIs

Familia de APIAPI Family DescripciónDescription
DXGIDXGI La Infraestructura de gráficos de Microsoft DirectX (DXGI) proporciona una interfaz entre el hardware de gráficos y Direct3D.The DirectX Graphics Infrastructure (DXGI) provides an interface between the graphics hardware and Direct3D. Establece la configuración del hardware y adaptador de dispositivo con las interfaces COM IDXGIAdapter y IDXGIDevice1.It sets the device adapter and hardware configuration using the IDXGIAdapter and IDXGIDevice1 COM interfaces. Úsala para crear y configurar búferes y otros recursos de Windows.Use it to create and configure your buffers and other window resources. De manera notable, el modelo predeterminado IDXGIFactory2 se usa para adquirir recursos de gráficos, incluida la cadena de intercambio (un conjunto de búferes de trama).Notably, the IDXGIFactory2 factory pattern iis used to acquire the graphics resources, including the swap chain (a set of frame buffers). Dado que DXGI tiene su propia cadena de intercambio, la interfaz IDXGISwapChain1 se usa para presentar marcos en la pantalla.Since DXGI owns the swap chain, the IDXGISwapChain1 interface is used to present frames to the screen.
Direct3DDirect3D Direct3D es el conjunto de API que proporciona una representación virtual de la interfaz de gráficos y permite dibujar gráficos con ella.Direct3D is the set of APIs that provide a virtual representation of the graphics interface and allow you to draw graphics using it. La versión 11 es comparable a grandes rasgos en características a OpenGL 4.3.Version 11, is roughly comparable, feature-wise, to OpenGL 4.3. (OpenGL ES 2.0, por otro lado, es similar a DirectX9 y OpenGL 2.0 en sus características, pero con la canalización de sombreador unificada de OpenGL 3.0). La mayoría 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.(OpenGL ES 2.0, on the other hand, is similar to DirectX9, feature-wise, and OpenGL 2.0, but with OpenGL 3.0's unified shader pipeline.) Most of the heavy lifting is done with the ID3D11Device1 and ID3D11DeviceContext1 interfaces which provide access to individual resources and subresources, and the rendering context, respectively.
Direct2DDirect2D Direct2D proporciona un conjunto de API para la representación 2D con aceleración por GPU.Direct2D provides a set of APIs for GPU-accelerated 2D rendering. Puede considerarse similar en su propósito a OpenVG.It can be considered similar in purpose to OpenVG.
DirectWriteDirectWrite DirectWrite proporciona un conjunto de API para la representación de fuente, de alta calidad, con aceleración por GPU.DirectWrite provides a set of APIs for GPU-accelerated, high-quality font rendering.
DirectXMathDirectXMath DirectXMath proporciona un conjunto de API y macros para controlar tipos trigonométricos y de álgebra lineal comunes, así como valores y funciones.DirectXMath provides a set of APIs and macros for handling common linear algebra and trigonometric types, values, and functions. Estos tipos y funciones están diseñados para funcionar con Direct3D y sus operaciones de sombreador.These types and functions are designed to work well with Direct3D and its shader operations.
DirectX HLSLDirectX HLSL Es la sintaxis actual de HLSL que usan los sombreadores de Direct3D.The current HLSL syntax used by Direct3D shaders. Implementa el modelo de sombreador 5.0 de Direct3D.It implements Direct3D Shader Model 5.0.

 

Revisar la biblioteca de plantillas y API de Windows RuntimeReview the Windows Runtime APIs and template library

Las API de Windows Runtime proporcionan la infraestructura general para aplicaciones para UWP.The Windows Runtime APIs provide the overall infrastructure for UWP apps. Revísalas aquí.Review them here.

Estas son las API esenciales de Windows Runtime que se usan en la migración de la canalización de gráficos:Key Windows Runtime APIs used in porting your graphics pipeline include:

Además, la Biblioteca de plantillas C++ de Windows Runtime (WRL) es una biblioteca que proporciona un modo de bajo nivel para crear y usar componentes de Windows Runtime.Additionally, the Windows Runtime C++ Template Library (WRL) is a template library that provides a low-level way to author and use Windows Runtime components. Las API de Direct3D 11 para aplicaciones para UWP se usan mejor en conjunto con las interfaces y tipos de esta biblioteca, como los punteros inteligentes (ComPtr).The Direct3D 11 APIs for UWP apps are best used in conjunctions with the interfaces and types in this library, such as smart pointers (ComPtr). Para más información sobre la WRL, lee Biblioteca de plantillas C++ de Windows Runtime (WRL).For more info on the WRL, read Windows Runtime C++ Template Library (WRL).

Cambiar el sistema de coordenadasChange your coordinate system

Una diferencia que a veces confunde en los primeros pasos de migración es el cambio del sistema de coordenadas tradicional a la derecha de OpenGL al sistema de coordenadas predeterminado a la izquierda de Direct3D.One difference that sometimes confuses early port efforts is the change from OpenGL's traditional right-handed coordinate system to Direct3D's default left-handed coordinate system. Esta cambio en los modelos de coordenadas afecta muchas partes del juego, desde la configuración de búferes de vértices a varias de las funciones matemáticas de la matriz.This change in coordinate modeling affects many parts of your game, from the setup and configuration of your vertex buffers to many of your matrix math functions. Los dos cambios más importantes para hacer son:The two most important changes to make are:

  • Invierte el orden de los vértices del triángulo, de modo tal que Direct3D los recorra en el sentido de las agujas del reloj desde el frente.Flip the order of triangle vertices so that Direct3D traverses them clockwise from the front. Por ejemplo, si los vértices se indizan como 0, 1 y 2 en tu canalización de OpenGL, pásalos a Direct3D como 0, 2 y 1.For example, if your vertices are indexed as 0, 1, and 2 in your OpenGL pipeline, pass them to Direct3D as 0, 2, 1 instead.
  • Usa la matriz de vista para escalar el espacio entre palabras en -1.0f en la dirección z, invirtiendo efectivamente las coordenadas del eje z.Use the view matrix to scale world space by -1.0f in the z direction, effectively reversing the z-axis coordinates. Para ello, invierte el signo de valores en las posiciones M31, M32 y M33 de la matriz de vista (cuando realices la migración al tipo Matrix).To do this, flip the sign of the values at positions M31, M32, and M33 in your view matrix (when porting it to the Matrix type). Si M34 no es 0, invierte este signo también.If M34 is not 0, flip its sign as well.

Si embargo Direct3D puede admitir un sistema de coordenadas a la derecha.However, Direct3D can support a right-handed coordinate system. DirectMath proporciona una serie de funciones que operan en sistemas de coordenadas a la derecha y a la izquierda.DirectXMath provides a number of functions that operate on and across both left-handed and right-handed coordinate systems. Pueden usarse para preservar parte de los datos originales de tu malla y procesamiento de matriz.They can be used to preserve some of your original mesh data and matrix processing. Incluyen:They include:

Función de matriz DirectXMathDirectXMath matrix function DescripciónDescription
XMMatrixLookAtLHXMMatrixLookAtLH Crea una matriz de vista para un sistema de coordenadas a la izquierda usando una posición de cámara, una dirección hacia arriba y un punto focal.Builds a view matrix for a left-handed coordinate system using a camera position, an up direction, and a focal point.
XMMatrixLookAtRHXMMatrixLookAtRH Crea una matriz de vista para un sistema de coordenadas a la derecha usando una posición de cámara, una dirección hacia arriba y un punto focal.Builds a view matrix for a right-handed coordinate system using a camera position, an up direction, and a focal point.
XMMatrixLookToLHXMMatrixLookToLH Crea una matriz de vista para un sistema de coordenadas a la izquierda usando una posición de cámara, una dirección hacia arriba y una dirección de cámara.Builds a view matrix for a left-handed coordinate system using a camera position, an up direction, and a camera direction.
XMMatrixLookToRHXMMatrixLookToRH Crea una matriz de vista para un sistema de coordenadas a la derecha usando una posición de cámara, una dirección hacia arriba y una dirección de cámara.Builds a view matrix for a right-handed coordinate system using a camera position, an up direction, and a camera direction.
XMMatrixOrthographicLHXMMatrixOrthographicLH Crea una matriz de proyección ortogonal para un sistema de coordenadas a la izquierda.Builds an orthogonal projection matrix for a left-handed coordinate system.
XMMatrixOrthographicOffCenterLHXMMatrixOrthographicOffCenterLH Crea una matriz de proyección ortogonal personalizada para un sistema de coordenadas a la izquierda.Builds a custom orthogonal projection matrix for a left-handed coordinate system.
XMMatrixOrthographicOffCenterRHXMMatrixOrthographicOffCenterRH Crea una matriz de proyección ortogonal personalizada para un sistema de coordenadas a la derecha.Builds a custom orthogonal projection matrix for a right-handed coordinate system.
XMMatrixOrthographicRHXMMatrixOrthographicRH Crea una matriz de proyección ortogonal para un sistema de coordenadas a la derecha.Builds an orthogonal projection matrix for a right-handed coordinate system.
XMMatrixPerspectiveFovLHXMMatrixPerspectiveFovLH Crea una matriz de proyección de perspectiva a la izquierda basada en un campo visual.Builds a left-handed perspective projection matrix based on a field of view.
XMMatrixPerspectiveFovRHXMMatrixPerspectiveFovRH Crea una matriz de proyección de perspectiva a la derecha basada en un campo visual.Builds a right-handed perspective projection matrix based on a field of view.
XMMatrixPerspectiveLHXMMatrixPerspectiveLH Crea una matriz de proyección de perspectiva a la izquierda.Builds a left-handed perspective projection matrix.
XMMatrixPerspectiveOffCenterLHXMMatrixPerspectiveOffCenterLH Crea una versión personalizada de una matriz de proyección de perspectiva a la izquierda.Builds a custom version of a left-handed perspective projection matrix.
XMMatrixPerspectiveOffCenterRHXMMatrixPerspectiveOffCenterRH Crea una versión personalizada de una matriz de proyección de perspectiva a la derecha.Builds a custom version of a right-handed perspective projection matrix.
XMMatrixPerspectiveRHXMMatrixPerspectiveRH Crea una matriz de proyección de perspectiva a la derecha.Builds a right-handed perspective projection matrix.

 

Preguntas más frecuentes sobre la migración de OpenGL ES 2.0 a Direct3D 11OpenGL ES2.0-to-Direct3D 11 porting Frequently Asked Questions

  • Pregunta: "En general, ¿puedo buscar ciertas cadenas o patrones en el código de OpenGL y reemplazarlos con los equivalentes de Direct3D?Question: "In general, can I search for certain strings or patterns in my OpenGL code and replace them with the Direct3D equivalents?"
  • Respuesta: No.Answer: No. OpenGL ES 2.0 y Direct3D 11 provienen de distintas generaciones de modelos de canalización de gráficos.OpenGL ES 2.0 and Direct3D 11 come from different generations of graphics pipeline modeling. Si bien hay algunas similitudes superficiales entre los conceptos y las API, como el contexto de representación y las instancias de sombreador, debes revisar esta orientación, así como la referencia de Direct3D 11, para asegurarte de tomar las mejores decisiones cuando recrees tu canalización en lugar de intentar una asignación 1 a 1.While there are some surface similarities between concepts and APIs, such as the rendering context and the instancing of shaders, you should review this guidance as well as the Direct3D 11 reference so you can make the best choices when recreating your pipeline instead of attempting a 1-to-1 mapping. Sin embargo, su vas a migrar de GLSL a HLSL, crear un conjunto de alias comunes para las variables, intrínsecos y funciones de GLSL no solo puede facilitar la migración, sino que también te permite mantener un solo conjunto de archivos de código de sombreador.However, if you are porting from GLSL to HLSL, creating a set of common aliases for GLSL variables, intrinsincs, and functions can not only make porting easier, it allows you to maintain only one set of shader code files.