Cambios importantes en Direct3D 11 respecto de Direct3D 9Important changes from Direct3D 9 to Direct3D 11

ResumenSummary

En este tema se explican las diferencias de alto nivel entre DirectX 9 y DirectX 11.This topic explains the high-level differences between DirectX 9 and DirectX 11.

Direct3D 11 es esencialmente el mismo tipo de API que Direct3D 9, una interfaz virtualizada de bajo nivel en hardware gráfico.Direct3D 11 is fundamentally the same type of API as Direct3D 9 - a low-level, virtualized interface into graphics hardware. Todavía te permite realizar operaciones de dibujo gráfico en una variedad de implementaciones de hardware.It still allows you to perform graphics drawing operations on a variety of hardware implementations. El diseño de la API gráfica cambió desde Direct3D 9. Se expandió el concepto de un contexto de dispositivo y se agregó una API específicamente para infraestructura gráfica.The layout of the graphics API has changed since Direct3D 9; the concept of a device context has been expanded, and an API has been added specifically for graphics infrastructure. Los recursos almacenados en el dispositivo de Direct3D tienen un mecanismo nuevo para el polimorfismo de datos llamado vista de recursos.Resources stored on the Direct3D device have a novel mechanism for data polymorphism called a resource view.

Funciones API claveCore API functions

En Direct3D 9 tenías que crear una interfaz con la API de Direct3D antes de poder empezar a usarla.In Direct3D 9 you had to create an interface to the Direct3D API before you could start using it. En tu juego Direct3D 11 de la Plataforma universal de Windows (UWP), llamas a una función estática llamada D3D11CreateDevice para crear el dispositivo y el contexto de dispositivo.In your Direct3D 11 Universal Windows Platform (UWP) game, you call a static function called D3D11CreateDevice to create the device and the device context.

Dispositivo y contexto de dispositivoDevices and device context

Un dispositivo Direct3D 11 representa una tarjeta gráfica virtualizada.A Direct3D 11 device represents a virtualized graphics adapter. Se usa para crear recursos en memoria de vídeo, por ejemplo: cargar texturas a la GPU creando vistas sobre recursos de textura y cadenas de intercambio, y creando muestras de texturas.It's used to create resources in video memory, for example: uploading textures to the GPU, creating views on texture resources and swap chains, and creating texture samplers. Para obtener una lista completa de para qué se usa una interfaz de dispositivo de Direct3D 11, consulta ID3D11Device y ID3D11Device1.For a complete list of what a Direct3D 11 device interface is used for see ID3D11Device and ID3D11Device1.

Un contexto de dispositivo de Direct3D 11A Direct3D 11. se usa para establecer el estado de la canalización y generar comandos de representación.device context is used to set pipeline state and generate rendering commands. 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 (consulta a continuación).For example, a Direct3D 11 rendering chain uses a device context to set up the rendering chain and draw the scene (see below). El contexto de dispositivo se usa para acceder (asignar) a la memoria de vídeo usada por los recursos de dispositivo de Direct3D. También se usa para actualizar los datos de los subrecursos, por ejemplo, los datos del búfer de constantes.The device context is used to access (map) video memory used by Direct3D device resources; it's also used to update subresource data, for example constant buffer data. Para obtener una lista completa de para qué se usa una interfaz de dispositivo de Direct3D 11, consulta ID3D11DeviceContext y ID3D11DeviceContext1.For a complete list of what a Direct3D 11 device context is used for see ID3D11DeviceContext and ID3D11DeviceContext1. Ten en cuenta que la mayoría de las muestras usan un contexto inmediato para representar directamente en el dispositivo, pero Direct3D 11 también admite contextos de dispositivo diferidos, que se usan principalmente para multithreading.Note that most of our samples use an immediate context to render directly to the device, but Direct3D 11 also supports deferred device contexts, which are primarily used for multithreading.

En Direct3D 11, tanto el controlador de dispositivos como el controlador de contexto de dispositivos se obtienen llamando a D3D11CreateDevice.In Direct3D 11, the device handle and device context handle are both obtained by calling D3D11CreateDevice. Este método es también donde pides un conjunto específico de características de hardware y se recupera información sobre los niveles de característica de Direct3D admitidos por la tarjeta gráfica.This method is also where you request a specific set of hardware features and retrieve information on Direct3D feature levels supported by the graphics adapter. Consulta el tema de introducción a un dispositivo en Direct3D 11 para obtener más información sobre los dispositivos, los contextos de dispositivo y los subprocesos.See Introduction to a Device in Direct3D 11 for more info on devices, device contexts, and threading considerations.

