IDirect3DDevice9::DrawIndexedPrimitiveUP 的索引个数推算

IDirect3DDevice9::DrawIndexedPrimitiveUP 的索引个数推算

首先参考SDK里这个函数的定义:

HRESULT DrawIndexedPrimitiveUP(

D3DPRIMITIVETYPE PrimitiveType,

UINT MinVertexIndex,

UINT NumVertices,

UINT PrimitiveCount,

CONST void * pIndexData,

D3DFORMAT IndexDataFormat,

CONST void* pVertexStreamZeroData,

UINT VertexStreamZeroStride

);

 

这里假设我们要绘制一个由2个三角形组成的面,那么参数这样设置

MinVertexIndex = 0;

NumVertices = 4;

PrimitiveCount = 2;

pIndexData = { 0,1, 2, 0, 2, 3}

IndexDataFormat = D3DFMT_INDEX16

pVertexStreamZeroData = { 4个角的位置 }

VertexStreamZeroStride  = { 结构体的跨度 }

 

我们注意到, 没有任何一个参数用于描述CONST void * pIndexData的size 大小.

但其实你的图元是可以正确绘制的, 但是你并没有在indexdata后面加上例如字符串0的结尾副,那么D3D是怎么知道IndexCount呢?

我们先看下怎么根据VertexCount及 PrimitveType确定 PrimitiveCount

PrimitveType 公式
D3DPT_POINTLIST PrimitiveCount = VertexCount
D3DPT_LINELIST PrimitiveCount = VertexCount/2
D3DPT_LINESTRIP PrimitiveCount = VertexCount-1
D3DPT_TRIANGLELIST PrimitiveCount = VertexCount/3
D3DPT_TRIANGLESTRIP PrimitiveCount = VertexCount-2

注: D3DPT_TRIANGLEFAN在以后的驱动中已经不再使用,因此不再采用

当使用索引缓冲时, VertexCount = IndexCount

因此在上例中 PrimitiveCount = IndexCount/3

也就是说 IndexCount = PrimitiveCount * 3

代入PrimitiveCount = 2,因此 IndexCount = 6

 

因此稳定的API的函数参数设计是绝不会浪费任何一个参数的

你可能感兴趣的:(IDirect3DDevice9::DrawIndexedPrimitiveUP 的索引个数推算)