D3D的绘制函数总结

UP结尾的是User Pointer数据,不需要CreateVertexBuffer/CreateIndexBuffer函数创建内存;DrawSubSet是通过属性子集来绘制,

其实也是通过顶点缓存和索引缓存来绘制的,子集的个数就是纹理材质的个数,不使用网格优化也可以绘制使用网格优化会产生属性表有利于提高绘制效率。

关于绘制batch和性能优化

每个设置设备状态到发出绘制命令的转换都将产生一个Batch( [bætʃ]一批 )。动态顶点缓冲的推荐使用模式是一个可以合并Batch的模式,即不断地填充顶点数据,但不立刻绘制,在缓冲填满时才提交绘制一次,当然能合并的前提是各个batch都使用相同的设备状态,即纹理、材质、RenderStates、变换矩阵等

DrawPrimitive

渲染一个没有索引编制的序列,在数据输入流SetStreamSource中指定的类型的基础几何数据。
内部不会创建动态顶点缓存,用户输入的顶点个数是固定的,利于绘制静态的顶点缓存性能高;也可以声明使用方式为D3DUSAGE_DYNAMIC,可以用D3DLOCK_NOOVERWRITE,D3DLOCK_DISCARD动态更新顶点数据信息,例如粒子系统就可以使用。

Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
HRESULT DrawPrimitive(
  [in]  D3DPRIMITIVETYPE PrimitiveType, // 基础图元的类型D3DPRIMITIVETYPE
  [in]  UINT StartVertex, // 渲染开始的顶点下标
  [in]  UINT PrimitiveCount // 指定图元类型的个数(和图元类型相关),最大个数需要检测D3DCAPS0支持.
);
DrawPrimitive函数需要设置SetStreamSource。
SetStreamSource
绑定一个顶点缓存到一个设备数据流。
Device->SetStreamSource(0, Triangle, 0, sizeof(Vertex));
HRESULT SetStreamSource(   [in]  UINT StreamNumber,//指定一个数据流,从[0, streamNum-1].   [in]  IDirect3DVertexBuffer9 *pStreamData, // 绑定到设备数据流的顶点缓存指针   [in]  UINT OffsetInBytes,// 输入的顶点缓存的偏移,从0开始是输入整个缓存   [in]  UINT Stride// 组件的字节跨度,一般是顶点的字节数(特别是FVF vertex shader中),declaration的时候                   // 必须大于或者等于stream size. 如果顶点缓存被渲染多次的时跨度要用0表示,告诉runtime不要增长顶点缓存偏移。
);
Device->CreateVertexBuffer(
        3 * sizeof(Vertex), // size in bytes是申请的连续内存字节数据
        D3DUSAGE_WRITEONLY, // flags使用方式
        Vertex::FVF,        // vertex format顶点格式
        D3DPOOL_MANAGED,    // managed memory pool内存池类型
        &Triangle,          // return create vertex buffer 返回的顶点缓存
        0);                 // not used - set to 0

Dra

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值