Infraestructura de dispositivo, búferes de cuadros y vistas de destino de representaciónDevice infrastructure, frame buffers, and render target views

En Direct3D 11, la configuración de hardware y adaptador de dispositivo se establece con la API de la infraestructura de gráficos de DirectX (DXGI) mediante el uso de las interfaces COM IDXGIAdapter y IDXGIDevice1.In Direct3D 11, the device adapter and hardware configuration are set with the DirectX Graphics Infrastructure (DXGI) API using the IDXGIAdapter and IDXGIDevice1 COM interfaces. Interfaces de DXGI específicas crean y configuran búferes y demás recursos de ventana (visible o fuera de pantalla). La implementación de factores de fábrica de IDXGIFactory2 adquiere recursos de DXGI como el búfer de cuadros.Buffers and other window resources (visible or offscreen) are created and configured by specific DXGI interfaces; the IDXGIFactory2 factory pattern implementation acquires DXGI resources such as the frame buffer. Dado que DXGI es dueño de la cadena de intercambio, se usa una interfaz de DXGI para presentar los cuadros en la pantalla. Consulta IDXGISwapChain1.Since DXGI owns the swap chain, a DXGI interface is used to present frames to the screen - see IDXGISwapChain1.

Usa IDXGIFactory2 para crear una cadena de intercambio compatible con tu juego.Use IDXGIFactory2 to create a swap chain compatible with your game. Debes crear una cadena de intercambio para una ventana principal o para composición (interoperación de AML), en lugar de crear una cadena de intercambio para un HWND.You need to create a swap chain for a core window, or for composition (XAML interop), instead of creating a swap chain for an HWND.

Recursos de dispositivo y vistas de recursoDevice resources and resource views

Direct3D 11 admite un nivel adicional de polimorfismo en recursos de memoria de vídeo conocidos como vistas.Direct3D 11 supports an additional level of polymorphism on video memory resources known as views. En esencia, donde tenías un único objeto de Direct3D 9 para textura, ahora tienes dos objetos: el recurso de textura, que contiene los datos, y la vista de recurso, que indica cómo se usa la vista para representación.Essentially, where you had a single Direct3D 9 object for a texture, you now have two objects: the texture resource, which holds the data, and the resource view, which indicates how the view is used for rendering. Una vista basada en un recurso permite que este se use para un fin específico.A view based on a resource enables that resource to be used for a specific purpose. Por ejemplo, se crea un recurso de textura 2D como ID3D11Texture2D. Después se crea una vista de recurso de sombreador (ID3D11ShaderResourceView) en él para que pueda usarse como textura en un sombreador.For example, a 2D texture resource is created as an ID3D11Texture2D, then a shader resource view (ID3D11ShaderResourceView) is created on it so it can be used as a texture in a shader. También puede crearse una vista de destino de representación (ID3D11RenderTargetView) en el mismo recurso de textura 2D para que pueda usarse como superficie de dibujo.A render target view (ID3D11RenderTargetView) can also be created on the same 2D texture resource so that it can be used as a drawing surface. En otro ejemplo, los mismos datos de píxeles se representan en dos formatos de píxeles diferentes usando dos vistas separadas en un único recurso de textura.In another example, the same pixel data is represented in 2 different pixel formats by using 2 separate views on a single texture resource.

Debe crearse el recurso subyacente con propiedades que son compatibles con el tipo de vistas que se crearán a partir de él.The underlying resource must be created with properties that are compatible with the type of views that will be created from it. Por ejemplo, si se aplica un ID3D11RenderTargetView a una superficie, esa superficie se crea con la marca de **destino de representación de enlace de D3D11 _ _ _ ** .For example, if an ID3D11RenderTargetView is applied to a surface, that surface is created with the D3D11_BIND_RENDER_TARGET flag. La superficie también tiene que tener un formato de superficie de DXGI compatible con la representación (consulte ** _ formato de dxgi**).The surface also has to have a DXGI surface format compatible with rendering (see DXGI_FORMAT).

