Alterações importantes do Direct3D 9 para o Direct3D 11

Resumo

Este tópico explica as diferenças de alto nível entre o DirectX 9 e o DirectX 11.

O Direct3D 11 é fundamentalmente o mesmo tipo de API que o Direct3D 9, uma interface virtualizada de baixo nível em hardware gráfico. Ele ainda permite que você execute operações de desenho gráfico em uma variedade de implementações de hardware. O layout da API de gráficos foi alterado desde o Direct3D 9. O conceito de um contexto de dispositivo foi expandido, e uma API foi adicionada especificamente para infraestrutura gráfica. Os recursos armazenados no dispositivo Direct3D têm um novo mecanismo para polimorfismo de dados chamado de exibição de recursos.

Principais funções da API

No Direct3D 9, você precisava criar uma interface para a API do Direct3D antes de começar a usá-la. No jogo UWP (Plataforma Universal do Windows) do Direct3D 11, você chama uma função estática chamada de D3D11CreateDevice para criar o dispositivo e o contexto do dispositivo.

Dispositivos e contexto do dispositivo

Um dispositivo Direct3D 11 representa um adaptador gráfico virtualizado. Ele é usado para criar recursos na memória de vídeo, por exemplo, upload de texturas para a GPU, criação de visualizações de recursos de textura e cadeias de troca e criação de amostradores de textura. Para obter uma lista completa das finalidades para as quais uma interface de dispositivo do Direct3D 11 é usada, consulte ID3D11Device e ID3D11Device1.

Um Direct3D 11. o contexto do dispositivo é usado para definir o estado do pipeline e gerar comandos de renderização. Por exemplo, uma cadeia de renderização do Direct3D 11 usa um contexto de dispositivo para configurar a cadeia de renderização e desenhar a cena (veja abaixo). O contexto do dispositivo é usado para acessar (mapear) a memória de vídeo usada pelos recursos do dispositivo Direct3D. Ele também é usado para atualizar dados de sub-recursos, por exemplo, dados de buffer constantes. Para obter uma lista completa das finalidades para as quais um contexto de dispositivo Direct3D 11 é usado, consulte ID3D11DeviceContext e ID3D11DeviceContext1. Observe que a maioria de nossos exemplos usa um contexto imediato para renderizar diretamente no dispositivo, mas o Direct3D 11 também oferece suporte a contextos de dispositivo adiados, que são usados principalmente para multithreading.

No Direct3D 11, o identificador de dispositivo e o identificador de contexto de dispositivo são obtidos chamando D3D11CreateDevice. Esse método também é usado para solicitar um conjunto específico de recursos de hardware e recuperar informações sobre os níveis de recursos do Direct3D suportados pelo adaptador gráfico. Consulte Introdução a um dispositivo no Direct3D 11 para obter mais informações sobre dispositivos, contextos de dispositivo e considerações sobre threading.

Infraestrutura de dispositivos, buffers de quadros e exibições de destino de renderização

No Direct3D 11, o adaptador de dispositivo e a configuração de hardware são definidos com a API DXGI (DirectX Graphics Infrastructure) usando as interfaces COM IDXGIAdapter e IDXGIDevice1. Buffers e outros recursos de janela (visíveis ou fora da tela) são criados e configurados por interfaces DXGI específicas. A implementação do padrão de fábrica IDXGIFactory2 adquire recursos DXGI, como o buffer de quadros. Como o DXGI possui a cadeia de troca, uma interface DXGI é usada para apresentar quadros à tela. Consulte IDXGISwapChain1.

Use IDXGIFactory2 para criar uma cadeia de troca compatível com seu jogo. Você precisa criar uma cadeia de troca para uma janela principal ou para composição (interoperabilidade XAML), em vez de criar uma cadeia de troca para um HWND.

Recursos do dispositivo e exibições de recursos

O Direct3D 11 oferece suporte a um nível adicional de polimorfismo em recursos de memória de vídeo conhecidos como modos de exibição. Essencialmente, antes você tinha um único objeto Direct3D 9 para uma textura, agora você tem dois objetos: o recurso de textura, que contém os dados, e o modo de exibição de recurso, que indica como o modo de exibição é usado para renderização. Uma exibição baseada em um recurso permite que esse recurso seja usado para uma finalidade específica. Por exemplo, um recurso de textura 2D é criado como um ID3D11Texture2D e, em seguida, uma exibição de recurso de sombreador (ID3D11ShaderResourceView) é criada nele para que possa ser usada como uma textura em um sombreador. Uma exibição de destino de renderização (ID3D11RenderTargetView) também pode ser criada no mesmo recurso de textura 2D para que possa ser usada como uma superfície de desenho. Em outro exemplo, os mesmos dados de pixel são representados em 2 formatos de pixel diferentes usando 2 modos de exibição separados em um único recurso de textura.

