Types de ressources (Direct3D 10)

Toutes les ressources utilisées par le pipeline Direct3D dérivent de deux types de ressources de base : les mémoires tampons et les textures. Une mémoire tampon est une collection de données brutes (éléments) ; une texture est une collection de texels (éléments de texture).

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

Élément Description
Tapé
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.

 

Ressources de mémoire tampon

Une ressource de mémoire tampon est une collection de données entièrement typées ; en interne, une mémoire tampon contient des éléments. Un élément est composé de 1 à 4 composants. Exemples de types de données d’élément : une valeur de données packed (comme R8G8B8A8), un entier 8 bits unique, quatre valeurs float 32 bits. Ces types de données sont utilisés pour stocker des données, telles qu’un vecteur de position, un vecteur normal, une coordonnée de texture dans une mémoire tampon de vertex, un index dans une mémoire tampon d’index ou l’état de l’appareil.

Une mémoire tampon est créée en tant que ressource non structurée. Étant donné qu’elle n’est pas structurée, une mémoire tampon ne peut pas contenir de niveaux mipmap, n’est pas filtrée lors de la lecture et ne peut pas être échantillonnée plusieurs fois.

Types de mémoire tampon

Tampon de vertex

Une mémoire tampon est une collection d’éléments ; une mémoire tampon de vertex contient des données par sommet. L’exemple le plus simple est une mémoire tampon de vertex qui contient un type de données, par exemple des données de position. Elle peut être visualisées comme l’illustration suivante.

illustration d’une mémoire tampon de vertex qui contient des données de position

Plus souvent, une mémoire tampon de vertex contient toutes les données nécessaires pour spécifier entièrement les sommets 3D. Un exemple de ceci peut être une mémoire tampon de vertex qui contient la position par sommet, les coordonnées normales et les coordonnées de texture. Ces données sont généralement organisées sous forme d’ensembles d’éléments par vertex, comme illustré dans l’illustration suivante.

illustration d’une mémoire tampon de vertex qui contient des données de position, de normale et de texture

Cette mémoire tampon de vertex contient des données par vertex pour huit sommets ; chaque sommet stocke trois éléments (coordonnées de position, normale et de texture). La position et la normale sont généralement spécifiées à l’aide de trois floats 32 bits (DXGI_FORMAT_R32G32B32_FLOAT) et des coordonnées de texture à l’aide de deux floats 32 bits (DXGI_FORMAT_R32G32_FLOAT).

Pour accéder aux données à partir d’une mémoire tampon de vertex, vous devez savoir à quel vertex accéder et ces autres paramètres de mémoire tampon :

  • Offset : nombre d’octets entre le début de la mémoire tampon et les données du premier sommet. Le décalage est fourni à IASetVertexBuffers.
  • BaseVertexLocation : nombre d’octets entre le décalage et le premier sommet utilisé par l’appel de dessin approprié (voir Méthodes de dessin).

Avant de créer une mémoire tampon de vertex, vous devez définir sa disposition en créant un objet input-layout ; Pour ce faire, appelez CreateInputLayout. Une fois l’objet input-layout créé, liez-le à la phase d’assembleur d’entrée en appelant IASetInputLayout.

Pour créer une mémoire tampon de vertex, appelez CreateBuffer.

Mémoire tampon d’index

Une mémoire tampon d’index contient un ensemble séquentiel d’index 16 bits ou 32 bits ; chaque index est utilisé pour identifier un sommet dans une mémoire tampon de vertex. L’utilisation d’une mémoire tampon d’index avec une ou plusieurs mémoires tampons de vertex pour fournir des données à l’étape IA est appelée indexation. Une mémoire tampon d’index peut être visualisées comme l’illustration suivante.

illustration d’une mémoire tampon d’index

Les index séquentiels stockés dans une mémoire tampon d’index se trouvent avec les paramètres suivants :

  • Offset : nombre d’octets entre le début de la mémoire tampon et le premier index. Le décalage est fourni à IASetIndexBuffer.
  • StartIndexLocation : nombre d’octets entre le décalage et le premier sommet utilisé par l’appel de dessin approprié (voir Méthodes de dessin).
  • IndexCount : nombre d’index à afficher.

