Modifications importantes de Direct3D 9 à Direct3D 11Important changes from Direct3D 9 to Direct3D 11

RésuméSummary

Cette rubrique décrit les principales différences entre DirectX 9 et DirectX 11.This topic explains the high-level differences between DirectX 9 and DirectX 11.

Direct3D 11 correspond fondamentalement au même type d’API que Direct3D 9 : une interface virtualisée de bas niveau dans du matériel vidéo.Direct3D 11 is fundamentally the same type of API as Direct3D 9 - a low-level, virtualized interface into graphics hardware. Il vous permet encore d’effectuer des opérations de dessin graphique sur une variété d’implémentations matérielles.It still allows you to perform graphics drawing operations on a variety of hardware implementations. La disposition de l’API graphique a changé depuis Direct3D 9 ; le concept de contexte de périphérique a été étendu et une API a été ajoutée particulièrement pour l’infrastructure graphique.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. Les ressources stockées sur le périphérique Direct3D disposent d’un mécanisme original pour le polymorphisme des données appelé affichage des ressources.Resources stored on the Direct3D device have a novel mechanism for data polymorphism called a resource view.

Principales fonctions d’APICore API functions

Dans Direct3D 9, vous deviez créer une interface vers l’API Direct3D avant de pouvoir commencer à l’utiliser.In Direct3D 9 you had to create an interface to the Direct3D API before you could start using it. Dans votre jeu de plateforme Windows universelle Direct3D 11 (UWP), vous appelez une fonction statique appelée D3D11CreateDevice pour créer l’appareil et le contexte de périphérique.In your Direct3D 11 Universal Windows Platform (UWP) game, you call a static function called D3D11CreateDevice to create the device and the device context.

Périphériques et contexte de périphériqueDevices and device context

Un périphérique Direct3D 11 représente une carte graphique virtualisée.A Direct3D 11 device represents a virtualized graphics adapter. Il sert à créer des ressources dans la mémoire vidéo, par exemple, à télécharger des textures vers le GPU, à créer des affichages sur les ressources de textures et les chaînes d’échange et à créer des échantillons de textures.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. Pour obtenir la liste complète des utilisations d’une interface de périphérique Direct3D 11, voir ID3D11Device et ID3D11Device1.For a complete list of what a Direct3D 11 device interface is used for see ID3D11Device and ID3D11Device1.

Un contexte de périphérique Direct3D 11A Direct3D 11. sert à définir l’état du pipeline et à générer des commandes de rendu.device context is used to set pipeline state and generate rendering commands. Par exemple, une chaîne de rendu Direct3D 11 utilise un contexte de périphérique pour configurer la chaîne de rendu et dessiner la scène (voir ci-dessous).For example, a Direct3D 11 rendering chain uses a device context to set up the rendering chain and draw the scene (see below). Le contexte de périphérique est utilisé pour accéder (mapper) la mémoire vidéo utilisée par les ressources de périphérique Direct3D ; il sert également à mettre à jour les données de sous-ressources, par exemple les données de tampons constants.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. Pour obtenir la liste complète des éléments utilisés pour un contexte de périphérique Direct3D 11, consultez ID3D11DeviceContext et ID3D11DeviceContext1.For a complete list of what a Direct3D 11 device context is used for see ID3D11DeviceContext and ID3D11DeviceContext1. Notez que la plupart de nos exemples utilisent un contexte immédiat pour générer directement le rendu sur le périphérique, mais que Direct3D 11 prend également en charge des contextes de périphérique différés, lesquels sont principalement utilisés pour le 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.

Dans Direct3D 11, le handle de périphérique et le handle de contexte de périphérique sont tous les deux obtenus en appelant la fonction D3D11CreateDevice.In Direct3D 11, the device handle and device context handle are both obtained by calling D3D11CreateDevice. Cette méthode permet également de demander un ensemble spécifique de caractéristiques matérielles et de récupérer des informations sur les niveaux de fonctionnalité Direct3D pris en charge par la carte graphique.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. Voir Présentation d’un périphérique dans Direct3D 11 pour plus d’informations sur les périphériques, les contextes de périphérique et les considérations liées au thread.See Introduction to a Device in Direct3D 11 for more info on devices, device contexts, and threading considerations.