O recurso subjacente deve ser criado com propriedades compatíveis com o tipo de modos de exibição que serão criados a partir dele. Por exemplo, se um ID3D11RenderTargetView for aplicado a uma superfície, essa superfície será criada com o sinalizador D3D11_BIND_RENDER_TARGET. A superfície também tem de ter um formato de superfície DXGI compatível com renderização (ver DXGI_FORMAT).

A maioria dos recursos usados para renderização herda da interface ID3D11Resource, que herda de ID3D11DeviceChild. Buffers de vértice, buffers de índice, buffers constantes e sombreadores são todos recursos do Direct3D 11. Os layouts de entrada e os estados do amostrador herdam diretamente de ID3D11DeviceChild.

As exibições de recursos usam um valor de enumeração DXGI_FORMAT para indicar o formato de pixel. Nem todo D3DFMT é suportado como um DXGI_FORMAT. Por exemplo, não há nenhum formato RGB de 24bpp no DXGI que seja equivalente a D3DFMT_R8G8B8. Também não há equivalentes BGR para todos os formatos RGB (DXGI_FORMAT_R10G10B10A2_UNORM é equivalente a D3DFMT_A2B10G10R10, mas não há equivalente direto a D3DFMT_A2R10G10B10). Você deve planejar converter qualquer conteúdo nesses formatos herdados em formatos suportados no momento da compilação. Para obter uma lista completa de formatos DXGI, consulte a enumeração DXGI_FORMAT.

Os recursos de dispositivo Direct3D (e exibições de recursos) são criados antes que a cena seja renderizada. Os contextos de dispositivo são usados para configurar a cadeia de renderização, conforme explicado abaixo.

Contexto do dispositivo e a cadeia de renderização

No Direct3D 9 e no Direct3D 10.x, havia um único objeto de dispositivo Direct3D que gerenciava a criação, o estado e o desenho de recursos. No Direct3D 11, a interface de dispositivo Direct3D ainda gerencia a criação de recursos, mas todas as operações de estado e desenho são manipuladas usando um contexto de dispositivo Direct3D. Aqui está um exemplo de como o contexto do dispositivo (interface ID3D11DeviceContext1) é usado para configurar a cadeia de renderização:

  • Definir e limpar exibições de destino de renderização (e exibição de estêncil de profundidade)
  • Definir o buffer de vértice, o buffer de índice e o layout de entrada para o estágio do assembler de entrada (estágio IA)
  • Vincular sombreadores de vértice e pixel ao pipeline
  • Vincular buffers constantes a sombreadores
  • Vincular modos de exibição de textura e amostradores ao sombreador de pixel
  • Desenhar a cena

Quando um dos métodos ID3D11DeviceContext::Draw é chamado, a cena é desenhada na exibição de destino de renderização. Quando terminar todo o seu desenho, o adaptador DXGI será usado para apresentar o quadro concluído chamando IDXGISwapChain1::Present1.

Gerenciamento de estado

Configurações de estado gerenciado do Direct3D 9 com um grande conjunto de alternâncias individuais definidas com os métodos SetRenderState, SetSamplerState e SetTextureStageState. Como o Direct3D 11 não oferece suporte ao pipeline de função fixa herdado, SetTextureStageState é substituído por sombreadores de pixel (PS) de gravação. Não há equivalente a um bloco de estado do Direct3D 9. Em vez disso, o Direct3D 11 gerencia o estado por meio do uso de 4 tipos de objetos de estado que fornecem uma maneira mais simplificada de agrupar o estado de renderização.

Por exemplo, em vez de usar SetRenderState com D3DRS_ZENABLE, você cria um objeto DepthStencilState com essa e outras configurações de estado relacionadas e usa-o para alterar o estado durante a renderização.

Ao fazer a portabilidade de aplicativos Direct3D 9 para objetos de estado, esteja ciente de que suas várias combinações de estado são representadas como objetos de estado imutáveis. Eles devem ser criados uma vez e reutilizados enquanto forem válidos.

Níveis de recursos do Direct3D

