存储顶点的buffer称为vertex buffer, 创建buffer 的过程如下:
1、创建一个D3D11_BUFFER_DESC
2、创建一个D3D11_SUBRESOURCE_DATA
3、使用CreateBuffer创建一个buffer
其中D3D11_BUFFER_DESC的结构如下:
typedef struct D3D11_BUFFER_DESC
{
UINT ByteWidth;
D3D11_USAGE Usage;
UINT BindFlags;
UINT CPUAccessFlags;
UINT MiscFlags;
UINT StructureByteStride;
} D3D11_BUFFER_DESC;
ByteWidth表示我们要创建的顶点buffer的大小
D3D11_USAGE表示buffer如何被使用,其中主要有四种值:
1、 D3D11_USAGE_DEFAULT 表示 GPU会读写这块资源,而CPU不可以使用map进行读或写
2、D3D11_USAGE_IMMUTABLE 表示资源在创建后不变,对于GPU是readonly的,CPU不能进行读或写
3、D3D11_USAGE_DYNAMIC表示CPU需要经常更新资源,可以通过CPU写入GPU,并可读
4、D3D11_USAGE_STAGING表示CPU需要读资源的copy,可将GPU资源拷贝到CPU的内存中
BindFlags 对于顶点buffer,使用D3D11_BIND_VERTEX_BUFFER
CPUAccessFlags表示CPU如何access buffer. 0表示CPU不需要读写,D3D11_CPU_ACCESS_WRITE表示需要写,D3D11_CPU_ACCESS_READ表示需要写。CPU的读写比较慢,最好只需要GPU读写
MiscFlags对于顶点buffer并不需要flag
StructureByteStride 在结构化buffer中的每个元素的大小
D3D11_SUBRESOURCE_DATA结构如下:
typedef struct D3D11_SUBRESOURCE_DATA
{
const void *pSysMem;
UINT SysMemPitch;
UINT SysMemSlicePitch;
} D3D11_SUBRESOURCE_DATA;
pSysMem指向包括用来初始化buffer的数据的内存数组的指针
SysMemPitch和SysMemSlicePitch不在顶点buffer中使用
创建方法类似如下:
D3D11_BUFFER_DESC vbd;
vbd.Usage = D3D11_USAGE_IMMUTABLE;
vbd.ByteWidth = sizeof(Vertex) * 8;
vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = 0;
vbd.MiscFlags = 0;
vbd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA vinitData;
vinitData.pSysMem = vertices;
HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mVB));
在使用CreateBuffer进行创建之后,需要绑定在input slot上
void IASetVertexBuffers(
UINT StartSlot,
UINT NumBuffers,
ID3D11Buffer *const *ppVertexBuffers,
const UINT *pStrides,
const UINT *pOffsets);
StartSlot表示开始绑定顶点buffer的输入slot
NumBuffers表示绑定到输入slot上的顶点buffer
ppVertexBuffers指向buffer中的第一个元素的指针
pStrides指向存着大小的数组中的第一个元素
pOffsets指向存折偏移量的数组中的第一个元素