一、初始化静态顶点缓冲区
1、定义顶点数据结构,包含颜色、位置等数据
2、分配顶点数据内存
3、初始化D3D11_BUFFER_DESC
4、初始化D3D11_SUBRESOURCE_DATA
5、通过ID3D11Device::CreateBuffer 创建顶点数据
ID3D11Buffer* g_pVertexBuffer = nullptr;
// step1 define device vertex struct
struct SimpleVertexCombined
{
XMFLOAT3 Pos; // 位置
XMFLOAT3 Col; // 颜色
};
// step2 分配内存并初始化
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 ),
};
// step3 初始化D3D11_BUFFER_DESC
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;
// step4 初始化D3D11_SUBRESOURCE_DATA
D3D11_SUBRESOURCE_DATA initData;
initData.pSysMem = verticesCombo;
initData.SysMemPitch = 0;
initData.SysMemSlicePitch = 0;
// step5 creatBuffer
hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &initData, &g_pVertexBuffer);
二、创建动态顶点数据
1、使用D3D11_USAGE_STAGING创建第二个缓冲区,通过ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap 填充
通过ID3D11DeviceContext :: CopyResource 复制到人默认缓冲区
2、ID3D11DeviceContext::UpdateSubresource 从内存拷贝数据
3、通过 D3D11_USAGE_DYNAMIC,创建一个缓冲区,通过ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap 填充
#1和#2对于每帧变化少于一次的内容很有用。 通常,GPU读取速度很快,而CPU更新速度则较慢。
#3对于每帧更改一次以上的内容很有用。 通常,GPU读取速度较慢,但CPU更新速度较快。