Procedura: Creare un vertex buffer

I vertex buffer contengono dati per vertice. In questo argomento viene illustrato come inizializzare un buffer di vertici statici, ovvero un buffer dei vertici che non cambia. Per informazioni sull'inizializzazione di un buffer non statico, vedere la sezione osservazioni .

Per inizializzare un vertex buffer statico

  1. Definire una struttura che descrive un vertice. Ad esempio, se i dati dei vertici contengono dati di posizione e dati colore, la struttura avrà un vettore che descrive la posizione e un altro che descrive il colore.
  2. Allocare memoria (usando malloc o new) per la struttura definita nel passaggio 1. Riempire questo buffer con i dati dei vertici effettivi che descrivono la geometria.
  3. Creare una descrizione del buffer compilando una struttura D3D11_BUFFER_DESC . Passare il flag D3D11_BIND_VERTEX_BUFFER al membro BindFlags e passare le dimensioni della struttura dal passaggio 1 al membro ByteWidth .
  4. Creare una descrizione dei dati di sottorisorsa compilando una struttura D3D11_SUBRESOURCE_DATA . Il membro pSysMem della struttura D3D11_SUBRESOURCE_DATA deve puntare direttamente ai dati delle risorse creati nel passaggio 2.
  5. Chiamare ID3D11Device::CreateBuffer passando la struttura D3D11_BUFFER_DESC , la struttura D3D11_SUBRESOURCE_DATA e l'indirizzo di un puntatore all'interfaccia ID3D11Buffer per l'inizializzazione.

Nell'esempio di codice seguente viene illustrato come creare un buffer dei vertici. Questo esempio presuppone che g_pd3dDevice sia un oggetto ID3D11Device valido.

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 );
    

Commenti

Ecco alcuni modi per inizializzare un buffer dei vertici che cambia nel tempo.

  1. Creare un secondo buffer con D3D11_USAGE_STAGING; riempire il secondo buffer usando ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap; usare ID3D11DeviceContext::CopyResource per copiare dal buffer di staging al buffer predefinito.
  2. Usare ID3D11DeviceContext::UpdateSubresource per copiare i dati dalla memoria.
  3. Creare un buffer con D3D11_USAGE_DYNAMIC e riempirlo con i flag ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap (usando i flag Discard e NoOverwrite in modo appropriato).

#1 e 2 sono utili per il contenuto che cambia meno di una volta per frame. In generale, le letture GPU saranno veloci e gli aggiornamenti della CPU saranno più lenti.

#3 è utile per il contenuto che cambia più volte per ogni fotogramma. In generale, le letture GPU saranno più lente, ma gli aggiornamenti della CPU saranno più veloci.

Buffer

Come usare Direct3D 11