Direct3D - Vertex Buffers

存储顶点的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指向存折偏移量的数组中的第一个元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值