战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

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

posted on 2010-05-05 17:07 战魂小筑 阅读(1498) 评论(1)  编辑 收藏 引用 所属分类: 渲染 Shader 引擎

评论

# re: IDirect3DDevice9::DrawIndexedPrimitiveUP 的索引个数推算 2010-05-18 10:55 ZealKing
这个挺有意思的  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理