Mapear recursos do DirectX 9 para APIs do DirectX 11
Entenda como os recursos que seu jogo Direct3D 9 usa serão convertidos para o Direct3D 11 e a Plataforma Universal do Windows (UWP).
Consulte também Planejar sua porta DirectX e Alterações importantes do Direct3D 9 para o Direct3D 11.
Mapeando APIs do Direct3D 9 para o DirectX 11
O Direct3D ainda é a base dos elementos gráficos do DirectX, mas a API mudou desde o DirectX 9:
- O Microsoft DirectX Graphics Infrastructure (DXGI) é usado para configurar adaptadores gráficos. Use o DXGI para selecionar formatos de buffer, criar cadeias de troca, apresentar quadros e criar recursos compartilhados. Consulte Visão geral do DXGI.
- Um contexto de dispositivo Direct3D é usado para definir o estado do pipeline e gerar comandos de renderização. A maioria de nossos exemplos usa um contexto imediato para renderizar diretamente no dispositivo; O Direct3D 11 também dá suporte à renderização multithread, caso em que contextos adiados são usados. Consulte Introdução a um dispositivo no Direct3D 11.
- Alguns recursos foram preteridos, principalmente o pipeline de função fixa. Consulte Recursos preteridos.
Para obter uma lista completa dos recursos do Direct3D 11, consulte Recursos do Direct3D 11 e Recursos do Direct3D 11.
Movendo do Direct2D 9 para o Direct2D 11
O Direct2D (Windows) ainda é uma parte importante dos elementos gráficos do DirectX e do Windows. Você ainda pode usar o Direct2D para desenhar jogos 2D e desenhar HUDs (sobreposições) sobre o Direct3D.
Direct2D é executado sobre Direct3D; Os jogos 2D podem ser implementados usando qualquer API. Por exemplo, um jogo 2D implementado usando Direct3D pode usar projeção ortográfica, definir valores Z para controlar a ordem de desenho de primitivos e usar sombreadores de pixel para adicionar efeitos especiais.
Como o Direct2D é baseado no Direct3D, ele também usa DXGI e contextos de dispositivo. Consulte Visão geral da API Direct2D.
A API DirectWrite adiciona suporte para texto formatado usando Direct2D. Consulte Introdução ao DirectWrite.
Substituir bibliotecas auxiliares obsoletas
D3DX e DXUT foram preteridos e não podem ser usados por jogos UWP. Essas bibliotecas auxiliares forneciam recursos para tarefas como carregamento de textura e carregamento de malha.
- O passo a passo Porta simples do Direct3D 9 para UWP demonstra como configurar uma janela, inicializar o Direct3D e fazer renderização 3D básica.
- O passo a passo do jogo UWP simples com DirectX demonstra tarefas comuns de programação de jogos, incluindo gráficos, carregamento de arquivos, interface do usuário, controles e som.
- O projeto da comunidade do Kit de Ferramentas do DirectX oferece classes auxiliares para uso com aplicativos Direct3D 11 e UWP.
Mover programas de sombreador de FX para HLSL
A biblioteca de utilitários D3DX (D3DX 9, D3DX 10 e D3DX 11), incluindo Efeitos, foi preterida para UWP. Todos os jogos DirectX para UWP conduzem o pipeline de gráficos usando HLSL sem Efeitos.
O Visual Studio ainda usa o FXC nos bastidores para compilar objetos de sombreador. Os sombreadores de jogo UWP são compilados com antecedência. O bytecode é carregado em runtime e, em seguida, cada recurso de sombreador é associado ao pipeline de gráficos durante a passagem de renderização apropriada. Os sombreadores devem ser movidos para seus próprios arquivos . Arquivos HLSL e técnicas de renderização devem ser implementados em seu código C++.
Para obter uma visão rápida do carregamento de recursos de sombreador, consulte Portabilidade simples do Direct3D 9 para a UWP.
O Direct3D 11 introduziu o Modelo de Sombreador 5, que requer o nível de recurso do Direct3D 11_0 (ou superior). Consulte Recursos do Modelo de Sombreador HLSL 5 para Direct3D 11.
Substitua XNAMath e D3DXMath
O código que usa XNAMath (ou D3DXMath) deve ser migrado para o DirectXMath. O DirectXMath inclui tipos que são portáteis em x86, x64 e Arm. Consulte Migração de código da Biblioteca de matemática XNA.
Observe que os tipos flutuantes DirectXMath são convenientes para uso com sombreadores. Por exemplo , XMFLOAT4 e XMFLOAT4X4 alinhar convenientemente os dados para buffers constantes.
Substitua o DirectSound pelo XAudio2 (e áudio em segundo plano)
Não há suporte para DirectSound para UWP:
- Use o XAudio2 para adicionar efeitos sonoros ao seu jogo.
Substituir DirectInput por APIs XInput e Windows Runtime
Não há suporte para DirectInput para UWP:
- Use retornos de chamada de evento de entrada CoreWindow para entrada de mouse, teclado e toque.
- Use o XInput 1.4 para suporte ao controlador de jogo (e suporte ao fone de ouvido do controlador de jogo). Se você estiver usando uma base de código compartilhada para área de trabalho e UWP, consulte Versões XInput para obter informações sobre compatibilidade com versões anteriores.
- Registre-se para eventos EdgeGesture se o jogo precisar usar a barra de aplicativos.
Usar o Microsoft Media Foundation em vez do DirectShow
O DirectShow não faz mais parte da API do DirectX (ou da API do Windows). O Microsoft Media Foundation fornece conteúdo de vídeo para o Direct3D usando superfícies compartilhadas. Consulte APIs de vídeo do Direct3D 11.
Substitua o DirectPlay pelo código de rede
O Microsoft DirectPlay foi preterido. Se o jogo usar serviços de rede, você precisará fornecer um código de rede que esteja em conformidade com os requisitos da UWP. Use as seguintes APIs:
- Win32 e COM para aplicativos UWP (rede) (Windows)
- Namespace Windows.Networking (Windows)
- Namespace Windows.Networking.Sockets (Windows)
- Namespace Windows.Networking.Connectivity (Windows)
- Namespace Windows.ApplicationModel.Background (Windows)
Os artigos a seguir ajudam você a adicionar recursos de rede e declarar suporte para rede no manifesto do pacote do aplicativo.
- Conectando-se com soquetes (aplicativos UWP em C#/VB/C++ e XAML) (Windows)
- Conectando-se com WebSockets (aplicativos UWP em C#/VB/C++ e XAML) (Windows)
- Conectando-se a serviços Web (aplicativos UWP em C#/VB/C++ e XAML) (Windows)
- Noções básicas de rede
Observe que todos os aplicativos UWP (incluindo jogos) usam tipos específicos de tarefas em segundo plano para manter a conectividade enquanto o aplicativo está suspenso. Se o jogo precisar manter o estado de conexão enquanto estiver suspenso, consulte Noções básicas de rede.
Mapeamento de função
Use a tabela a seguir para ajudar a converter o código do Direct3D 9 para o Direct3D 11. Isso também pode ajudar a distinguir entre o dispositivo e o contexto do dispositivo.
Direct3D9 | Direct3D 11 equivalente |
---|---|
Os estágios do pipeline de gráficos são descritos em Pipeline de Gráficos. |
|
Chame IDXGISwapChain1::P resent1 com o sinalizador DXGI_PRESENT_TEST definido. |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
Sem equivalente direto |
|
Use APIs de cursor padrão. |
|
LOST e POOL_MANAGED não existem mais. IDXGISwapChain1::P resent1 pode falhar com um DXGI_ERROR_DEVICE_REMOVED valor retornado. |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
O pipeline de função fixa foi preterido. |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
Os bits de capacidade são substituídos por níveis de recursos. Apenas alguns casos de uso de formato e recurso são opcionais para qualquer nível de recurso. Eles podem ser verificados com ID3D11Device::CheckFeatureSupport e ID3D11Device::CheckFormatSupport. |
Mapeamento de formato de superfície
Use a tabela a seguir para converter formatos Direct3D 9 em formatos DXGI.
Formato Direct3D 9 | Formato do Direct3D 11 |
---|---|
D3DFMT_UNKNOWN |
DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 |
Não disponível |
D3DFMT_A8R8G8B8 |
DXGI_FORMAT_B8G8R8A8_UNORM DXGI_FORMAT_B8G8R8A8_UNORM_SRGB |
D3DFMT_X8R8G8B8 |
DXGI_FORMAT_B8G8R8X8_UNORM DXGI_FORMAT_B8G8R8X8_UNORM_SRGB |
D3DFMT_R5G6B5 |
DXGI_FORMAT_B5G6R5_UNORM |
D3DFMT_X1R5G5B5 |
Não disponível |
D3DFMT_A1R5G5B5 |
DXGI_FORMAT_B5G5R5A1_UNORM |
D3DFMT_A4R4G4B4 |
DXGI_FORMAT_B4G4R4A4_UNORM |
D3DFMT_R3G3B2 |
Não disponível |
D3DFMT_A8 |
DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 |
Não disponível |
D3DFMT_X4R4G4B4 |
Não disponível |
D3DFMT_A2B10G10R10 |
DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 |
DXGI_FORMAT_R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 |
Não disponível |
D3DFMT_G16R16 |
DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 |
Não disponível |
D3DFMT_A16B16G16R16 |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 |
Não disponível |
D3DFMT_P8 |
Não disponível |
D3DFMT_L8 |
DXGI_FORMAT_R8_UNORM
Observação Use .r swizzle no sombreador para duplicar o vermelho para outros componentes para obter o comportamento do Direct3D 9.
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
Observação Use swizzle .rrrg no sombreador para duplicar o vermelho e mover o verde para os componentes alfa para obter o comportamento do Direct3D 9.
|
D3DFMT_A4L4 |
Não disponível |
D3DFMT_V8U8 |
DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 |
Não disponível |
D3DFMT_X8L8V8U8 |
Não disponível |
D3DFMT_Q8W8V8U8 |
DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 |
DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 |
Não disponível |
D3DFMT_A2W10V10U10 |
Não disponível |
D3DFMT_UYVY |
Não disponível |
D3DFMT_R8G8_B8G8 |
DXGI_FORMAT_G8R8_G8B8_UNORM
Observação No Direct3D 9, os dados foram dimensionados em 255.0f, mas isso pode ser tratado no sombreador.
|
D3DFMT_YUY2 |
Não disponível |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
Observação No Direct3D 9, os dados foram dimensionados em 255.0f, mas isso pode ser tratado no sombreador.
|
D3DFMT_DXT1 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB
Observação DXT1 e DXT2 são os mesmos de uma perspectiva de API/hardware. A única diferença é se o alfa pré-multiplicado é usado, que pode ser rastreado por um aplicativo e não precisa de um formato separado.
|
D3DFMT_DXT3 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
Observação DXT3 e DXT4 são os mesmos do ponto de vista da API/hardware. A única diferença é se o alfa pré-multiplicado é usado, que pode ser rastreado por um aplicativo e não precisa de um formato separado.
|
D3DFMT_DXT5 |
DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 & D3DFMT_D16_LOCKABLE |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 |
Não disponível |
D3DFMT_D15S1 |
Não disponível |
D3DFMT_D24S8 |
Não disponível |
D3DFMT_D24X8 |
Não disponível |
D3DFMT_D24X4S4 |
Não disponível |
D3DFMT_D16 |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE |
DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 |
Não disponível |
D3DFMT_S1D15 |
Não disponível |
D3DFMT_S8D24 |
DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 |
Não disponível |
D3DFMT_X4S4D24 |
Não disponível |
D3DFMT_L16 |
DXGI_FORMAT_R16_UNORM
Observação Use .r swizzle no sombreador para duplicar o vermelho para outros componentes para obter o comportamento D3D9.
|
D3DFMT_INDEX16 |
DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 |
DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 |
Não disponível |
D3DFMT_R16F |
DXGI_FORMAT_R16_FLOAT |
D3DFMT_G16R16F |
DXGI_FORMAT_R16G16_FLOAT |
D3DFMT_A16B16G16R16F |
DXGI_FORMAT_R16G16B16A16_FLOAT |
D3DFMT_R32F |
DXGI_FORMAT_R32_FLOAT |
D3DFMT_G32R32F |
DXGI_FORMAT_R32G32_FLOAT |
D3DFMT_A32B32G32R32F |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DFMT_CxV8U8 |
Não disponível |
D3DDECLTYPE_FLOAT1 |
DXGI_FORMAT_R32_FLOAT |
D3DDECLTYPE_FLOAT2 |
DXGI_FORMAT_R32G32_FLOAT |
D3DDECLTYPE_FLOAT3 |
DXGI_FORMAT_R32G32B32_FLOAT |
D3DDECLTYPE_FLOAT4 |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DDECLTYPED3DCOLOR |
Não disponível |
D3DDECLTYPE_UBYTE4 |
DXGI_FORMAT_R8G8B8A8_UINT
Observação O sombreador obtém valores UINT, mas se forem necessários floats integrais de estilo Direct3D 9 (0.0f, 1.0f... 255.f), UINT pode ser convertido em float32 no sombreador.
|
D3DDECLTYPE_SHORT2 |
DXGI_FORMAT_R16G16_SINT
Observação O sombreador obtém valores SINT, mas se floats integrais de estilo Direct3D 9 forem necessários, SINT poderá ser convertido em float32 no sombreador.
|
D3DDECLTYPE_SHORT4 |
DXGI_FORMAT_R16G16B16A16_SINT
Observação O sombreador obtém valores SINT, mas se floats integrais de estilo Direct3D 9 forem necessários, SINT poderá ser convertido em float32 no sombreador.
|
D3DDECLTYPE_UBYTE4N |
DXGI_FORMAT_R8G8B8A8_UNORM |
D3DDECLTYPE_SHORT2N |
DXGI_FORMAT_R16G16_SNORM |
D3DDECLTYPE_SHORT4N |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DDECLTYPE_USHORT2N |
DXGI_FORMAT_R16G16_UNORM |
D3DDECLTYPE_USHORT4N |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DDECLTYPE_UDEC3 |
Não disponível |
D3DDECLTYPE_DEC3N |
Não disponível |
D3DDECLTYPE_FLOAT16_2 |
DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 |
DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' |
DXGI_FORMAT_BC4_UNORM
Observação Requer o nível de recurso 10.0 ou posterior
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
Observação Requer o nível de recurso 10.0 ou posterior
|
Informações adicionais de mapeamento
- IDirect3DDevice9::SetCursorPosition é substituído por SetCursorPos.
- IDirect3DDevice9::SetCursorProperties é substituído por SetCursor.
- IDirect3DDevice9::SetIndices é substituído por ID3D11DeviceContext::IASetIndexBuffer.
- IDirect3DDevice9::SetRenderTarget é substituído por ID3D11DeviceContext::OMSetRenderTargets.
- IDirect3DDevice9::SetScissorRect é substituído por ID3D11DeviceContext::RSSetScissorRects.
- IDirect3DDevice9::SetStreamSource é substituído por ID3D11DeviceContext::IASetVertexBuffers.
- IDirect3DDevice9::SetVertexDeclaration é substituído por ID3D11DeviceContext::IASetInputLayout.
- IDirect3DDevice9::SetViewport é substituído por ID3D11DeviceContext::RSSetViewports.
- IDirect3DDevice9::ShowCursor é substituído por ShowCursor.
O controle da rampa gama de hardware da placa de vídeo por meio de IDirect3DDevice9::SetGammaRamp é substituído por IDXGIOutput::SetGammaControl. Consulte Uso da correção de gama.
IDirect3DDevice9::P rocessVertices é substituído pela funcionalidade Stream-Output de Geometry Shaders. Consulte Introdução ao estágio de saída de fluxo.
O método IDirect3DDevice9::SetClipPlane para definir planos de clipe do usuário foi substituído pela semântica de saída do sombreador de vértice HLSL SV_ClipDistance (consulte Semântica), disponível em VS_4_0 e superior, ou pelo novo atributo de função clipplanes HLSL (consulte Planos de clipe do usuário no hardware de nível de recurso 9).
IDirect3DDevice9::SetPaletteEntries e IDirect3DDevice9::SetCurrentTexturePalette foram preteridos. Substitua-os por um sombreador de pixel que procure cores em uma textura de R8G8B8A8 de 256x1.
Funções de mosaico de função fixa, como DrawRectPatch, DrawTriPatch, SetNPatchMode e DeletePatch , foram preteridas. Substitua-os por sombreadores de mosaico SM5.0 de pipeline programável (se o hardware der suporte a sombreadores de mosaico).
Não há mais suporte para códigos IDirect3DDevice9::SetFVF e FVF. Você deve portar de códigos FVF D3D8/D3D9 para declarações de vértice D3D9 antes de portar para layouts de entrada D3D11.
Todos os tipos de D3DDECLTYPE que não têm suporte direto podem ser emulados de forma bastante eficiente com um pequeno número de operações bit a bit no início de um sombreador de vértice em VS_4_0 e superior.