首先参考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的函数参数设计是绝不会浪费任何一个参数的