La mayoría de los recursos que usas para la representación se heredan desde la interfaz de ID3D11Resource, que hereda desde ID3D11DeviceChild.Most of the resources you use for rendering inherit from the ID3D11Resource interface, which inherits from ID3D11DeviceChild. Los búferes de vértices, de índice y de constantes, y los sombreadores son todos recursos de Direct3D 11.Vertex buffers, index buffers, constant buffers, and shaders are all Direct3D 11 resources. Los estados de muestra y diseños de entrada se heredan directamente de ID3D11DeviceChild.Input layouts and sampler states inherit directly from ID3D11DeviceChild.

Las vistas de recursos usan un _ valor de enumeración de formato de DXGI para indicar el formato de píxeles.Resources views use a DXGI_FORMAT enum value to indicate the pixel format. No todos los D3DFMT se admiten como _ formato de DXGI.Not every D3DFMT is supported as a DXGI_FORMAT. Por ejemplo, no hay ningún formato 24 BPP RGB en DXGI que sea equivalente a D3DFMT _ R8G8B8.For example, there is no 24bpp RGB format in DXGI that is equivalent to D3DFMT_R8G8B8. Tampoco hay equivalentes de BGR a cada formato RGB (el formato de DXGI _ _ R10G10B10A2 _ UNORM equivale a D3DFMT _ A2B10G10R10, pero no hay ningún equivalente directo a D3DFMT _ A2R10G10B10).There are also not BGR equivalents to every RGB format (DXGI_FORMAT_R10G10B10A2_UNORM is equivalent to D3DFMT_A2B10G10R10, but there’s no direct equivalent to D3DFMT_A2R10G10B10). Debes planear convertir cualquier contenido en estos formatos heredados a los formatos admitidos en tiempo de compilación.You should plan to convert any content in these legacy formats to supported formats at build-time. Para obtener una lista completa de los formatos de DXGI, consulte la enumeración de ** _ formato de dxgi** .For a complete list of DXGI formats see the DXGI_FORMAT enumeration.

Los recursos de dispositivo de Direct3D (y las vistas de recurso) se crean antes de que se represente la escena.Direct3D device resources (and resource views) are created before the scene is rendered. Como se explica a continuación, se usan contextos de dispositivo para configurar la cadena de representación.Device contexts are used to set up the rendering chain, as explained below.

Contexto de dispositivo y la cadena de representaciónDevice context and the rendering chain

En Direct3D 9 y Direct3D 10.x, había un único objeto de dispositivo de Direct3D que administraba la creación de recursos, su estado y dibujo.In Direct3D 9 and Direct3D 10.x, there was a single Direct3D device object which managed resource creation, state, and drawing. En Direct3D 11, la interfaz del dispositivo de Direct3D sigue administrando la creación de los recursos, pero todas las operaciones de dibujo y estado se controlan mediante el uso de un contexto de dispositivo de Direct3D.In Direct3D 11, the Direct3D device interface still manages resource creation, but all state and drawing operations are handled by using a Direct3D device context. He aquí un ejemplo de cómo el contexto de dispositivo (interfaz de ID3D11DeviceContext1) se usa para configurar la cadena de representación:Here's an example of how the device context (ID3D11DeviceContext1 interface) is used to set up the rendering chain:

  • Establecer y borrar las vistas de destino de representación (y vista de galería de símbolos de profundidad)Set and clear render target views (and depth stencil view)
  • Establecer el búfer de vértices, el búfer de índice y un diseño de entrada para la fase de ensamblador de entrada (fase de IA)Set the vertex buffer, index buffer, and input layout for the input assembler stage (IA stage)
  • Enlazar vértices y sombreadores de píxeles a la canalizaciónBind vertex and pixel shaders to the pipeline
  • Enlazar búferes de constantes a los sombreadoresBind constant buffers to shaders
  • Enlazar vistas de textura y muestras al sombreador de píxelesBind texture views and samplers to the pixel shader
  • Dibujar la escenaDraw the scene

Cuando se llama a uno de los métodos de ID3D11DeviceContext::Draw, se dibuja la escena en la vista de destino de representación.When one of the ID3D11DeviceContext::Draw methods is called, the scene is drawn on the render target view. Cuando terminas con todos los dibujos, se usa el adaptador de DXGI para presentar el cuadro completado llamando a IDXGISwapChain1::Present1.When you're done will all your drawing the DXGI adapter is used to present the completed frame by calling IDXGISwapChain1::Present1.