Pour créer une mémoire tampon d’index, appelez CreateBuffer.

Une mémoire tampon d’index peut assembler plusieurs bandes de ligne ou de triangle en les séparant par un index coupé en bandes. Un index coupé en bandes permet de dessiner plusieurs bandes de ligne ou de triangle avec un seul appel de dessin. Un index découpé en bandes est simplement la valeur maximale possible pour l’index (0xffff pour un index 16 bits, 0xffffffff pour un index 32 bits). L’index de coupe à bandes réinitialise l’ordre d’enroulement dans les primitives indexées et peut être utilisé pour éliminer la nécessité de triangles dégénérés qui, autrement, pourraient être nécessaires pour maintenir un ordre d’enroulement approprié dans une bande de triangles. L’illustration suivante montre un exemple d’index coupé en bandes.

illustration d’un index coupé en bandes

Mémoire tampon constante

Direct3D 10 a introduit une nouvelle mémoire tampon pour fournir des constantes de nuanceur appelée mémoire tampon de constante de nuanceur ou simplement mémoire tampon constante. D’un point de vue conceptuel, elle ressemble à une mémoire tampon de vertex à élément unique, comme illustré dans l’illustration suivante.

illustration d’une mémoire tampon de constante de nuanceur

Chaque élément stocke une constante de composant de 1 à 4, déterminée par le format des données stockées.

Les mémoires tampons constantes réduisent la bande passante nécessaire pour mettre à jour les constantes du nuanceur en permettant aux constantes de nuanceur d’être regroupées et validées en même temps au lieu d’effectuer des appels individuels pour valider chaque constante séparément.

Pour créer une mémoire tampon de constante de nuanceur, appelez CreateBuffer et spécifiez l’indicateur de liaison constant-buffer D3D10_BIND_CONSTANT_BUFFER (voir D3D10_BIND_FLAG).

Pour lier une mémoire tampon de constante nuanceur au pipeline, appelez l’une de ces méthodes : GSSetConstantBuffers, PSSetConstantBuffers ou VSSetConstantBuffers.

Notez que lors de l’utilisation de l’interface ID3D10Effect, le processus de création, de liaison et de création d’une mémoire tampon constante est géré par l’interface ID3D10Effect instance. Dans ce cas, il est nécessaire d’obtenir la variable à partir de l’effet avec l’une des méthodes GetVariable telles que GetVariableByName et de mettre à jour la variable avec l’une des méthodes SetVariable telles que SetMatrix. Pour obtenir un exemple d’utilisation de l’interface ID3D10Effect pour gérer une mémoire tampon constante, consultez le tutoriel 07.

Un nuanceur continue à lire les variables dans une mémoire tampon constante directement par nom de variable de la même façon que les variables qui ne font pas partie d’une mémoire tampon constante sont lues.

Chaque étape du nuanceur permet jusqu’à 15 mémoires tampons constantes de nuanceur ; chaque mémoire tampon peut contenir jusqu’à 4 096 constantes.

Utilisez une mémoire tampon constante pour stocker les résultats de l’étape de flux de sortie.

Pour obtenir un exemple de déclaration d’une mémoire tampon constante dans un nuanceur, consultez Constantes du nuanceur (DirectX HLSL).

Ressources de texture

Une ressource de texture est une collection structurée de données conçue pour stocker des texels. Contrairement aux mémoires tampons, les textures peuvent être filtrées par des échantillonneurs de textures, car elles sont lues par unités de nuanceur. Le type de texture a un impact sur la façon dont la texture est filtrée. Un texel représente la plus petite unité d’une texture qui peut être lue ou écrite par le pipeline. Chaque texel contient 1 à 4 composants, organisés dans l’un des formats DXGI (voir DXGI_FORMAT).

Les textures sont créées en tant que ressource structurée afin que leur taille soit connue. Toutefois, chaque texture peut être typée ou moins typée au moment de la création de la ressource, tant que le type est entièrement spécifié à l’aide d’une vue lorsque la texture est liée au pipeline.

Types de textures

Il existe plusieurs types de textures : 1D, 2D, 3D, chacune pouvant être créée avec ou sans mipmaps. Direct3D 10 prend également en charge les tableaux de textures et les textures multi-échantillonnée.

Texture 1D

Une texture 1D dans sa forme la plus simple contient des données de texture qui peuvent être traitées avec une seule coordonnée de texture ; elle peut être visualisées sous la forme d’un tableau de texels, comme illustré dans l’illustration suivante.

illustration d’une texture 1d

Chaque texel contient un certain nombre de composants de couleur en fonction du format des données stockées. En ajoutant plus de complexité, vous pouvez créer une texture 1D avec des niveaux mipmap, comme illustré dans l’illustration suivante.

illustration d’une texture 1d avec des niveaux de mipmap

Un niveau mipmap est une texture qui est une puissance de deux plus petite que le niveau au-dessus. Le niveau supérieur contient le plus de détails, chaque niveau suivant est plus petit ; pour un mipmap 1D, le plus petit niveau contient un texel. Les différents niveaux sont identifiés par un index appelé LOD (niveau de détail) ; vous pouvez utiliser le LOD pour accéder à une texture plus petite lors du rendu d’une géométrie qui n’est pas aussi proche de la caméra.

Tableau de textures 1D

Direct3D 10 a également une nouvelle structure de données pour un tableau de textures. Un tableau de textures 1D ressemble conceptuellement à l’illustration suivante.

illustration d’un tableau de textures 1d

Ce tableau de textures contient trois textures. Chacune des trois textures a une largeur de texture de 5 (soit le nombre d’éléments dans la première couche). Chaque texture contient également un mipmap à 3 couches.

Tous les tableaux de textures dans Direct3D sont un tableau homogène de textures ; Cela signifie que chaque texture d’un tableau de textures doit avoir le même format de données et la même taille (y compris la largeur de la texture et le nombre de niveaux de mipmap). Vous pouvez créer des tableaux de textures de différentes tailles, à condition que toutes les textures de chaque tableau correspondent à la taille.

Texture 2D et tableau de textures 2D

Une ressource Texture2D contient une grille 2D de texels. Chaque texel est adressable par un vecteur u, v. Étant donné qu’il s’agit d’une ressource de texture, elle peut contenir des niveaux de mipmap et des sous-ressources. Une ressource de texture 2D entièrement remplie ressemble à l’illustration suivante.

illustration d’une ressource de texture 2D

Cette ressource de texture contient une seule texture 3x5 avec trois niveaux de mipmap.

Une ressource Texture2DArray est un tableau homogène de textures 2D ; autrement dit, chaque texture a le même format de données et les mêmes dimensions (y compris les niveaux mipmap). Il a une disposition similaire à celle du tableau de textures 1D, sauf que les textures contiennent désormais des données 2D, et ressemble donc à l’illustration suivante.

illustration d’un tableau de ressources de texture 2d

Ce tableau de textures contient trois textures ; chaque texture est 3x5 avec deux niveaux de mipmap.

Utilisation d’un Texture2DArray comme cube de texture

Un cube de texture est un tableau de textures 2D qui contient 6 textures, une pour chaque face du cube. Un cube de texture entièrement rempli ressemble à l’illustration suivante.

illustration d’un tableau de ressources de texture 2d qui représentent un cube de texture

Un tableau de textures 2D qui contient 6 textures peut être lu à partir de nuanceurs avec les fonctions intrinsèques de la carte de cube, une fois qu’ils sont liés au pipeline avec une vue de texture de cube. Les cubes de texture sont traités à partir du nuanceur avec un vecteur 3D pointant vers le centre du cube de texture.

Texture 3D

Une ressource Texture3D (également appelée texture de volume) contient un volume 3D de texels. Étant donné qu’il s’agit d’une ressource de texture, elle peut contenir des niveaux mipmap. Une texture 3D entièrement remplie ressemble à l’illustration suivante.

illustration d’une ressource de texture 3D

Lorsqu’une tranche mipmap de texture 3D est liée en tant que sortie cible de rendu (avec une vue de cible de rendu), la texture 3D se comporte de manière identique à un tableau de textures 2D avec n tranches. La tranche de rendu particulière est choisie à partir de l’étape geometry-shader, en déclarant un composant scalaire des données de sortie comme valeur système SV_RenderTargetArrayIndex.

Il n’existe aucun concept de tableau de textures 3D ; Par conséquent, une sous-ressource de texture 3D est un seul niveau mipmap.

Sous-ressources

L’API Direct3D 10 référence des ressources entières ou des sous-ensembles de ressources. Pour spécifier une partie des ressources, Direct3D a inventé le terme sous-ressources, ce qui signifie un sous-ensemble d’une ressource.

Une mémoire tampon est définie comme une sous-ressource unique. Les textures sont un peu plus compliquées, car il existe plusieurs types de texture différents (1D, 2D, etc.) dont certains prennent en charge les niveaux de mipmap et/ou les tableaux de textures. À partir du cas le plus simple, une texture 1D est définie comme une sous-ressource unique, comme illustré dans l’illustration suivante.

illustration d’une texture 1d

Cela signifie que le tableau de texels qui composent une texture 1D est contenu dans une seule sous-ressource.

Si vous développez une texture 1D avec trois niveaux de mipmap, vous pouvez la visualiser comme suit.

illustration d’une texture 1d avec des niveaux de mipmap

Considérez cela comme une texture unique composée de trois sous-textes. Chaque sous-texte étant compté comme sous-ressource, cette texture 1D contient 3 sous-ressources. Une sous-texte (ou sous-ressource) peut être indexée à l’aide du niveau de détail (LOD) pour une seule texture. Lors de l’utilisation d’un tableau de textures, l’accès à une sous-texture particulière nécessite à la fois le LOD et la texture particulière. L’API combine également ces deux informations en un seul index de sous-ressource de base zéro, comme illustré ici.

illustration d’un index de sous-ressource de base zéro

Sélection de sous-ressources

Certaines API accèdent à une ressource entière (par exemple CopyResource), d’autres accèdent à une partie d’une ressource (par exemple UpdateSubresource ou CopySubresourceRegion). Les API qui accèdent à une partie d’une ressource utilisent généralement une description d’affichage (telle que D3D10_TEX2D_ARRAY_DSV) pour spécifier les sous-ressources auxquelles accéder.

Ces illustrations illustrent les termes utilisés par une description de vue lors de l’accès à un tableau de textures.

Tranche de tableau

Étant donné un tableau de textures, chaque texture avec des mipmaps, une tranche de tableau (représentée par le rectangle blanc) inclut une texture et toutes ses sous-textures, comme illustré dans l’illustration suivante.

illustration d’une jointure de tableau

Mip Slice

Une tranche mip (représentée par le rectangle blanc) comprend un niveau de mipmap pour chaque texture d’un tableau, comme illustré dans l’illustration suivante.

illustration d’une jointure mip

Sélection d’une sous-ressource unique

Vous pouvez utiliser ces deux types de tranches pour choisir une sous-ressource unique, comme illustré dans l’illustration suivante.

illustration du choix d’une sous-ressource à l’aide d’une tranche de tableau et d’une splice mip

Sélection de plusieurs sous-ressources

Vous pouvez également utiliser ces deux types de tranches avec le nombre de niveaux de mipmap et/ou le nombre de textures pour choisir plusieurs sous-ressources.

illustration du choix de plusieurs sous-ressources

Quel que soit le type de texture que vous utilisez, avec ou sans mipmaps, avec ou sans tableau de textures, vous pouvez utiliser la fonction d’assistance, D3D10CalcSubresource, pour calculer l’index d’une sous-ressource particulière.

Frappe forte ou faible

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.

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 les formats moins de type disponibles (voir DXGI_FORMAT). Vous devez spécifier la taille de la mémoire à allouer et indiquer 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. 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 bit composant du nouveau format correspond au nombre de bits de l’ancien format.

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 en tant que DXGI_FORMAT_R32G32B32A32_FLOAT et DXGI_FORMAT_R32G32B32A32_UINT simultanément à différents emplacements du pipeline.

Ressources (Direct3D 10)