Procédure : créer une mémoire tampon de vertex
Les tampons de vertex contiennent des données par sommet. Cette rubrique montre comment initialiser une mémoire tampon de vertex statique, c’est-à-dire 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 remarques .
Pour initialiser une mémoire tampon de vertex statique
- Définissez une structure qui décrit un sommet. 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 de nouveau) 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 mémoire tampon en remplissant une structure D3D11_BUFFER_DESC . Passez l’indicateur D3D11_BIND_VERTEX_BUFFER 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 D3D11_SUBRESOURCE_DATA . Le membre pSysMem de la structure D3D11_SUBRESOURCE_DATA doit pointer directement vers les données de ressource créées à l’étape 2.
- Appelez ID3D11Device::CreateBuffer en passant la structure D3D11_BUFFER_DESC , la structure D3D11_SUBRESOURCE_DATA et 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 );
Notes
Voici quelques façons d’initialiser une mémoire tampon de vertex qui change au fil du temps.
- Créer une 2e mémoire tampon avec D3D11_USAGE_STAGING ; remplissez la deuxième mémoire tampon à l’aide de ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap; utilisez ID3D11DeviceContext::CopyResource pour copier de la mémoire tampon intermédiaire vers la mémoire tampon par défaut.
- Utilisez ID3D11DeviceContext::UpdateSubresource pour copier des données à partir de la mémoire.
- Créez une mémoire tampon avec D3D11_USAGE_DYNAMIC et remplissez-la avec ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap (à l’aide des indicateurs Ignorer et NoOverwrite de manière appropriée).
#1 et #2 sont utiles pour le contenu qui change moins d’une fois par image. En général, les lectures gpu sont rapides et les mises à jour du processeur sont plus lentes.
#3 est utile pour le contenu qui change plusieurs fois par image. En général, les lectures gpu sont plus lentes, mais les mises à jour du processeur sont plus rapides.
Rubriques connexes