如何:创建顶点缓冲区(十七)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyafang123/article/details/89637226

顶点缓冲区包含每个顶点数据,本节描述如何初始化静态顶点缓冲区,也就是说,顶点缓冲区不会改变。有关初始化非静态缓冲区的帮助,请参阅备注部分。

初始化静态顶点缓冲区

  1. 定义描述顶点的结构。例如,如果顶点数据包含位置数据和颜色数据,那么结构中就会有一个描述位置的向量和另一个描述颜色的向量。
  2. 为第一步中定义的结构分配内存(使用malloc或new),用描述几何图形的实际顶点数据填充这个缓冲区。
  3. 通过填充D3D11_BUFFER_DESC结构创建缓冲区。将D3D11_BIND_VERTEX_BUFFER标志传递给BindFlags成员,并将结构的大小从第一步传递给ByteWidth成员。
  4. 通过填充D3D11_SUBRESOURCE_DATA结构创建子资源数据描述。D3D11_SUBRESOURCE_DATA结构中的pSysMem成员应该直接指向步骤2中创建的资源数据。
  5. 通过调用CreateBuffer函数并且传递D3D11_BUFFER_DESC和D3D11_SUBRESOURCE_DATA结构体和ID3D11Buffer接口地址去初始化。

下面的代码示例演示如何创建顶点缓冲区。本例假设g_pd3dDevice是一个有效的ID3D11Device对象。

ID3D11Buffer*      g_pVertexBuffer;

// Define the data-type that
// describes a vertex.
struct SimpleVertexCombined
{
    D3DXVECTOR3 Pos;  
    D3DXVECTOR3 Col;  
};

// Supply the actual vertex data.
SimpleVertexCombined verticesCombo[] =
{
    D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
    D3DXVECTOR3( 0.0f, 0.0f, 0.5f ),
    D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
    D3DXVECTOR3( 0.5f, 0.0f, 0.0f ),
    D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
    D3DXVECTOR3( 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. 用D3D10_USAGE_STAGING创建第二个缓冲区,使用ID3D11DeviceContext::Map,ID3D11DeviceContext::UnMap填充第二个缓冲区,使用ID3D11DeviceContext::CopyResource将STAGING缓冲区复制到DEFAULT缓冲区。
  2. 使用ID3D11DeviceContext::UpdateSubresource从内存中复制数据。
  3. 用D3D11_USAGE_DYNAMIC创建一个缓冲区,并用ID3D11DeviceContext::Map、ID3D11DeviceContext::Unmap填充它.

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

#3对于每一帧变化超过一次的内容非常有用。一般来说,GPU的读取速度会变慢,但是CPU的更新速度会更快。

猜你喜欢

转载自blog.csdn.net/xiaoyafang123/article/details/89637226