Cambios importantes en Direct3D 11 respecto de Direct3D 9

Resumen

En este tema se explican las diferencias de alto nivel entre DirectX 9 y DirectX 11.

Direct3D 11 es fundamentalmente el mismo tipo de API que Direct3D 9: una interfaz virtualizada de bajo nivel en hardware gráfico. Todavía permite realizar operaciones de dibujo de gráficos en una variedad de implementaciones de hardware. El diseño de la API de gráficos ha cambiado desde Direct3D 9; se ha ampliado el concepto de contexto de dispositivo y se ha agregado una API específicamente para la infraestructura de gráficos. Los recursos almacenados en el dispositivo Direct3D tienen un mecanismo nuevo para el polimorfismo de datos denominado vista de recursos.

Funciones principales de la API

En Direct3D 9 tenía que crear una interfaz para la API de Direct3D antes de poder empezar a usarla. En el juego de Direct3D 11 para Plataforma universal de Windows (UWP), llama a una función estática denominada D3D11CreateDevice para crear el dispositivo y el contexto del dispositivo.

Dispositivos y contexto del dispositivo

Un dispositivo Direct3D 11 representa un adaptador de gráficos virtualizado. Se usa para crear recursos en la memoria de vídeo, por ejemplo: cargar texturas en la GPU, crear vistas en recursos de textura y cadenas de intercambio y crear muestras de textura. Para obtener una lista completa de lo que se usa una interfaz de dispositivo Direct3D 11, consulte ID3D11Device e ID3D11Device1.

Un contexto de Direct3D 11 se usa para establecer el estado de canalización y generar comandos de representación. Por ejemplo, una cadena de representación de Direct3D 11 usa un contexto de dispositivo para configurar la cadena de representación y dibujar la escena (consulte a continuación). El contexto del dispositivo se usa para acceder a la memoria de vídeo (mapa) utilizada por los recursos del dispositivo Direct3D; también se usa para actualizar datos de subrecursos, por ejemplo, datos de búfer de constantes. Para obtener una lista completa de para lo que se usa un contexto de dispositivo Direct3D 11, consulte ID3D11DeviceContext y ID3D11DeviceContext1. Tenga en cuenta que la mayoría de nuestros ejemplos usan un contexto inmediato para representarse directamente en el dispositivo, pero Direct3D 11 también admite contextos de dispositivo diferidos, que se usan principalmente para subprocesos múltiples.

En Direct3D 11, el identificador de dispositivo y el identificador de contexto del dispositivo se obtienen llamando a D3D11CreateDevice. Este método también es donde se solicita un conjunto específico de características de hardware y se recupera información sobre los niveles de características de Direct3D compatibles con el adaptador de gráficos. Consulte Introducción a un dispositivo en Direct3D 11 para obtener más información sobre dispositivos, contextos de dispositivo y consideraciones sobre subprocesos.

Infraestructura de dispositivos, búferes de fotogramas y vistas de destino de representación

En Direct3D 11, el adaptador de dispositivo y la configuración de hardware se establecen con la API de infraestructura de gráficos de DirectX (DXGI) mediante las interfaces COM IDXGIAdapter e IDXGIDevice1. Los búferes y otros recursos de ventana (visibles o desactivados) se crean y configuran mediante interfaces DXGI específicas; la implementación del patrón de fábrica IDXGIFactory2 adquiere recursos DXGI, como el búfer de fotogramas. Dado que DXGI posee la cadena de intercambio, se usa una interfaz DXGI para presentar fotogramas a la pantalla (consulte IDXGISwapChain1).

Use IDXGIFactory2 para crear una cadena de intercambio compatible con su juego. Debe crear una cadena de intercambio para una ventana principal o para la composición (interoperabilidad XAML), en lugar de crear una cadena de intercambio para un HWND.

Recursos de dispositivo y vistas de recursos

Direct3D 11 admite un nivel adicional de polimorfismo en los recursos de memoria de vídeo conocidos como vistas. Básicamente, donde tenía un único objeto Direct3D 9 para una textura, ahora tiene dos objetos: el recurso de textura, que contiene los datos, y la vista de recursos, que indica cómo se usa la vista para la representación. Una vista basada en un recurso permite que ese recurso se use para un propósito específico. Por ejemplo, se crea un recurso de textura 2D como ID3D11Texture2D y, a continuación, se crea una vista de recursos del sombreador (ID3D11ShaderResourceView) para que se pueda usar como textura en un sombreador. También se puede crear una vista de destino de representación (ID3D11RenderTargetView) en el mismo recurso de textura 2D para que se pueda usar como superficie de dibujo. En otro ejemplo, los mismos datos de píxeles se representan en dos formatos de píxeles diferentes mediante 2 vistas independientes en un único recurso de textura.

