如何:创建顶点缓冲区
顶点缓冲区 包含每个顶点数据。 本主题演示如何初始化静态 顶点缓冲区,即不会更改的顶点缓冲区。 有关初始化非静态缓冲区的帮助,请参阅 备注 部分。
初始化静态顶点缓冲区
- 定义描述顶点的结构。 例如,如果顶点数据包含位置数据和颜色数据,则结构将具有一个描述位置的向量,另一个用于描述颜色。
- 使用 malloc 或新) 为步骤 1 中定义的结构分配内存 (。 使用描述几何图形的实际顶点数据填充此缓冲区。
- 通过填充 D3D11_BUFFER_DESC 结构来创建缓冲区说明。 将 D3D11_BIND_VERTEX_BUFFER 标志传递给 BindFlags 成员,并将结构的大小从步骤 1 传递到 ByteWidth 成员。
- 通过填充 D3D11_SUBRESOURCE_DATA 结构创建子资源数据说明。 D3D11_SUBRESOURCE_DATA 结构的 pSysMem 成员应直接指向在步骤 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 更新速度更快。
相关主题