如何:建立頂點緩衝區
頂點緩衝區 包含每個頂點資料。 本主題說明如何初始化靜態 頂點緩衝區,也就是不會變更的頂點緩衝區。 For help initializing a non-static buffer, see the remarks section.
初始化靜態頂點緩衝區
- 定義描述頂點的結構。 例如,如果您的頂點資料包含位置資料和色彩資料,您的結構會有一個向量來描述位置和另一個描述色彩的向量。
- 針對您在步驟一中定義的結構,使用 malloc 或新的) 來配置記憶體 (。 以描述幾何的實際頂點資料填入此緩衝區。
- 填入 D3D11_BUFFER_DESC 結構來建立緩衝區描述。 將D3D11_BIND_VERTEX_BUFFER旗標傳遞至 BindFlags 成員,並將結構的大小從步驟一傳遞至 ByteWidth 成員。
- 填入 D3D11_SUBRESOURCE_DATA 結構,以建立子資源資料描述。 D3D11_SUBRESOURCE_DATA結構的pSysMem成員應該直接指向步驟二中建立的資源資料。
- 呼叫 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 );
備註
以下是初始化經過一段時間變更之頂點緩衝區的一些方式。
- 使用 D3D11_USAGE_STAGING建立第 2 個緩衝區;使用 ID3D11DeviceCoNtext::Map、 ID3D11DeviceCoNtext::Unmap填入第二個緩衝區;使用 ID3D11DeviceCoNtext::CopyResource 從暫存緩衝區複製到預設緩衝區。
- 使用 ID3D11DeviceCoNtext::UpdateSubresource 從記憶體複製資料。
- 使用 D3D11_USAGE_DYNAMIC建立緩衝區,並使用適當) 的 Discard 和 NoOverwrite 旗標,將它填入 ID3D11DeviceCoNtext::Map、 ID3D11DeviceCoNtext::Unmap (。
#1 和 #2 對於每個畫面變更少於一次的內容很有用。 一般而言,GPU 讀取速度會很快,而 CPU 更新將會變慢。
#3 適用于每個畫面變更一次以上的內容。 一般而言,GPU 讀取速度會變慢,但 CPU 更新會更快。
相關主題