El recurso subyacente debe crearse con propiedades compatibles con el tipo de vistas que se crearán a partir de él. Por ejemplo, si se aplica un ID3D11RenderTargetView a una superficie, esa superficie se crea con la marca D3D11_BIND_RENDER_TARGET. La superficie también tiene que tener un formato de superficie DXGI compatible con la representación (consulte DXGI_FORMAT).

La mayoría de los recursos que se usan para representar heredan de la interfaz ID3D11Resource, que hereda de ID3D11DeviceChild. Los búferes de vértices, los búferes de índice, los búferes de constantes y los sombreadores son todos recursos de Direct3D 11. Los diseños de entrada y los estados del muestreador heredan directamente de ID3D11DeviceChild.

Las vistas de recursos usan un valor de enumeración DXGI_FORMAT para indicar el formato de píxel. No todas las D3DFMT se admiten como DXGI_FORMAT. Por ejemplo, no hay ningún formato RGB de 24bpp en DXGI equivalente a D3DFMT_R8G8B8. Tampoco hay equivalentes BGR de todos los formatos RGB (DXGI_FORMAT_R10G10B10A2_UNORM es equivalente a D3DFMT_A2B10G10R10, pero no hay ningún equivalente directo de D3DFMT_A2R10G10B10). Debe planear convertir cualquier contenido en estos formatos heredados a formatos admitidos en tiempo de compilación. Para obtener una lista completa de formatos DXGI, consulte la enumeración DXGI_FORMAT.

Los recursos del dispositivo Direct3D (y las vistas de recursos) se crean antes de que se represente la escena. Los contextos de dispositivo se usan para configurar la cadena de representación, como se explica a continuación.

Contexto del dispositivo y la cadena de representación

En Direct3D 9 y Direct3D 10.x, había un único objeto de dispositivo Direct3D que administraba la creación, el estado y el dibujo de recursos administrados. En Direct3D 11, la interfaz de dispositivo Direct3D sigue administrando la creación de recursos, pero todas las operaciones de estado y dibujo se controlan mediante un contexto de dispositivo Direct3D. Este es un ejemplo de cómo se usa el contexto del dispositivo (interfaz ID3D11DeviceContext1) para configurar la cadena de representación:

  • Establecer y borrar vistas de destino de representación (y vista de galería de símbolos de profundidad)
  • Establecer el búfer de vértices, el búfer de índice y el diseño de entrada para la fase del ensamblador de entrada (fase IA)
  • Enlace de sombreadores de vértices y píxeles a la canalización
  • Enlace de búferes de constantes a sombreadores
  • Enlace de vistas y muestras de textura al sombreador de píxeles
  • Dibujar la escena

Cuando se llama a uno de los métodos ID3D11DeviceContext::Draw, la escena se dibuja en la vista de destino de representación. Cuando haya terminado, se usará todo el dibujo del adaptador DXGI para presentar el marco completado llamando a IDXGISwapChain1::Present1.

Administración de estados

Configuración de estado administrado de Direct3D 9 con un gran conjunto de alternancias individuales con los métodos SetRenderState, SetSamplerState y SetTextureStageState. Puesto que Direct3D 11 no admite la canalización heredada de funciones fijas, SetTextureStageState se reemplaza mediante la escritura de sombreadores de píxeles (PS). No hay ningún equivalente a un bloque de estado de Direct3D 9. Direct3D 11 administra el estado a través del uso de 4 tipos de objetos de estado que proporcionan una manera más simplificada de agrupar el estado de representación.

Por ejemplo, en lugar de usar SetRenderState con D3DRS_ZENABLE, se crea un objeto DepthStencilState con esta y otra configuración de estado relacionada y se usa para cambiar el estado mientras se representa.

Al migrar aplicaciones de Direct3D 9 a objetos de estado, tenga en cuenta que las distintas combinaciones de estado se representan como objetos de estado inmutables. Deben crearse una vez y volver a usarse siempre que sean válidos.

Niveles de característica de Direct3D

