Vorgehensweise: Erstellen eines Vertexpuffers

Vertexpuffer enthalten Daten pro Vertex. In diesem Thema wird gezeigt, wie Sie einen statischen Vertexpuffer initialisieren, d. h. einen Vertexpuffer, der sich nicht ändert. Hilfe beim Initialisieren eines nicht statischen Puffers finden Sie im Abschnitt hinweise .

So initialisieren Sie einen statischen Vertexpuffer

  1. Definieren Sie eine Struktur, die einen Scheitelpunkt beschreibt. Wenn Ihre Vertexdaten z. B. Positions- und Farbdaten enthalten, verfügt Ihre Struktur über einen Vektor, der die Position beschreibt, und einen anderen, der die Farbe beschreibt.
  2. Zuordnen von Arbeitsspeicher (mit malloc oder new) für die Struktur, die Sie in Schritt 1 definiert haben. Füllen Sie diesen Puffer mit den tatsächlichen Vertexdaten, die Ihre Geometrie beschreiben.
  3. Erstellen Sie eine Pufferbeschreibung, indem Sie eine D3D11_BUFFER_DESC-Struktur ausfüllen. Übergeben Sie das flag D3D11_BIND_VERTEX_BUFFER an das BindFlags-Element , und übergeben Sie die Größe der Struktur aus Schritt 1 an das ByteWidth-Element .
  4. Erstellen Sie eine Unterressourcendatenbeschreibung, indem Sie eine D3D11_SUBRESOURCE_DATA Struktur ausfüllen. Das pSysMem-Element der D3D11_SUBRESOURCE_DATA-Struktur sollte direkt auf die in Schritt 2 erstellten Ressourcendaten verweisen.
  5. Rufen Sie ID3D11Device::CreateBuffer auf, während Sie die D3D11_BUFFER_DESC-Struktur , die D3D11_SUBRESOURCE_DATA-Struktur und die Adresse eines Zeigers auf die zu initialisierende ID3D11Buffer-Schnittstelle übergeben.

Im folgenden Codebeispiel wird veranschaulicht, wie ein Vertexpuffer erstellt wird. In diesem Beispiel wird davon ausgegangen, dass g_pd3dDevice ein gültiges ID3D11Device-Objekt ist.

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

Bemerkungen

Im Folgenden finden Sie einige Möglichkeiten zum Initialisieren eines Vertexpuffers, der sich im Laufe der Zeit ändert.

  1. Erstellen Sie einen 2. Puffer mit D3D11_USAGE_STAGING. füllen Sie den zweiten Puffer mit ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap; Verwenden Sie ID3D11DeviceContext::CopyResource , um aus dem Stagingpuffer in den Standardpuffer zu kopieren.
  2. Verwenden Sie ID3D11DeviceContext::UpdateSubresource , um Daten aus dem Arbeitsspeicher zu kopieren.
  3. Erstellen Sie einen Puffer mit D3D11_USAGE_DYNAMIC, und füllen Sie ihn mit ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap (mit den Flags Discard und NoOverwrite entsprechend).

#1 und #2 sind nützlich für Inhalte, die sich weniger als einmal pro Frame ändern. Im Allgemeinen sind GPU-Lesevorgänge schnell und CPU-Updates langsamer.

#3 ist nützlich für Inhalte, die sich mehr als einmal pro Frame ändern. Im Allgemeinen sind GPU-Lesevorgänge langsamer, aber CPU-Updates sind schneller.

Puffer

Verwenden von Direct3D 11