Infrastructure de périphérique, tampons de trame et affichages de cibles de renduDevice infrastructure, frame buffers, and render target views

Dans Direct3D 11, la carte de périphérique et la configuration matérielle sont définies avec l’API DXGI (DirectX Graphics Infrastructure) à l’aide des interfaces COM IDXGIAdapter et 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. Les mémoires tampons et les autres ressources de fenêtre (visibles ou hors écran) sont créées et configurées par des interfaces DXGI spécifiques ; l’implémentation du modèle de fabrique IDXGIFactory2 acquiert des ressources dxgi telles que la mémoire tampon de trame.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. Étant donné que DXGI est propriétaire de la chaîne de permutation, une interface DXGI est utilisée pour présenter des frames à l’écran, voir IDXGISwapChain1.Since DXGI owns the swap chain, a DXGI interface is used to present frames to the screen - see IDXGISwapChain1.

Utilisez IDXGIFactory2 pour créer une chaîne d’échange compatible avec votre jeu.Use IDXGIFactory2 to create a swap chain compatible with your game. Vous devez créer une chaîne de permutation pour une fenêtre principale, ou pour une composition (technologie interop XAML), plutôt que de créer une chaîne de permutation pour 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.

Ressources de périphérique et affichages des ressourcesDevice resources and resource views

Direct3D 11 prend en charge un niveau supplémentaire de polymorphisme sur les ressources de mémoire vidéo appelées vues.Direct3D 11 supports an additional level of polymorphism on video memory resources known as views. En gros, quand vous aviez un objet Direct3D 9 unique pour une texture, vous avez maintenant deux objets : la ressource de texture, qui contient les données et l’affichage des ressources, qui indique comment la vue est utilisée pour le rendu.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. Une vue basée sur une ressource permet à cette ressource d’être utilisée dans un but spécifique.A view based on a resource enables that resource to be used for a specific purpose. Par exemple, une ressource de texture en 2D est créée en tant que ID3D11Texture2D, puis un affichage des ressources de nuanceur (ID3D11ShaderResourceView) est créé par-dessus pour être utilisable en tant que texture dans un nuanceur.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. Une vue de cible de rendu (ID3D11RenderTargetView) peut également être créée sur la même ressource de texture en 2D afin d’être utilisée en tant que surface de dessin.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. Dans un autre exemple, les mêmes données de pixel sont représentées dans 2 formats de pixel différents à l’aide de 2 affichages distincts sur une seule ressource de texture.In another example, the same pixel data is represented in 2 different pixel formats by using 2 separate views on a single texture resource.

La ressource sous-jacente doit être créée avec des propriétés compatibles avec les types d’affichages qui seront créés à partir de cette ressource.The underlying resource must be created with properties that are compatible with the type of views that will be created from it. Par exemple, si un ID3D11RenderTargetView est appliqué à une surface, cette surface est créée avec l’indicateur de ** _ cible de _ rendu _ de liaison d3d11** .For example, if an ID3D11RenderTargetView is applied to a surface, that surface is created with the D3D11_BIND_RENDER_TARGET flag. Le format de surface DXGI doit également être compatible avec le rendu (voir ** _ format dxgi**).The surface also has to have a DXGI surface format compatible with rendering (see DXGI_FORMAT).

La plupart des ressources que vous utilisez pour le rendu héritent de l’interface ID3D11Resource , qui hérite de ID3D11DeviceChild.Most of the resources you use for rendering inherit from the ID3D11Resource interface, which inherits from ID3D11DeviceChild. Les tampons vertex, les tampons d’index, les mémoires tampons constantes et les nuanceurs sont tous des ressources Direct3D 11.Vertex buffers, index buffers, constant buffers, and shaders are all Direct3D 11 resources. Les dispositions d’entrée et les États de l’échantillonneur héritent directement de ID3D11DeviceChild.Input layouts and sampler states inherit directly from ID3D11DeviceChild.