Administración de estadoState management

Direct3D 9 administraba la configuración de estado con un gran grupo de alternancias individuales configuradas con los métodos SetRenderState, SetSamplerState y SetTextureStageState.Direct3D 9 managed state settings with a large set of individual toggles set with the SetRenderState, SetSamplerState, and SetTextureStageState methods. Dado que Direct3D 11 no admite la canalización de función fija heredada, SetTextureStageState se reemplaza escribiendo sombreadores de píxeles (PS).Since Direct3D 11 does not support the legacy fixed-function pipeline, the SetTextureStageState is replaced by writing pixel shaders (PS). No existe un equivalente para un bloque de estado de Direct3D 9.There is no equivalent to a Direct3D 9 state block. En cambio, Direct3D 11 administra el estado a través del uso de 4 tipos de objetos de estado que proporcionan una forma más fluida de agrupar el estado de representación.Direct3D 11 instead manages state through the use of 4 kinds of state objects which provide a more streamlined way to group the rendering state.

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 durante la representación.For example, instead of using SetRenderState with D3DRS_ZENABLE, you create a DepthStencilState object with this and other related state settings and use it to change state while rendering.

Cuando migres/ aplicaciones de Direct3D 9 a objetos de estado, ten en cuenta que las diversas combinaciones de estados están representadas como objetos de estado invariables.When porting Direct3D 9 applications to state objects, be aware that your various state combinations are represented as immutable state objects. Deben crearse una sola vez y volver a usarse mientras sean válidos.They should be created once and re-used as long as they are valid.

Niveles de característica de Direct3DDirect3D feature levels

Direct3D tiene un nuevo mecanismo para determinar la compatibilidad de hardware llamado niveles de característica.Direct3D has a new mechanism for determining hardware support called feature levels. Los niveles de característica simplifican la tarea de determinar qué puede hacer la tarjeta gráfica permitiéndote solicitar un conjunto bien definido de funcionalidades de GPU.Feature levels simplify the task of figuring out what the graphics adapter can do by allowing you to request a well-defined set of GPU functionality. 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.For example, the 9_1 feature level implements the functionality provided by Direct3D 9 graphics adapters, including shader model 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 admitidas por el modelo de sombreador programable de Direct3D 9.Since 9_1 is the lowest feature level, you can expect all devices to support a vertex shader and a pixel shader, which were the same stages supported by the Direct3D 9 programmable shader model.

Tu juego usará D3D11CreateDevice para crear el contexto de dispositivo y el dispositivo de Direct3D.Your game will use D3D11CreateDevice to create the Direct3D device and device context. Cuando llamas a esta función, proporcionas una lista de niveles de características que tu juego puede admitir.When you call this function you provide a list of feature levels that your game can support. Devolverá el nivel de característica admitido más alto desde esa lista.It will return the highest supported feature level from that list. Por ejemplo, si el juego puede usar texturas de las 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.For example if your game can use BC4/BC5 textures (a feature of DirectX 10 hardware), you would include at least 9_1 and 10_0 in the list of supported feature levels. Si el juego se está ejecutando en el hardware de DirectX 9 y las texturas de las texturas BC4/BC5 no se pueden usar, D3D11CreateDevice devolverá 9 _ 1.If the game is running on DirectX 9 hardware and BC4/BC5 textures can't be used, then D3D11CreateDevice will return 9_1. Entonces tu juego puede retroceder a un formato de textura diferente (y texturas menores).Then your game can fall back to a different texture format (and smaller textures).

Si decides extender tu juego de Direct3D 9 para admitir niveles de característica de Direct3D más altos, es mejor terminar de migrar primero tu código de gráficos de Direct3D 9.If you decide to extend your Direct3D 9 game to support higher Direct3D feature levels then it's better to finish porting your existing Direct3D 9 graphics code first. Después de que tu juego esté funcionando en Direct3D 11, es más fácil agregar rutas de representación adicionales con gráficos mejorados.After you have your game working in Direct3D 11, it's easier to add additional rendering paths with enhanced graphics.

Consulta Niveles de característica de Direct3D para obtener una explicación detallada de la compatibilidad de niveles de característica.See Direct3D feature levels for a detailed explanation of feature level support. Consulta Características de Direct3D 11 y Características de Direct3D 11.1 para obtener una lista completa de características de Direct3D 11.See Direct3D 11 Features and Direct3D 11.1 Features for a full list of Direct3D 11 features.

