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。Device->CreateVertexBuffer(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不要增长顶点缓存偏移。
);
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
D3D的绘制函数总结
最新推荐文章于 2024-04-17 19:23:22 发布