Les vues de ressources utilisent une _ valeur d’énumération de format DXGI pour indiquer le format de pixel.Resources views use a DXGI_FORMAT enum value to indicate the pixel format. Les D3DFMT ne sont pas tous pris en charge en tant que _ format DXGI.Not every D3DFMT is supported as a DXGI_FORMAT. Par exemple, il n’existe aucun format RGB 24bpp dans DXGI équivalent à D3DFMT _ R8G8B8.For example, there is no 24bpp RGB format in DXGI that is equivalent to D3DFMT_R8G8B8. Il n’existe pas non plus d’équivalents BGR pour chaque format RVB (le _ format dxgi _ R10G10B10A2 _ UNORM est équivalent à D3DFMT _ A2B10G10R10, mais il n’existe aucun équivalent direct à 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). Tout contenu présentant l’un de ces formats hérités doit être converti dans un format pris en charge au moment de la création.You should plan to convert any content in these legacy formats to supported formats at build-time. Pour obtenir la liste complète des formats DXGI, consultez l’énumération de ** _ format dxgi** .For a complete list of DXGI formats see the DXGI_FORMAT enumeration.

Les ressources de périphérique Direct3D (et les affichages des ressources) sont créés avant la génération du rendu de la scène.Direct3D device resources (and resource views) are created before the scene is rendered. Les contextes de périphérique sont utilisés pour configurer la chaîne de rendu, comme expliqué ci-dessous.Device contexts are used to set up the rendering chain, as explained below.

Contexte de périphérique et chaîne de renduDevice context and the rendering chain

Dans Direct3D 9 et Direct3D 10.x, il existait un seul objet de périphérique Direct3D qui gérait la création des ressources, l’état et le dessin.In Direct3D 9 and Direct3D 10.x, there was a single Direct3D device object which managed resource creation, state, and drawing. Dans Direct3D 11, l’interface de périphérique Direct3D gère encore la création des ressources, mais toutes les opérations d’état et de dessin sont gérées à l’aide d’un contexte de périphérique 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. Voici un exemple d’utilisation du contexte de périphérique (interface ID3D11DeviceContext1) pour configurer la chaîne de rendu :Here's an example of how the device context (ID3D11DeviceContext1 interface) is used to set up the rendering chain:

  • Définir et effacer les vues de cibles de rendu (et la vue de profondeur/gabarit)Set and clear render target views (and depth stencil view)
  • Définir le tampon de vertex, le tampon d’index et le schéma d’entrée pour le stade d’assembleur d’entrée (stade IA)Set the vertex buffer, index buffer, and input layout for the input assembler stage (IA stage)
  • Lier les nuanceurs de vertex et de pixels au pipelineBind vertex and pixel shaders to the pipeline
  • Lier les tampons constants aux nuanceursBind constant buffers to shaders
  • Lier les vues de textures et les échantillons au nuanceur de pixelsBind texture views and samplers to the pixel shader
  • Dessiner la scèneDraw the scene

Quand l’une des méthodes ID3D11DeviceContext::Draw est appelée, la scène est dessinée sur l’affichage de la cible de rendu.When one of the ID3D11DeviceContext::Draw methods is called, the scene is drawn on the render target view. Lorsque vous avez terminé, tout votre dessin de l’adaptateur DXGI est utilisé pour présenter le frame terminé en appelant IDXGISwapChain1 ::P resent1.When you're done will all your drawing the DXGI adapter is used to present the completed frame by calling IDXGISwapChain1::Present1.

Gestion de l’étatState management

Direct3D 9 gérait les paramètres d’état avec un large ensemble de bascules individuelles défini à l’aide des méthodes SetRenderState, SetSamplerState et SetTextureStageState.Direct3D 9 managed state settings with a large set of individual toggles set with the SetRenderState, SetSamplerState, and SetTextureStageState methods. Étant donné que Direct3D 11 ne prend pas en charge le pipeline à fonction fixe hérité, la méthode SetTextureStageState est remplacée par l’écriture de nuanceurs de pixels.Since Direct3D 11 does not support the legacy fixed-function pipeline, the SetTextureStageState is replaced by writing pixel shaders (PS). Il n’existe pas d’équivalent à un bloc d’état Direct3D 9.There is no equivalent to a Direct3D 9 state block. Direct3D 11 gère l’état par le biais de l’utilisation de 4 types d’objets d’état qui offrent un moyen plus rationalisé de regrouper l’état de rendu.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.