Direct3D tiene un nuevo mecanismo para determinar la compatibilidad de hardware denominada niveles de características. Los niveles de características simplifican la tarea de averiguar lo que el adaptador de gráficos puede hacer al permitirle solicitar un conjunto bien definido de funcionalidad de GPU. Por ejemplo, el nivel de característica 9_1 implementa la funcionalidad proporcionada por los adaptadores de gráficos de Direct3D 9, incluido el modelo de sombreador 2.x. Dado que 9_1 es el nivel de característica más bajo, puede esperar que todos los dispositivos admitan un sombreador de vértices y un sombreador de píxeles, que eran las mismas fases compatibles con el modelo de sombreador programable de Direct3D 9.

Su juego usará D3D11CreateDevice para crear el contexto del dispositivo y el dispositivo Direct3D. Cuando llama a esta función, proporciona una lista de niveles de características que su juego puede admitir. Devolverá el nivel de característica más alto admitido de esa lista. Por ejemplo, si su juego puede usar texturas BC4/BC5 (una característica de hardware de DirectX 10), incluiría al menos 9_1 y 10_0 en la lista de niveles de características admitidos. Si el juego se ejecuta en hardware DirectX 9 y no se pueden usar texturas BC4/BC5, D3D11CreateDevice devolverá 9_1. A continuación, su juego puede revertir a un formato de textura diferente (y texturas más pequeñas).

Si decide ampliar su juego Direct3D 9 para admitir niveles de características de Direct3D más altos, es mejor terminar de migrar primero el código gráfico de Direct3D 9 existente. Cuando el juego está funcionando en Direct3D 11, es más fácil agregar rutas de representación adicionales con gráficos mejorados.

Consulta Niveles de características de Direct3D para obtener una explicación detallada de la compatibilidad con el nivel de característica. Consulta Características de Direct3D 11 y Características de Direct3D 11.1 para obtener una lista completa de las características de Direct3D 11.

Niveles de características y canalización programable

El hardware ha evolucionado desde Direct3D 9 y se han agregado varias nuevas fases opcionales a la canalización de gráficos programables. El conjunto de opciones que tiene para la canalización de gráficos varía con el nivel de características de Direct3D. El nivel de característica 10.0 incluye la fase del sombreador de geometría con secuencia opcional para la representación multipaso en la GPU. El nivel de característica 11_0 incluye el sombreador de casco y el sombreador de dominio para su uso con teselación de hardware. El nivel de característica 11_0 también incluye compatibilidad completa con sombreadores DirectCompute, mientras que los niveles de característica 10.x solo incluyen compatibilidad con una forma limitada de DirectCompute.

Todos los sombreadores se escriben en HLSL mediante un perfil de sombreador que corresponde a un nivel de característica de Direct3D. Los perfiles de sombreador son compatibles con versiones superiores, por lo que un sombreador HLSL que se compila mediante vs_4_0_level_9_1 o ps_4_0_level_9_1 funcionará en todos los dispositivos. Los perfiles de sombreador no son compatibles con niveles inferiores, por lo que un sombreador compilado con vs_4_1 solo funcionará en dispositivos de nivel de característica 10_1, 11_0 o 11_1.

Constantes administradas de Direct3D 9 para sombreadores mediante una matriz compartida con SetVertexShaderConstant y SetPixelShaderConstant. Direct3D 11 usa búferes de constantes, que son recursos como un búfer de vértices o un búfer de índice. Los búferes de constantes están diseñados para actualizarse de forma eficaz. En lugar de tener todas las constantes del sombreador organizadas en una única matriz global, organice las constantes en agrupaciones lógicas y adminístrelas a través de uno o varios búferes de constantes. Al migrar el juego de Direct3D 9 a Direct3D 11, planee organizar los búferes de constantes para que pueda actualizarlos adecuadamente. Por ejemplo, constantes de sombreador de grupo en que cada fotograma no se actualiza en un búfer de constantes independiente, de modo que no tenga que cargar constantemente esos datos en el adaptador de gráficos junto con las constantes de sombreador más dinámicas.

Nota La mayoría de las aplicaciones Direct3D 9 usaban extensamente los sombreadores, pero ocasionalmente mezclados en el uso del comportamiento heredado de función fija. Tenga en cuenta que Direct3D 11 solo usa un modelo de sombreado programable. Las características heredadas de funciones fijas de Direct3D 9 están en desuso.