Présentation des mémoires tampons dans Direct3D 11

Une ressource de mémoire tampon est une collection de données entièrement typées regroupées en éléments. Vous pouvez utiliser des mémoires tampons pour stocker un large éventail de données, notamment les vecteurs de position, les vecteurs normaux, les coordonnées de texture dans une mémoire tampon de vertex, les index dans une mémoire tampon d’index ou l’état de l’appareil. Un élément de mémoire tampon est composé de 1 à 4 composants. Les éléments de mémoire tampon peuvent inclure des valeurs de données empaquetées (telles que des valeurs de surface R8G8B8A8), des entiers 8 bits uniques ou quatre valeurs à virgule flottante 32 bits.

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, elle ne peut pas être filtrée lors de la lecture et elle ne peut pas être multiéchantillonnée.

Types de mémoire tampon

Voici les types de ressources de mémoire tampon pris en charge par Direct3D 11. Tous les types de mémoire tampon sont encapsulés par l’interface ID3D11Buffer .

Tampon de vertex

Une mémoire tampon de vertex contient les données de vertex utilisées pour définir votre géométrie. Les données de vertex incluent les coordonnées de position, les données de couleur, les données de coordonnées de texture, les données normales, etc.

L’exemple le plus simple d’une mémoire tampon de vertex est celui qui contient uniquement 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 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 ; 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 (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, ainsi que les paramètres de mémoire tampon supplémentaires suivants :

  • Décalage : nombre d’octets entre le début de la mémoire tampon et les données du premier sommet. Vous pouvez spécifier le décalage à l’aide de la méthode ID3D11DeviceContext::IASetVertexBuffers .
  • BaseVertexLocation : valeur ajoutée à chaque index avant la lecture d’un vertex à partir de la mémoire tampon de vertex.

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

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

Mémoire tampon d’index

Les mémoires tampons d’index contiennent des décalages d’entiers en tampons de vertex et sont utilisées pour rendre les primitives plus efficacement. 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. 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ébut de la mémoire tampon d’index = Adresse de base de la mémoire tampon d’index + Décalage (octets) + StartIndexLocation * ElementSize (octets) ;

Dans ce calcul, ElementSize correspond à la taille de chaque élément de mémoire tampon d’index, qui est de deux ou quatre octets.

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

Mémoire tampon constante

Une mémoire tampon constante vous permet de fournir efficacement des données de constantes de nuanceur au pipeline. Vous pouvez utiliser une mémoire tampon constante pour stocker les résultats de la phase de sortie de flux. D’un point de vue conceptuel, une mémoire tampon constante 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. Pour créer une mémoire tampon de constante de nuanceur, appelez ID3D11Device::CreateBuffer et spécifiez le membre D3D11_BIND_CONSTANT_BUFFER du type énuméré D3D11_BIND_FLAG .

Une mémoire tampon constante ne peut utiliser qu’un seul indicateur de liaison (D3D11_BIND_CONSTANT_BUFFER), qui ne peut pas être combiné avec un autre indicateur de liaison. Pour lier une mémoire tampon de constante de nuanceur au pipeline, appelez l’une des méthodes suivantes : ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::P SSetConstantBuffers ou ID3D11DeviceContext::VSSetConstantBuffers.

Pour lire une mémoire tampon de constante de nuanceur à partir d’un nuanceur, utilisez une fonction de charge HLSL (par exemple, Charger). Chaque étape du nuanceur permet jusqu’à 15 tampons de nuanceur constants ; chaque mémoire tampon peut contenir jusqu’à 4 096 constantes.

Mémoires tampons