Par exemple, au lieu d’utiliser SetRenderState avec D3DRS _ ZENABLE, vous créez un objet DepthStencilState avec ce et d’autres paramètres d’État associés et vous l’utilisez pour modifier l’état lors du rendu.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.

Quand vous portez des applications Direct3D 9 vers des objets d’état, sachez que vos diverses combinaisons d’état sont représentées sous forme d’objets d’état inaltérables.When porting Direct3D 9 applications to state objects, be aware that your various state combinations are represented as immutable state objects. Ils doivent être créés une seule fois et réutilisés tant qu’ils sont valides.They should be created once and re-used as long as they are valid.

Niveaux de fonctionnalités Direct3DDirect3D feature levels

Direct3D possède un nouveau mécanisme pour déterminer la prise en charge matérielle, appelé niveaux de fonctionnalités.Direct3D has a new mechanism for determining hardware support called feature levels. Les niveaux de fonctionnalités simplifient la tâche de détermination de ce que peut faire la carte graphique en vous permettant de demander un ensemble bien défini de fonctionnalités 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. Par exemple, le _ niveau de fonctionnalité 9 1 implémente les fonctionnalités fournies par les cartes graphiques Direct3D 9, y compris le modèle de nuanceur 2. x.For example, the 9_1 feature level implements the functionality provided by Direct3D 9 graphics adapters, including shader model 2.x. Étant donné que 9 _ 1 est le niveau de fonctionnalité le plus bas, vous pouvez vous attendre à ce que tous les appareils prennent en charge un nuanceur de sommets et un nuanceur de pixels, qui étaient les mêmes étapes que celles prises en charge par le modèle de nuanceur programmable 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.

Votre jeu utilisera D3D11CreateDevice pour créer le périphérique Direct3D et le contexte de l’appareil.Your game will use D3D11CreateDevice to create the Direct3D device and device context. Quand vous appelez cette fonction, vous fournissez la liste des niveaux de fonctionnalités que votre jeu peut prendre en charge.When you call this function you provide a list of feature levels that your game can support. Elle renvoie le niveau de fonctionnalité pris en charge le plus élevé à partir de cette liste.It will return the highest supported feature level from that list. Par exemple, si votre jeu peut utiliser des textures textures BC4/BC5 (une fonctionnalité du matériel DirectX 10), vous devez inclure au moins 9 _ 1 et 10 _ 0 dans la liste des niveaux de fonctionnalité pris en charge.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 le jeu s’exécute sur le matériel DirectX 9 et que les textures textures BC4/BC5 ne peuvent pas être utilisées, D3D11CreateDevice retourne 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. Votre jeu peut alors revenir à un format de texture différent (et à des textures plus petites).Then your game can fall back to a different texture format (and smaller textures).

Si vous décidez d’étendre votre jeu Direct3D 9 pour prendre en charge des niveaux de fonctionnalités Direct3D supérieurs, alors il est préférable de d’abord terminer le portage de votre code graphique Direct3D 9 existant.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. Une fois que votre jeu fonctionne dans Direct3D 11, il est plus facile d’ajouter des chemins de rendu supplémentaires avec des graphiques améliorés.After you have your game working in Direct3D 11, it's easier to add additional rendering paths with enhanced graphics.

Pour obtenir une explication détaillée de la prise en charge des niveaux de fonctionnalités, voir Niveaux de fonctionnalités Direct3D.See Direct3D feature levels for a detailed explanation of feature level support. Voir Fonctionnalités de Direct3D 11 et Fonctionnalités de Direct3D 11.1 pour obtenir la liste complète des fonctionnalités de Direct3D 11.See Direct3D 11 Features and Direct3D 11.1 Features for a full list of Direct3D 11 features.

