原文地址:
http://blog.csdn.net/poem_qianmo/article/details/8304741
单单用顶点缓存来绘制图形的方法在应对复杂图形的时候非常不科学,显得复杂而力不从心。
也就是说,当物体模型很复杂、顶点数量很大时,仅使用顶点缓存绘制图形会使重复的顶点大大增加,并且Direct3D仍需要对这些重复的顶点进行计算,因此需要更多的存储空间和更大的开销。
这时候,我们顶点缓存的红颜知己——索引缓存是时候出场了。
索引缓存(Index Buffers),人如其名,它就是一个索引,用于记录顶点缓存中每一个顶点的索引位置。
索引缓存作为顶点缓存的目录和提纲,能让顶点缓存发挥出内在的潜力,更高效更容易地绘制出一个3D图形来。
另外提一点,索引缓存能够加速显存中快速存取顶点数据位置的能力。
顶点缓存保存了物体模型所有的顶点数据,而这些数据可以是唯一的。索引缓存保存了构成物体的顶点在顶点缓存的索引值,通过索引查找对应的顶点,以完成图形的绘制。
使用顶点缓存配合索引缓存绘制图形,
用到的是IDirect3DDevice9::DrawIndexedPrimitive函数,它的原型如下:
HRESULT DrawIndexedPrimitive(
[in] D3DPRIMITIVETYPE Type,
[in] INT BaseVertexIndex,
[in] UINT MinIndex,
[in] UINT NumVertices,
[in] UINT StartIndex,
[in] UINT PrimitiveCount
); IDirect3DDevice9::DrawIndexedPrimitive函数
第一个参数,D3DPRIMITIVETYPE类型的Type,这个参数和DrawPrimitive方法中第一个参数一摸一样,表示将要绘制的图元类型。
第二个参数,INT类型的BaseVertexIndex,表示将要进行绘制的索引缓存的起始顶点的索引位置。
第三个参数,UINT类型的MinIndex,表示索引数组中最小的索引值,通常都设为0,这样我们的索引就是0,1,2,3,4,5这样往后排的。
第四个参数,UINT类型的NumVertices,表示我们这次调用DrawIndexedPrimitive方法所需要的顶点个数,也就是为多少个顶点做索引,或者说是索引缓存中使用的顶点数目。
第五个参数,UINT类型的StartIndex,表示从索引中的第几个索引处开始绘制我们的图元,或者说是索引缓存区开始读索引值的起始位置。
第六个参数,UINT类型的PrimitiveCount,显然就是要绘制的图元个数了。
用一个图来说明这个函数: