Share via


Types de ressource

Différents types de ressources ont une disposition (ou empreinte mémoire) distincte. 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.

Typeless

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. Voici quelques exemples de types de données d’éléments : 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, comme 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. Comme 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 multi-échantillonnée.

Types de mémoire tampon

Mémoire tampon 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, comme les 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 vertex, les coordonnées normales et 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, normales et de texture

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

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 :

  • Décalage : nombre d’octets entre le début de la mémoire tampon et les données du premier sommet.
  • BaseVertexLocation : nombre d’octets entre le décalage et le premier sommet utilisé par l’appel de dessin approprié.

Avant de créer une mémoire tampon de vertex, vous devez définir sa disposition en créant un objet de disposition d’entrée. Une fois l’objet de disposition d’entrée créé, liez-le à la phase Assembleur d’entrée (IA).

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 un ou plusieurs tampons de vertex pour fournir des données à la phase 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 :

  • Décalage : nombre d’octets entre le début de la mémoire tampon et le premier index.
  • StartIndexLocation : nombre d’octets entre le décalage et le premier sommet utilisé par l’appel de dessin approprié.
  • IndexCount : nombre d’index à afficher.

Une mémoire tampon d’index peut assembler plusieurs bandes de lignes ou de triangles (topologies primitives) en séparant chacune par un index découpé en bandes. Un index de coupe à bandes permet de dessiner plusieurs bandes de trait ou de triangle avec un seul appel de dessin. Un index de coupe à bandes est 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 supprimer la nécessité de triangles dégénérés qui, sinon, pourraient être nécessaires pour maintenir un ordre d’enroulement correct dans une bande de triangle. L’illustration suivante montre un exemple d’index de coupe à bandes.

illustration d’un index de coupe à bandes

Mémoire tampon constante

Direct3D dispose d’une mémoire tampon pour fournir des constantes de nuanceur appelée mémoire tampon constante du nuanceur ou simplement mémoire tampon constante. D’un point de vue conceptuel, il 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 du nuanceur d’être regroupées et validées en même temps plutôt que d’effectuer des appels individuels pour valider chaque constante séparément.

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

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

Utilisez une mémoire tampon constante pour stocker les résultats de la phase de sortie de flux.

Consultez Constantes de nuanceur (DirectX HLSL) pour obtenir un exemple de déclaration d’une mémoire tampon constante dans un nuanceur.

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 échantillonneurs de texture, 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, disposé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 sans type 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 texture

Il existe plusieurs types de textures : 1D, 2D, 3D, chacune pouvant être créée avec ou sans mipmaps. Direct3D 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 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 l’appareil photo.

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 (ce qui correspond au nombre d’éléments de 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.

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 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, tandis que d’autres accèdent à une partie d’une ressource. Les API qui accèdent à une partie d’une ressource utilisent généralement une description d’affichage 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, il existe souvent des fonctions d’assistance fournies 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 sans type, le type de données est inconnu lors de la première création de la ressource. L’application doit choisir parmi les formats sans type disponibles. 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 avec un format sans type peut être utilisée en tant que format FLOAT et format UINT simultanément à différents emplacements dans le pipeline.

Ressources