共用方式為


如何:建立頂點緩衝區

頂點緩衝區 包含每個頂點資料。 本主題說明如何初始化靜態 頂點緩衝區,也就是不會變更的頂點緩衝區。 For help initializing a non-static buffer, see the remarks section.

初始化靜態頂點緩衝區

  1. 定義描述頂點的結構。 例如,如果您的頂點資料包含位置資料和色彩資料,您的結構會有一個向量來描述位置和另一個描述色彩的向量。
  2. 針對您在步驟一中定義的結構,使用 malloc 或新的) 來配置記憶體 (。 以描述幾何的實際頂點資料填入此緩衝區。
  3. 填入 D3D11_BUFFER_DESC 結構來建立緩衝區描述。 將D3D11_BIND_VERTEX_BUFFER旗標傳遞至 BindFlags 成員,並將結構的大小從步驟一傳遞至 ByteWidth 成員。
  4. 填入 D3D11_SUBRESOURCE_DATA 結構,以建立子資源資料描述。 D3D11_SUBRESOURCE_DATA結構的pSysMem成員應該直接指向步驟二中建立的資源資料。
  5. 呼叫 ID3D11Device::CreateBuffer ,同時傳遞 D3D11_BUFFER_DESC 結構、 D3D11_SUBRESOURCE_DATA 結構,以及要初始化之 ID3D11Buffer 介面指標的位址。

下列程式碼範例示範如何建立頂點緩衝區。 此範例假設 g_pd3dDevice 是有效的 ID3D11Device 物件。

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

備註

以下是初始化經過一段時間變更之頂點緩衝區的一些方式。

  1. 使用 D3D11_USAGE_STAGING建立第 2 個緩衝區;使用 ID3D11DeviceCoNtext::MapID3D11DeviceCoNtext::Unmap填入第二個緩衝區;使用 ID3D11DeviceCoNtext::CopyResource 從暫存緩衝區複製到預設緩衝區。
  2. 使用 ID3D11DeviceCoNtext::UpdateSubresource 從記憶體複製資料。
  3. 使用 D3D11_USAGE_DYNAMIC建立緩衝區,並使用適當) 的 Discard 和 NoOverwrite 旗標,將它填入 ID3D11DeviceCoNtext::MapID3D11DeviceCoNtext::Unmap (。

#1 和 #2 對於每個畫面變更少於一次的內容很有用。 一般而言,GPU 讀取速度會很快,而 CPU 更新將會變慢。

#3 適用于每個畫面變更一次以上的內容。 一般而言,GPU 讀取速度會變慢,但 CPU 更新會更快。

緩衝區

如何使用 Direct3D 11