Niveles de característica y la canalización programableFeature levels and the programmable pipeline

El hardware ha continuado evolucionando desde Direct3D 9, y se han agregado varios niveles opcionales nuevos a la canalización de gráficos programable.Hardware has continue to evolve since Direct3D 9, and several new optional stages have been added to the programmable graphics pipeline. El conjunto de opciones que tienes para la canalización de gráficos varía con el nivel de característica de Direct3D.The set of options you have for the graphics pipeline varies with the Direct3D feature level. El nivel de característica 10.0 incluye la fase de sombreador de geometría con salida de secuencia opcional para una representación en la GPU.Feature level 10.0 includes the geometry shader stage with optional stream out for multipass rendering on the GPU. El nivel de característica 11 _ 0 incluye el sombreador de casco y el sombreador de dominios para su uso con la teselación de hardware.Feature level 11_0 include the hull shader and domain shader for use with hardware tessellation. El nivel de características 11 _ 0 también incluye compatibilidad total con los sombreadores de DirectCompute, mientras que los niveles de características 10. x solo incluyen compatibilidad con una forma limitada de DirectCompute.Feature level 11_0 also includes full support for DirectCompute shaders, while feature levels 10.x only include support for a limited form of DirectCompute.

Todos los sombreadores se escriben en HLSL mediante el uso de un perfil de sombreador que corresponde a un nivel de característica de Direct3D.All shaders are written in HLSL using a shader profile that corresponds to a Direct3D feature level. Los perfiles del sombreador son compatibles de forma ascendente, por lo que un sombreador HLSL que se compila usando vs _ 4 _ 0 _ nivel _ 9 _ 1 o PS _ 4 _ 0 _ nivel _ 9 _ 1 funcionará en todos los dispositivos.Shader profiles are upwards compatible, so an HLSL shader that compiles using vs_4_0_level_9_1 or ps_4_0_level_9_1 will work across all devices. Los perfiles del sombreador no son compatibles con las versiones anteriores, 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.Shader profiles are not downlevel compatible, so a shader compiled using vs_4_1 will only work on feature level 10_1, 11_0, or 11_1 devices.

Direct3D 9 administraba las constantes para los sombreadores mediante el uso de una matriz compartida con SetVertexShaderConstant y SetPixelShaderConstant.Direct3D 9 managed constants for shaders using a shared array with SetVertexShaderConstant and SetPixelShaderConstant. Direct3D 11 usa búferes de constantes, que son recursos como un búfer de vértices o un búfer de índice.Direct3D 11 uses constant buffers, which are resources like a vertex buffer or index buffer. Los búferes de constante están diseñados para actualizarse de manera eficiente.Constant buffers are designed to be updated efficiently. En lugar de tener todas las constantes de sombreador organizadas en una única matriz global, organizas tus constantes en grupos lógicos y las administras a través de uno o más búferes de constantes.Instead of having all the shader contants organized into a single global array you organize your constants into logical groupings and manage them through one or more constant buffers. Cuando migras tu juego de Direct3D 9 a Direct3D 11, planea organizar tus búferes de constantes para que puedas actualizarlos apropiadamente.When you port your Direct3D 9 game to Direct3D 11, plan to organize your constant buffers so that you can update them appropriately. Por ejemplo, agrupa las constantes de sombreador que no se actualizan en cada cuadro en un búfer de constantes separado para que no tengas que cargar constantemente esos datos en la tarjeta gráfica junto con tus constantes de sombreador más dinámicas.For example, group shader constants that aren't updated every frame into a separate constant buffer, so that you don't have to constantly upload that data to the graphics adapter along with your more dynamic shader constants.

Nota:    La mayoría de las aplicaciones de Direct3D 9 hicieron un uso intensivo de los sombreadores, pero en ocasiones se mezcla en el uso del comportamiento de la función fija heredada.Note   Most Direct3D 9 applications made extensive use of shaders, but occasionally mixed in use of the legacy fixed-function behavior. Ten en cuenta que Direct3D 11 solamente usa un modelo de sombreado programable.Note that Direct3D 11 only uses a programmable shading model. Las características de función fija heredada de Direct3D 9 dejaron de utilizarse.The legacy fixed-function features of Direct3D 9 are deprecated.