Comment : créer une mémoire tampon de vertex
Les mémoires tampons de vertex contiennent des données par vertex. Cette rubrique montre comment initialiser une mémoire tampon de vertexstatique, autrement dit, une mémoire tampon de vertex qui ne change pas. Pour obtenir de l’aide sur l’initialisation d’une mémoire tampon non statique, consultez la section Notes .
Pour initialiser une mémoire tampon de vertex statique
- Définissez une structure qui décrit un vertex. Par exemple, si vos données de vertex contiennent des données de position et des données de couleur, votre structure aurait un vecteur qui décrit la position et un autre qui décrit la couleur.
- Allouez de la mémoire (à l’aide de malloc ou New) pour la structure que vous avez définie à l’étape 1. Remplissez cette mémoire tampon avec les données de vertex réelles qui décrivent votre géométrie.
- Créez une description de la mémoire tampon en remplissant une structure _ _ desc de tampon d3d11 . Transmettez l' _ indicateur de tampon de vertex de liaison d3d11 _ _ au membre BindFlags et transmettez la taille de la structure de l’étape 1 au membre ByteWidth .
- Créez une description des données de sous-ressource en remplissant une structure de _ _ données de sous-ressource d3d11. Le membre pSysMem de la structure de données de sous- _ ressources _ d3d11 doit pointer directement vers les données de ressources créées à l’étape 2.
- Appelez ID3D11Device :: CreateBuffer lors du passage de la structure DESC de la _ _ mémoire tampon d3d11 , de la structure de données de la sous- _ ressource _ d3d11 et de l’adresse d’un pointeur vers l’interface ID3D11Buffer à initialiser.
L’exemple de code suivant montre comment créer une mémoire tampon de vertex. Cet exemple suppose que g _ pd3dDevice est un objet ID3D11Device valide.
ID3D11Buffer* g_pVertexBuffer;
// Define the data-type that
// describes a vertex.
struct SimpleVertexCombined
{
XMFLOAT3 Pos;
XMFLOAT3 Col;
};
// Supply the actual vertex data.
SimpleVertexCombined verticesCombo[] =
{
XMFLOAT3( 0.0f, 0.5f, 0.5f ),
XMFLOAT3( 0.0f, 0.0f, 0.5f ),
XMFLOAT3( 0.5f, -0.5f, 0.5f ),
XMFLOAT3( 0.5f, 0.0f, 0.0f ),
XMFLOAT3( -0.5f, -0.5f, 0.5f ),
XMFLOAT3( 0.0f, 0.5f, 0.0f ),
};
// Fill in a buffer description.
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( SimpleVertexCombined ) * 3;
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = verticesCombo;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
// Create the vertex buffer.
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer );
Remarques
Voici quelques méthodes permettant d’initialiser une mémoire tampon de vertex qui change au fil du temps.
- Créez une deuxième mémoire tampon avec l' _ utilisation _ intermédiaire de d3d11; remplissez la deuxième mémoire tampon à l’aide de ID3D11DeviceContext :: Map, ID3D11DeviceContext :: DEMAPPAGE; utilisez ID3D11DeviceContext :: CopyResource pour copier à partir de la mémoire tampon de mise en lots vers la mémoire tampon par défaut.
- Utilisez ID3D11DeviceContext :: UpdateSubresource pour copier des données à partir de la mémoire.
- Créez un tampon avec _ l’utilisation _ dynamique de d3d11et remplissez-le avec ID3D11DeviceContext :: Map, ID3D11DeviceContext :: DEMAPPAGE (en utilisant les indicateurs Discard et NoOverwrite de manière appropriée).
#1 et # 2 sont utiles pour le contenu qui change moins d’une fois par frame. En général, les lectures GPU sont rapides et les mises à jour de l’UC sont plus lentes.
#3 est utile pour le contenu qui change plus d’une fois par frame. En général, les lectures GPU sont plus lentes, mais les mises à jour de l’UC sont plus rapides.