Niveaux de fonctionnalités et pipeline programmableFeature levels and the programmable pipeline

Le matériel a continué à évoluer depuis Direct3D 9 et plusieurs nouveaux stades facultatifs ont été ajoutés au pipeline graphique programmable.Hardware has continue to evolve since Direct3D 9, and several new optional stages have been added to the programmable graphics pipeline. L’ensemble d’options dont vous disposez pour le pipeline graphique varie avec le niveau de fonctionnalité Direct3D.The set of options you have for the graphics pipeline varies with the Direct3D feature level. Le niveau de fonctionnalité 10.0 inclut le stade de nuanceur de géométrie avec flux facultatif pour le rendu multipasse sur le GPU.Feature level 10.0 includes the geometry shader stage with optional stream out for multipass rendering on the GPU. Le niveau de fonctionnalité 11 _ 0 inclut le nuanceur de coque et le nuanceur de domaine à utiliser avec la polygonalisation matérielle.Feature level 11_0 include the hull shader and domain shader for use with hardware tessellation. Le niveau de fonctionnalité 11 _ 0 inclut également la prise en charge complète des nuanceurs DirectCompute, tandis que les niveaux de fonctionnalité 10. x incluent uniquement la prise en charge d’une forme limitée 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.

Tous les nuanceurs sont écrits en HLSL à l’aide d’un profil de nuanceur qui correspond à un niveau de fonctionnalité Direct3D.All shaders are written in HLSL using a shader profile that corresponds to a Direct3D feature level. Les profils de nuanceur sont à compatibilité descendante, donc un nuanceur HLSL qui est compilé à l’aide de vs _ 4 _ 0 _ Level _ 9 _ 1 ou PS _ 4 _ 0 _ Level _ 9 _ 1 fonctionne sur tous les appareils.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. Les profils de nuanceur ne sont pas compatibles avec les niveaux de niveau inférieur, donc un nuanceur compilé à l’aide _ de vs 4 _ 1 fonctionne uniquement sur les appareils de niveau de fonctionnalité 10 _ 1, 11 _ 0 ou 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 gérait les constantes des nuanceurs en utilisant un tableau partagé avec SetVertexShaderConstant et SetPixelShaderConstant.Direct3D 9 managed constants for shaders using a shared array with SetVertexShaderConstant and SetPixelShaderConstant. Direct3D 11 utilise des tampons constants, lesquels sont des ressources comme un tampon de vertex ou un tampon d’index.Direct3D 11 uses constant buffers, which are resources like a vertex buffer or index buffer. Les tampons constants sont conçus pour être mis à jour de manière efficace.Constant buffers are designed to be updated efficiently. Au lieu d’organiser toutes les constantes de nuanceurs dans un seul tableau global, vous les organisez dans des groupes logiques et les gérez via un ou plusieurs tampons constants.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. Quand vous portez votre jeu Direct3D 9 vers Direct3D 11, envisagez d’organiser vos tampons constants afin de pouvoir les mettre à jour de manière appropriée.When you port your Direct3D 9 game to Direct3D 11, plan to organize your constant buffers so that you can update them appropriately. Par exemple, regroupez les constantes de nuanceurs dont toutes les trames ne sont pas mises à jour dans une mémoire tampon constante distincte, afin de ne pas avoir à charger constamment ces données sur la carte graphique avec vos constantes de nuanceurs plus dynamiques.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.

Remarque    La plupart des applications Direct3D 9 utilisent beaucoup les nuanceurs, mais parfois mélangées avec le comportement de fonction fixe hérité.Note   Most Direct3D 9 applications made extensive use of shaders, but occasionally mixed in use of the legacy fixed-function behavior. Notez que Direct3D 11 utilise uniquement un modèle de nuanceur programmable.Note that Direct3D 11 only uses a programmable shading model. Les fonctionnalités de fonction fixe héritées de Direct3D 9 sont obsolètes.The legacy fixed-function features of Direct3D 9 are deprecated.