Présentation d’une ressource dans Direct3D 11

Les ressources sont les blocs de construction de votre scène. Ils contiennent la plupart des données que Direct3D utilise pour interpréter et restituer votre scène. Les ressources sont des zones en mémoire accessibles par le pipeline Direct3D. Les ressources contiennent les types de données suivants : géométrie, textures, données de nuanceur. Cette rubrique présente les ressources Direct3D telles que les mémoires tampons et les textures.

Vous pouvez créer des ressources fortement typées ou sans type ; vous pouvez contrôler si les ressources ont un accès en lecture et en écriture ; vous pouvez rendre les ressources accessibles uniquement au processeur, au GPU ou aux deux. Jusqu’à 128 ressources peuvent être actives à chaque phase du pipeline.

Direct3D garantit le retour de zéro pour toute ressource accessible hors limites.

Le cycle de vie d’une ressource Direct3D est le suivant :

  • Créez une ressource à l’aide de l’une des méthodes de création de l’interface ID3D11Device .
  • Liez une ressource au pipeline à l’aide d’un contexte et d’une des méthodes set de l’interface ID3D11DeviceContext .
  • Libérez une ressource en appelant la méthode Release de l’interface de ressource.

Cette section contient les rubriques suivantes :

Frappe forte ou faible

Il existe deux façons de spécifier entièrement la disposition (ou l’empreinte mémoire) d’une ressource :

  • Typé : spécifiez entièrement le type lors de la création de la ressource.
  • Sans type : spécifiez entièrement le type lorsque la ressource est liée au pipeline.

La création d’une ressource entièrement typée limite la ressource au format avec lequel elle a été créée. Cela permet au runtime d’optimiser l’accès, en particulier si la ressource est créée avec des indicateurs indiquant qu’elle ne peut pas être mappée par l’application. Les ressources créées avec un type spécifique ne peuvent pas être réinterprétées à l’aide du mécanisme d’affichage, sauf si la ressource a été créée avec l’indicateur D3D10_DDI_BIND_PRESENT. Si D3D10_DDI_BIND_PRESENT est défini, les affichages de ressources de cible de rendu ou de nuanceur peuvent être créés sur ces ressources à l’aide d’un des membres entièrement typés de la famille appropriée, même si la ressource d’origine a été créée comme entièrement typée.

Dans une ressource de type moins, le type de données est inconnu lors de la première création de la ressource. L’application doit choisir parmi le type disponible moins les formats (voir DXGI_FORMAT). Vous devez spécifier la taille de la mémoire à allouer et si le runtime doit générer les sous-texte dans un mipmap. Toutefois, le format exact des données (si la mémoire sera interprétée comme des entiers, des valeurs à virgule flottante, des entiers non signés, etc.) n’est pas déterminé tant que la ressource n’est pas liée au pipeline avec une vue de ressources. Comme le format de texture reste flexible jusqu’à ce que la texture soit liée au pipeline, la ressource est appelée stockage faiblement typé. Le stockage faiblement typé présente l’avantage de pouvoir être réutilisé ou réinterprété dans un autre format tant que le nombre de composants et le nombre de bits de chaque composant sont identiques dans les deux formats.

Une seule ressource peut être liée à plusieurs étapes de pipeline tant que chacune a une vue unique, qui qualifie entièrement les formats à chaque emplacement. Par exemple, une ressource créée au format DXGI_FORMAT_R32G32B32A32_TYPELESS peut être utilisée comme DXGI_FORMAT_R32G32B32A32_FLOAT et comme DXGI_FORMAT_R32G32B32A32_UINT simultanément à différents emplacements dans le pipeline.

Affichages des ressources

Les ressources peuvent être stockées dans des formats de mémoire à usage général afin qu’elles puissent être partagées par plusieurs étapes de pipeline. Une étape de pipeline interprète les données de ressources à l’aide d’une vue. Une vue de ressources est conceptuellement similaire à la conversion des données de ressources afin qu’elles puissent être utilisées dans un contexte particulier.

Une vue peut être utilisée avec une ressource sans type. Autrement dit, vous pouvez créer une ressource au moment de la compilation et déclarer le type de données lorsque la ressource est liée au pipeline. Une vue créée pour une ressource sans type a toujours le même nombre de bits par composant ; la façon dont les données sont interprétées dépend du format spécifié. Le format spécifié doit provenir de la même famille que le format sans type utilisé lors de la création de la ressource. Par exemple, une ressource créée avec le format R8G8B8A8_TYPELESS ne peut pas être vue comme une ressource R32_FLOAT même si les deux formats peuvent avoir la même taille en mémoire.

Une vue expose également d’autres fonctionnalités telles que la possibilité de lire des surfaces de profondeur/gabarit dans un nuanceur, de générer un cubemap dynamique en une seule passe et de rendre simultanément sur plusieurs tranches d’un volume.

Interface de ressources Description
ID3D11DepthStencilView Accédez à une ressource de texture pendant le test de gabarit en profondeur.
ID3D11RenderTargetView Accédez à une ressource de texture utilisée comme cible de rendu.
ID3D11ShaderResourceView Accédez à une ressource de nuanceur telle qu’une mémoire tampon constante, une mémoire tampon de texture, une texture ou un échantillonneur.
ID3D11UnorderedAccessView Accédez à une ressource non triée à l’aide d’un nuanceur de pixels ou d’un nuanceur de calcul.

 

Vues brutes des mémoires tampons

Vous pouvez considérer une mémoire tampon brute, qui peut également être appelée mémoire tampon d’adresses d’octets, comme un sac de bits auquel vous souhaitez un accès brut, c’est-à-dire une mémoire tampon à laquelle vous pouvez facilement accéder par le biais de segments d’une à quatre valeurs d’adresse 32 bits sans type. Vous indiquez que vous souhaitez un accès brut à une mémoire tampon (ou une vue brute d’une mémoire tampon) lorsque vous appelez l’une des méthodes suivantes pour créer une vue sur la mémoire tampon :

Vous pouvez utiliser les types d’objets HLSL ByteAddressBuffer et RWByteAddressBuffer lorsque vous utilisez des tampons bruts.

Pour créer une vue brute dans une mémoire tampon, vous devez d’abord appeler ID3D11Device::CreateBuffer avec l’indicateur D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS pour créer la ressource de mémoire tampon sous-jacente. Vous spécifiez cet indicateur dans le membre MiscFlags de la structure D3D11_BUFFER_DESC sur laquelle pointe le paramètre pDescd’ID3D11Device::CreateBuffer . Vous ne pouvez pas combiner l’indicateur D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS avec D3D11_RESOURCE_MISC_BUFFER_STRUCTURED. En outre, si vous spécifiez D3D11_BIND_CONSTANT_BUFFER dans BindFlags de D3D11_BUFFER_DESC, vous ne pouvez pas également spécifier D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS dans MiscFlags. Il ne s’agit pas d’une limitation des vues brutes, car les mémoires tampons constantes ont déjà une contrainte de ne pas pouvoir être combinées avec n’importe quelle autre vue.

En dehors des cas non valides précédents, lorsque vous créez une mémoire tampon avec D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, vous n’êtes pas limité en fonctionnalités au lieu de ne pas définir D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS. Autrement dit, vous pouvez utiliser une telle mémoire tampon pour un accès non brut de toutes les manières possibles avec Direct3D. Si vous spécifiez l’indicateur D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS , vous augmentez uniquement les fonctionnalités disponibles.

Ressources

Nouveaux types de ressources