Mapper les fonctionnalités DirectX 9 aux API DirectX 11
Découvrez comment les fonctionnalités que votre jeu Direct3D 9 utilise se traduisent par Direct3D 11 et le plateforme Windows universelle (UWP).
Consultez également Planifier votre port DirectX et les modifications importantes de Direct3D 9 à Direct3D 11.
Mappage des API Direct3D 9 à DirectX 11
Direct3D est toujours la base des graphiques DirectX, mais l’API a changé depuis DirectX 9 :
- Microsoft DirectX Graphics Infrastructure (DXGI) est utilisé pour configurer des cartes graphiques. Utilisez DXGI pour sélectionner des formats de mémoire tampon, créer des chaînes d’échange, présenter des images et créer des ressources partagées. Consultez vue d’ensemble de DXGI.
- Un contexte d’appareil Direct3D est utilisé pour définir l’état du pipeline et générer des commandes de rendu. La plupart de nos exemples utilisent un contexte immédiat pour s’afficher directement sur l’appareil ; Direct3D 11 prend également en charge le rendu multithread, auquel cas les contextes différés sont utilisés. Consultez Présentation d’un appareil dans Direct3D 11.
- Certaines fonctionnalités ont été déconseillées, notamment le pipeline de fonction fixe. Voir Fonctionnalités déconseillées.
Pour obtenir la liste complète des fonctionnalités de Direct3D 11, consultez Fonctionnalités Direct3D 11 et Fonctionnalités Direct3D 11.
Passage de Direct2D 9 à Direct2D 11
Direct2D (Windows) est toujours une partie importante des graphiques DirectX et Windows. Vous pouvez toujours utiliser Direct2D pour dessiner des jeux 2D et dessiner des superpositions (HUD) sur Direct3D.
Direct2D s’exécute sur Direct3D ; Les jeux 2D peuvent être implémentés à l’aide de l’UNE ou l’autre API. Par exemple, un jeu 2D implémenté à l’aide de Direct3D peut utiliser la projection orthographique, définir des valeurs Z pour contrôler l’ordre de dessin des primitives et utiliser des nuanceurs de pixels pour ajouter des effets spéciaux.
Étant donné que Direct2D est basé sur Direct3D, il utilise également des contextes DXGI et d’appareil. Consultez Vue d’ensemble de l’API Direct2D.
L’API DirectWrite ajoute la prise en charge du texte mis en forme à l’aide de Direct2D. Consultez Présentation de DirectWrite.
Remplacer les bibliothèques d’assistance déconseillées
D3DX et DXUT sont déconseillés et ne peuvent pas être utilisés par les jeux UWP. Ces bibliothèques d’assistance ont fourni des ressources pour les tâches telles que le chargement de texture et le chargement de maillage.
- Le port simple de Direct3D 9 vers UWP explique comment configurer une fenêtre, initialiser Direct3D et effectuer un rendu 3D de base.
- Le jeu UWP simple avec procédure pas à pas DirectX illustre les tâches courantes de programmation de jeux, notamment les graphiques, le chargement de fichiers, l’interface utilisateur, les contrôles et le son.
- Le projet de communauté du Kit d’outils DirectX propose des classes d’assistance à utiliser avec les applications Direct3D 11 et UWP.
Déplacer des programmes de nuanceur de FX vers HLSL
La bibliothèque utilitaire D3DX (D3DX 9, D3DX 10 et D3DX 11), y compris Les effets, est déconseillée pour UWP. Tous les jeux DirectX pour UWP pilotent le pipeline graphique à l’aide de HLSL sans effets.
Visual Studio utilise toujours FXC sous le capot pour compiler des objets de nuanceur. Les nuanceurs de jeux UWP sont compilés à l’avance. Le bytecode est chargé au moment de l’exécution, puis chaque ressource de nuanceur est liée au pipeline graphique pendant la passe de rendu appropriée. Les nuanceurs doivent être déplacés vers leur propre séparation. Les fichiers HLSL et les techniques de rendu doivent être implémentés dans votre code C++.
Pour un aperçu rapide du chargement des ressources du nuanceur, consultez Le port simple de Direct3D 9 vers UWP.
Direct3D 11 a introduit le modèle de nuanceur 5, qui nécessite le niveau de fonctionnalité Direct3D 11_0 (ou ultérieur). Consultez les fonctionnalités du nuanceur HLSL Model 5 pour Direct3D 11.
Remplacer XNAMath et D3DXMath
Le code utilisant XNAMath (ou D3DXMath) doit être migré vers DirectXMath. DirectXMath inclut des types portables sur x86, x64 et Arm. Consultez migration de code à partir de la bibliothèque mathématique XNA.
Notez que les types float DirectXMath sont pratiques à utiliser avec des nuanceurs. Par exemple , XMFLOAT4 et XMFLOAT4X4 aligner facilement les données pour les mémoires tampons constantes.
Remplacer DirectSound par XAudio2 (et audio en arrière-plan)
DirectSound n’est pas pris en charge pour UWP :
- Utilisez XAudio2 pour ajouter des effets sonores à votre jeu.
Remplacer DirectInput par des API XInput et Windows Runtime
DirectInput n’est pas pris en charge pour UWP :
- Utilisez les rappels d’événements d’entrée CoreWindow pour la souris, le clavier et l’entrée tactile.
- Utilisez XInput 1.4 pour la prise en charge du contrôleur de jeu (et la prise en charge du casque du contrôleur de jeu). Si vous utilisez une base de code partagée pour le bureau et UWP, consultez les versions XInput pour plus d’informations sur la compatibilité descendante.
- Inscrivez-vous aux événements EdgeGesture si votre jeu doit utiliser la barre d’application.
Utiliser Microsoft Media Foundation au lieu de DirectShow
DirectShow ne fait plus partie de l’API DirectX (ou de l’API Windows). Microsoft Media Foundation fournit du contenu vidéo à Direct3D à l’aide de surfaces partagées. Consultez les API vidéo Direct3D 11.
Remplacer DirectPlay par du code réseau
Microsoft DirectPlay a été déconseillé. Si votre jeu utilise des services réseau, vous devez fournir du code réseau conforme aux exigences UWP. Utilisez les API suivantes :
- Win32 et COM pour les applications UWP (mise en réseau) (Windows)
- Espace de noms Windows.Networking (Windows)
- Espace de noms Windows.Networking.Sockets (Windows)
- Espace de noms Windows.Networking.Connectivity (Windows)
- Espace de noms Windows.ApplicationModel.Background (Windows)
Les articles suivants vous aident à ajouter des fonctionnalités de mise en réseau et à déclarer la prise en charge de la mise en réseau dans le manifeste de package de votre application.
- Connexion avec des sockets (applications UWP utilisant C#/VB/C++ et XAML) (Windows)
- Connexion avec webSockets (applications UWP utilisant C#/VB/C++ et XAML) (Windows)
- Connexion à des services web (applications UWP à l’aide de C#/VB/C++ et XAML) (Windows)
- Notions de base en matière de réseau
Notez que toutes les applications UWP (y compris les jeux) utilisent des types spécifiques de tâches en arrière-plan pour maintenir la connectivité pendant la suspension de l’application. Si votre jeu doit maintenir l’état de connexion pendant la suspension, consultez les principes de base de la mise en réseau.
Mappage de fonction
Utilisez le tableau suivant pour convertir le code de Direct3D 9 en Direct3D 11. Cela peut également aider à faire la distinction entre l’appareil et le contexte de l’appareil.
Direct3D9 | Équivalent Direct3D 11 |
---|---|
Les étapes de pipeline graphique sont décrites dans Graphics Pipeline. |
|
Appelez IDXGISwapChain1 ::P resent1 avec l’indicateur de DXGI_PRESENT_TEST défini. |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
Aucun équivalent direct |
|
Utilisez des API de curseur standard. |
|
L’appareil LOST et POOL_MANAGED n’existent plus. IDXGISwapChain1 ::P resent1 peut échouer avec une valeur de retour DXGI_ERROR_DEVICE_REMOVED . |
|
IDirect3DDevice9 :DrawRectPatch IDirect3DDevice9 :DrawTriPatch IDirect3DDevice9 :MultiplyTransform IDirect3DDevice9 :SetNPatchMode |
Le pipeline de fonction fixe a été déprécié. |
IDirect3DDevice9 :CheckDepthStencilMatch IDirect3DDevice9 :CheckDeviceFormat |
Les bits de capacité sont remplacés par les niveaux de fonctionnalité. Seuls quelques cas d’utilisation de format et de fonctionnalité sont facultatifs pour n’importe quel niveau de fonctionnalité donné. Celles-ci peuvent être vérifiées avec ID3D11Device ::CheckFeatureSupport et ID3D11Device ::CheckFormatSupport. |
Mappage de format Surface
Utilisez le tableau suivant pour convertir les formats Direct3D 9 en formats DXGI.
Direct3D 9 Format | Direct3D 11 Format |
---|---|
D3DFMT_UNKNOWN |
DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 |
Non disponible |
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 |
Non disponible |
D3DFMT_A1R5G5B5 |
DXGI_FORMAT_B5G5R5A1_UNORM |
D3DFMT_A4R4G4B4 |
DXGI_FORMAT_B4G4R4A4_UNORM |
D3DFMT_R3G3B2 |
Non disponible |
D3DFMT_A8 |
DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 |
Non disponible |
D3DFMT_X4R4G4B4 |
Non disponible |
D3DFMT_A2B10G10R10 |
DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 |
DXGI_FORMAT_R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 |
Non disponible |
D3DFMT_G16R16 |
DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 |
Non disponible |
D3DFMT_A16B16G16R16 |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 |
Non disponible |
D3DFMT_P8 |
Non disponible |
D3DFMT_L8 |
DXGI_FORMAT_R8_UNORM
Remarque : Utilisez .r swizzle dans le nuanceur pour dupliquer le rouge vers d’autres composants pour obtenir le comportement direct3D 9.
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
Remarque : Utilisez swizzle .rrrg dans le nuanceur pour dupliquer le rouge et déplacer le vert vers les composants alpha pour obtenir le comportement Direct3D 9.
|
D3DFMT_A4L4 |
Non disponible |
D3DFMT_V8U8 |
DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 |
Non disponible |
D3DFMT_X8L8V8U8 |
Non disponible |
D3DFMT_Q8W8V8U8 |
DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 |
DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 |
Non disponible |
D3DFMT_A2W10V10U10 |
Non disponible |
D3DFMT_UYVY |
Non disponible |
D3DFMT_R8G8_B8G8 |
DXGI_FORMAT_G8R8_G8B8_UNORM
Notez que dans Direct3D 9, les données ont été mises à l’échelle de 255.0f, mais elles peuvent être gérées dans le nuanceur.
|
D3DFMT_YUY2 |
Non disponible |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
Notez que dans Direct3D 9, les données ont été mises à l’échelle de 255.0f, mais elles peuvent être gérées dans le nuanceur.
|
D3DFMT_DXT1 |
DXGI_FORMAT_BC1_UNORM &DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 |
DXGI_FORMAT_BC1_UNORM &DXGI_FORMAT_BC1_UNORM_SRGB
Notez que DXT1 et DXT2 sont les mêmes du point de vue de l’API/du matériel. La seule différence est de savoir si l’alpha prémultipliée est utilisée, qui peut être suivie par une application et n’a pas besoin d’un format distinct.
|
D3DFMT_DXT3 |
DXGI_FORMAT_BC2_UNORM &DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 |
DXGI_FORMAT_BC2_UNORM &DXGI_FORMAT_BC2_UNORM_SRGB
Notez que DXT3 et DXT4 sont les mêmes du point de vue de l’API/du matériel. La seule différence est de savoir si l’alpha prémultipliée est utilisée, qui peut être suivie par une application et n’a pas besoin d’un format distinct.
|
D3DFMT_DXT5 |
DXGI_FORMAT_BC3_UNORM &DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 &D3DFMT_D16_LOCKABLE |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 |
Non disponible |
D3DFMT_D15S1 |
Non disponible |
D3DFMT_D24S8 |
Non disponible |
D3DFMT_D24X8 |
Non disponible |
D3DFMT_D24X4S4 |
Non disponible |
D3DFMT_D16 |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE |
DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 |
Non disponible |
D3DFMT_S1D15 |
Non disponible |
D3DFMT_S8D24 |
DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 |
Non disponible |
D3DFMT_X4S4D24 |
Non disponible |
D3DFMT_L16 |
DXGI_FORMAT_R16_UNORM
Remarque : Utilisez .r swizzle dans le nuanceur pour dupliquer le rouge vers d’autres composants pour obtenir le comportement D3D9.
|
D3DFMT_INDEX16 |
DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 |
DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 |
Non disponible |
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 |
Non disponible |
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 |
Non disponible |
D3DDECLTYPE_UBYTE4 |
DXGI_FORMAT_R8G8B8A8_UINT
Notez que le nuanceur obtient des valeurs UINT, mais si les flotteurs intégraux de style Direct3D 9 sont nécessaires (0.0f, 1.0f... 255.f), UINT peut simplement être converti en float32 dans le nuanceur.
|
D3DDECLTYPE_SHORT2 |
DXGI_FORMAT_R16G16_SINT
Notez que le nuanceur obtient des valeurs SINT, mais si les floats de style Direct3D 9 sont nécessaires, SINT peut simplement être converti en float32 dans le nuanceur.
|
D3DDECLTYPE_SHORT4 |
DXGI_FORMAT_R16G16B16A16_SINT
Notez que le nuanceur obtient des valeurs SINT, mais si les floats de style Direct3D 9 sont nécessaires, SINT peut simplement être converti en float32 dans le nuanceur.
|
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 |
Non disponible |
D3DDECLTYPE_DEC3N |
Non disponible |
D3DDECLTYPE_FLOAT16_2 |
DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 |
DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' |
DXGI_FORMAT_BC4_UNORM
Remarque Nécessite le niveau de fonctionnalité 10.0 ou version ultérieure
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
Remarque Nécessite le niveau de fonctionnalité 10.0 ou version ultérieure
|
Informations de mappage supplémentaires
- IDirect3DDevice9 ::SetCursorPosition est remplacé par SetCursorPos.
- IDirect3DDevice9 ::SetCursorProperties est remplacé par SetCursor.
- IDirect3DDevice9 ::SetIndices est remplacé par ID3D11DeviceContext ::IASetIndexBuffer.
- IDirect3DDevice9 ::SetRenderTarget est remplacé par ID3D11DeviceContext ::OMSetRenderTargets.
- IDirect3DDevice9 ::SetScissorRect est remplacé par ID3D11DeviceContext ::RSSetScissorRects.
- IDirect3DDevice9 ::SetStreamSource est remplacé par ID3D11DeviceContext ::IASetVertexBuffers.
- IDirect3DDevice9 ::SetVertexDeclaration est remplacé par ID3D11DeviceContext ::IASetInputLayout.
- IDirect3DDevice9 ::SetViewport est remplacé par ID3D11DeviceContext ::RSSetViewports.
- IDirect3DDevice9 ::ShowCursor est remplacé par ShowCursor.
Le contrôle de la rampe gamma matérielle de la carte vidéo via IDirect3DDevice9 ::SetGammaRamp est remplacé par IDXGIOutput ::SetGammaControl. Voir Utilisation de la correction gamma.
IDirect3DDevice9 ::P rocessVertices est remplacé par la fonctionnalité Stream-Output des nuanceurs geometry. Consultez Prise en main de l’étape de sortie de flux.
La méthode IDirect3DDevice9 ::SetClipPlane pour définir les plans clipplans utilisateur a été remplacée par la sémantique de sortie du nuanceur de vertex SV_ClipDistance HLSL (voir Sémantique), disponible dans VS_4_0 et haut, ou par le nouvel attribut de fonction clipplanes HLSL (voir Plans de clipplans utilisateur sur le matériel du niveau de fonctionnalité 9).
IDirect3DDevice9 ::SetPaletteEntries et IDirect3DDevice9 ::SetCurrentTexturePalette sont déconseillés. Remplacez-les par un nuanceur de pixels qui recherche les couleurs dans une texture de 256 x 1 R8G8B8A8 à la place.
Les fonctions de pavage de fonction fixe comme DrawRectPatch, DrawTriPatch, SetNPatchMode et DeletePatch sont déconseillées. Remplacez-les par des nuanceurs sm5.0 de pipeline programmable (si le matériel prend en charge les nuanceurs de pavage).
Les codes IDirect3DDevice9 ::SetFVF et FVF ne sont plus pris en charge. Vous devez porter des codes FVF D3D8/D3D9 vers des déclarations de vertex D3D9 avant de les porter vers des dispositions d’entrée D3D11.
Tous les types de D3DDECLTYPE qui ne sont pas directement pris en charge peuvent être émulés de manière assez efficace avec un petit nombre d’opérations au niveau du bit au début d’un nuanceur de vertex dans VS_4_0 et vers le haut.