O Direct3D tem um novo mecanismo para determinar o suporte de hardware chamado de níveis de recurso. Os níveis de recursos simplificam a tarefa de descobrir o que o adaptador gráfico pode fazer, permitindo que você solicite um conjunto bem definido de funcionalidades da GPU. Por exemplo, o nível de recurso 9_1 implementa a funcionalidade fornecida pelos adaptadores gráficos Direct3D 9, incluindo o modelo de sombreador 2.x. Como o 9_1 é o nível de recurso mais baixo, você pode esperar que todos os dispositivos ofereçam suporte a um sombreador de vértice e um sombreador de pixel, que eram os mesmos estágios suportados pelo modelo de sombreador programável do Direct3D 9.

Seu jogo usará D3D11CreateDevice para criar o dispositivo Direct3D e o contexto do dispositivo. Quando você chama essa função, você fornece uma lista de níveis de recursos que seu jogo pode suportar. Ele retornará o nível de recurso mais alto suportado dessa lista. Por exemplo, se o seu jogo puder usar texturas BC4/BC5 (um recurso do hardware DirectX 10), você incluiria pelo menos 9_1 e 10_0 na lista de níveis de recursos com suporte. Se o jogo estiver sendo executado em hardware DirectX 9, e as texturas BC4/BC5 não puderem ser usadas, o D3D11CreateDevice retornará 9_1. Em seguida, seu jogo pode voltar para um formato de textura diferente (e texturas menores).

Se você decidir estender seu jogo Direct3D 9 para oferecer suporte a níveis de recursos Direct3D mais altos, é melhor concluir a portabilidade do código gráfico Direct3D 9 existente primeiro. Depois que seu jogo estiver funcionando no Direct3D 11, será mais fácil adicionar caminhos de renderização adicionais com gráficos aprimorados.

Consulte Níveis de recurso do Direct3D para obter uma explicação detalhada do suporte ao nível de recurso. Consulte Recursos do Direct3D 11 e Recursos do Direct3D 11.1 para obter uma lista completa dos recursos do Direct3D 11.

Níveis de recursos e o pipeline programável

O hardware continuou a evoluir desde o Direct3D 9, e vários novos estágios opcionais foram adicionados ao pipeline de gráficos programáveis. O conjunto de opções que você tem para o pipeline de elementos gráficos varia de acordo com o nível de recurso do Direct3D. O nível de recurso 10.0 inclui o estágio de sombreador de geometria com saída de fluxo opcional para renderização do Multipass na GPU. O nível de recurso 11_0 inclui o sombreador de envoltório e o sombreador de domínio para uso com tesselação de hardware. O nível de recurso 11_0 também inclui suporte completo para sombreadores DirectCompute, enquanto os níveis de recurso 10.x incluem apenas suporte para uma forma limitada de DirectCompute.

Todos os sombreadores são gravados em HLSL usando um perfil de sombreador que corresponde a um nível de recurso do Direct3D. Os perfis de sombreador são compatíveis com versões posteriores, portanto, um sombreador HLSL que compila usando vs_4_0_level_9_1 ou ps_4_0_level_9_1 funcionará em todos os dispositivos. Os perfis de sombreador não são compatíveis com versões anteriores, portanto, um sombreador compilado usando vs_4_1 só funcionará em dispositivos com nível de recurso 10_1, 11_0 ou 11_1.

O Direct3D 9 gerenciou constantes para sombreadores usando uma matriz compartilhada com SetVertexShaderConstant e SetPixelShaderConstant. O Direct3D 11 usa buffers constantes, que são recursos como um buffer de vértice ou buffer de índice. Os buffers constantes são projetados para serem atualizados de forma eficiente. Em vez de ter todas as constantes de sombreador organizadas em uma única matriz global, você organiza suas constantes em agrupamentos lógicos e as gerencia por meio de um ou mais buffers constantes. Ao fazer a portabilidade do seu jogo Direct3D 9 para o Direct3D 11, planeje organizar seus buffers constantes para que você possa atualizá-los adequadamente. Por exemplo, agrupar constantes de sombreador que não são atualizadas a cada quadro em um buffer constante separado, para que você não precise carregar constantemente esses dados no adaptador gráfico junto com suas constantes de sombreador mais dinâmicas.

Observação A maioria dos aplicativos Direct3D 9 fez uso extensivo de sombreadores, mas ocasionalmente de uso misto do comportamento de função fixa herdado. Observe que o Direct3D 11 usa apenas um modelo de sombreamento programável. Os recursos de função fixa herdados do Direct3D 9 foram preteridos.