如何:创建顶点缓冲区

顶点缓冲区 包含每个顶点数据。 本主题演示如何初始化静态 顶点缓冲区,即不会更改的顶点缓冲区。 有关初始化非静态缓冲区的帮助,请参阅 备注 部分。

初始化静态顶点缓冲区

  1. 定义描述顶点的结构。 例如,如果顶点数据包含位置数据和颜色数据,则结构将具有一个描述位置的向量,另一个用于描述颜色。
  2. 使用 malloc 或新) 为步骤 1 中定义的结构分配内存 (。 使用描述几何图形的实际顶点数据填充此缓冲区。
  3. 通过填充 D3D11_BUFFER_DESC 结构来创建缓冲区说明。 将 D3D11_BIND_VERTEX_BUFFER 标志传递给 BindFlags 成员,并将结构的大小从步骤 1 传递到 ByteWidth 成员。
  4. 通过填充 D3D11_SUBRESOURCE_DATA 结构创建子资源数据说明。 D3D11_SUBRESOURCE_DATA 结构的 pSysMem 成员应直接指向在步骤 2 中创建的资源数据。
  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 创建缓冲区,并使用 ID3D11DeviceContext::MapID3D11DeviceContext::Unmap (适当地使用 Discard 和 NoOverwrite 标志) 填充缓冲区。

#1 和 #2 对于每帧更改少于一次的内容很有用。 通常,GPU 读取速度较快,CPU 更新速度较慢。

#3 适用于每帧更改多次的内容。 通常,GPU 读取速度较慢,但 CPU 更新速度更快。

缓冲区

如何使用 Direct3D 11