Mapper les fonctionnalités DirectX 9 aux API DirectX 11
Découvrez comment les fonctionnalités utilisées par votre jeu Direct3D 9 sont traduites dans Direct3D 11 et la plateforme Windows universelle (UWP).
Consultez également Planifier votre port DirectX et Modifications importantes de Direct3D 9 à Direct3D 11.
Mappage des API Direct3D 9 aux API DirectX 11
Direct3D reste la base des graphismes DirectX, mais l’API a changé depuis DirectX 9 :
- L’infrastructure DXGI (Microsoft DirectX Graphics Infrastructure) sert à configurer les cartes graphiques. Utilisez DXGI pour sélectionner le format des tampons, créer des chaînes d’échange, présenter des trames et créer des ressources partagées. Voir Vue d’ensemble de DXGI.
- Un contexte de périphérique Direct3D permet de définir l’état du pipeline et de générer des commandes de rendu. La plupart de nos exemples utilisent un contexte immédiat pour effectuer un rendu directement sur le périphérique. Direct3D 11 prend aussi en charge le rendu multithread associé aux contextes différés. Voir Présentation d’un périphérique dans Direct3D 11.
- Certaines fonctionnalités ont été abandonnées, notamment le pipeline à fonctions fixes. Voir Fonctionnalités obsolètes.
Pour obtenir la liste complète des fonctionnalités de Direct3D 11, voir Fonctionnalités de Direct3D 11 et Fonctionnalités de Direct3D 11.
Passage de Direct2D 9 à Direct2D 11
Direct2D (Windows) occupe toujours une place importante dans les graphismes DirectX et Windows. Vous pouvez l’utiliser pour dessiner des jeux en 2D et des superpositions (affichages à tête haute) par-dessus Direct3D.
Direct2D s’exécute par-dessus Direct3D. Les jeux en 2D peuvent être implémentés à l’aide de l’une ou l’autre des API. Par exemple, un jeu en 2D implémenté avec Direct3D peut utiliser la projection orthographique, définir des valeurs Z pour contrôler l’ordre de tracé des primitives et utiliser des nuanceurs de pixels pour ajouter des effets spéciaux.
Dans la mesure où Direct2D repose sur Direct3D, il utilise aussi DXGI et les contextes de périphérique. Voir Vue d’ensemble des API de Direct2D.
L’API DirectWrite permet la prise en charge du texte mis en forme avec Direct2D. Voir 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 des jeux UWP. Ces bibliothèques d’assistance fournissaient des ressources pour les tâches comme le chargement des textures et des maillages.
- La procédure pas à pas Portage simple de Direct3D 9 vers UWP décrit les méthodes permettant de configurer une fenêtre, d’initialiser Direct3D et d’effectuer un rendu de base en 3D.
- La procédure pas à pas Jeu UWP simple avec DirectX décrit les tâches communes de programmation de jeux, notamment les graphismes, le chargement de fichiers, l’interface utilisateur, les commandes et le son.
- Le projet de la communauté Kit de ressources DirectX propose des classes d’assistance pour Direct3D 11 et les applications UWP.
Déplacer les programmes de nuanceurs de FX à HLSL
La bibliothèque des utilitaires D3DX (D3DX 9, D3DX 10 et D3DX 11), y compris Effects, est déconseillée pour UWP. Tous les jeux DirectX pour UWP pilotent le pipeline graphique à l’aide de HLSL sans la bibliothèque d’effets.
Visual Studio utilise toujours FXC pour compiler les objets nuanceurs. Les nuanceurs UWP sont compilés à l’avance. Le bytecode est chargé à l’exécution, puis chaque ressource de nuanceur est liée au pipeline graphique pendant l’étape de rendu appropriée. Les nuanceurs doivent être déplacés vers leurs propres fichiers .HLSL et des techniques de rendu doivent être implémentées dans votre code C++.
Pour un aperçu du chargement des ressources de nuanceur, voir Portage 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 supérieur). Voir Fonctionnalités du modèle de nuanceur 5 HLSL pour Direct3D 11.
Remplacer XNAMath et D3DXMath
Le code qui utilise XNAMath (ou D3DXMath) doit être migré vers DirectXMath. DirectXMath inclut des types portables sur x86, x64 et Arm. Voir Migration du code de la bibliothèque XNA Math.
Notez que les types float DirectXMath conviennent parfaitement aux nuanceurs. Par exemple , XMFLOAT4 et XMFLOAT4X4 alignent facilement les données pour les mémoires tampons constantes.
Remplacer DirectSound par XAudio2 (et l’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 les API XInput et Windows Runtime
DirectInput n’est pas pris en charge pour UWP :
- Utilisez les rappels d’événement d’entrée CoreWindow pour la souris, le clavier et les entrées tactiles.
- Utilisez XInput 1.4 pour la prise en charge des contrôleurs de jeu (et la prise en charge du casque des contrôleurs de jeu). Si vous utilisez une base de code partagé pour les applications de bureau et UWP, voir Versions XInput pour plus d’informations sur la compatibilité descendante.
- Inscrivez-vous aux événements EdgeGesture si votre jeu doit utiliser la barre de l’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 le contenu vidéo à Direct3D via les surfaces partagées. Voir API vidéo de Direct3D 11.
Remplacer DirectPlay par du code réseau
Microsoft DirectPlay est 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 réseau et à déclarer la prise en charge réseau dans le manifeste du package de votre application.
- Connexion avec des sockets (applications UWP en C#/VB/C++ et XAML) (Windows)
- Connexion à des WebSockets (applications UWP en C#/VB/C++ et XAML) (Windows)
- Connexion à des services web (applications UWP en C#/VB/C++ et XAML) (Windows)
- Notions de base en matière de réseau
Notez que toutes les applications pour 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 rester en état de connexion pendant sa suspension, voir Notions de base en matière de réseau.
Mappage de fonctions
Aidez-vous du tableau suivant pour convertir du code Direct3D 9 en Direct3D 11. Il peut aussi vous permettre de faire la distinction entre le périphérique et le contexte de périphérique.
Direct3D 9 | Équivalent Direct3D 11 |
---|---|
Les étapes du pipeline graphique sont décrites dans Pipeline graphique. |
|
Appelez IDXGISwapChain1::P resent1 avec l’indicateur DXGI_PRESENT_TEST défini. |
|
ID3D11DeviceContext::D rawIndexed ID3D11DeviceContext::D rawIndexedInstanced ID3D11DeviceContext::D rawInstanced |
|
Aucun équivalent direct |
|
Utilisez les API de curseur standard. |
|
Le périphérique LOST et POOL_MANAGED n’existent plus. IDXGISwapChain1::P resent1 peut échouer avec une valeur de retour DXGI_ERROR_DEVICE_REMOVED . |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
Le pipeline à fonctions fixes n’est plus utilisé. |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
Les bits de capacité sont remplacés par des niveaux de fonctionnalité. Seuls quelques rares cas d’utilisation de format et de fonctionnalité sont facultatifs pour un niveau de fonctionnalité donné. Elles peuvent être vérifiées avec ID3D11Device::CheckFeatureSupport et ID3D11Device::CheckFormatSupport. |
Mappage des formats de surface
Utilisez le tableau suivant pour convertir les formats Direct3D 9 en formats DXGI.
Format Direct3D 9 | Format Direct3D 11 |
---|---|
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
Note Utilisez .r swizzle dans le nuanceur pour dupliquer le rouge vers d’autres composants afin d’obtenir le comportement de Direct3D 9.
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
Note Utilisez swizzle .rrrg dans le nuanceur pour dupliquer le rouge et déplacer le vert vers les composants alpha pour obtenir le comportement de 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
Note Dans Direct3D 9, les données ont été mises à l’échelle de 255,0f, mais cela peut être géré dans le nuanceur.
|
D3DFMT_YUY2 |
Non disponible |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
Note Dans Direct3D 9, les données ont été mises à l’échelle de 255,0f, mais cela peut être géré 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
Note DXT1 et DXT2 sont identiques du point de vue de l’API/du matériel. La seule différence est en cas d’utilisation d’un alpha prémultiplié, qui peut faire l’objet d’un suivi par une application et ne requiert pas de format distinct.
|
D3DFMT_DXT3 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
Note DXT3 et DXT4 sont identiques du point de vue de l’API/du matériel. La seule différence est en cas d’utilisation d’un alpha prémultiplié, qui peut faire l’objet d’un suivi par une application et ne requiert pas de 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
Note Utilisez .r swizzle dans le nuanceur pour dupliquer le rouge vers d’autres composants afin d’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
Note Le nuanceur obtient des valeurs UINT, mais si des floats 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
Note Le nuanceur obtient les valeurs SINT, mais si des floats intégraux de style Direct3D 9 sont nécessaires, SINT peut simplement être converti en float32 dans le nuanceur.
|
D3DDECLTYPE_SHORT4 |
DXGI_FORMAT_R16G16B16A16_SINT
Note Le nuanceur obtient les valeurs SINT, mais si des floats intégraux 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
Note Nécessite le niveau de fonctionnalité 10.0 ou ultérieur
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
Note Nécessite le niveau de fonctionnalité 10.0 ou ultérieur
|
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 du carte vidéo via IDirect3DDevice9::SetGammaRamp est remplacé par IDXGIOutput::SetGammaControl. Consultez Utilisation de la correction gamma.
IDirect3DDevice9::P rocessVertices est remplacé par la fonctionnalité Stream-Output des nuanceurs geometry. Consultez Prise en main de la phase Stream-Output.
La méthode IDirect3DDevice9::SetClipPlane pour définir les plans de découpage 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 plus, ou par le nouvel attribut de fonction clipplanes HLSL (voir Plans d’clip utilisateur sur le matériel de 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 R8G8B8A8 de 256 x 1 à la place.
Les fonctions de pavage de fonction fixe comme DrawRectPatch, DrawTriPatch, SetNPatchMode et DeletePatch sont déconseillées. Remplacez-les par des nuanceurs de téssellation SM5.0 à 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 porter vers les dispositions d’entrée D3D11.
Tous les types D3DDECLTYPE qui ne sont pas directement pris en charge peuvent être émulés assez efficacement avec un petit nombre d’opérations au niveau du bit au début d’un nuanceur de vertex dans VS_4_0 et jusqu’à.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour