如何:建立頂點緩衝區
頂點緩衝區 包含每個頂點資料。 本主題說明如何初始化靜態 頂點緩衝區,也就是不會變更的頂點緩衝區。 如需初始化非靜態緩衝區的說明,請參閱 備註 一節。
初始化靜態頂點緩衝區
- 定義描述頂點的結構。 例如,如果您的頂點數據包含位置數據和色彩數據,則您的結構會有一個可描述位置的向量,而另一個向量描述色彩。
- 為您在步驟一中定義的結構配置記憶體(使用 malloc 或 new)。 使用描述幾何的實際頂點數據填入此緩衝區。
- 填入 D3D11_BUFFER_DESC 結構來建立緩衝區描述。 將D3D11_BIND_VERTEX_BUFFER旗標傳遞至 BindFlags 成員,並將結構的大小從步驟一傳遞至 ByteWidth 成員。
- 填入 D3D11_SUBRESOURCE_DATA 結構,以建立子資源數據描述。 pSysMemD3D11_SUBRESOURCE_DATA 結構的成員應該直接指向步驟 2 中建立的資源數據。
- 呼叫 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的緩衝區,並將它填入 ID3D11DeviceContext::Map、ID3D11DeviceContext::Unmap(適當地使用 Discard 和 NoOverwrite 旗標)。
#1 和 #2 對於每個畫面變更少於一次的內容很有用。 一般而言,GPU 讀取速度會很快,且 CPU 更新速度會變慢。
#3 適用於每幀內內容變動多次的情況。 一般而言,GPU 讀取速度會較慢,但 CPU 更新的速度會更快。
相關主題