首页 > 【Direct3D研究院之PC网游开发】 > Direct3D研究院之使用索引缓冲区绘制图形(四)
2012
05-17

Direct3D研究院之使用索引缓冲区绘制图形(四)

有些复杂的图形是由多个相邻的三角形拼接而成的,比如56边形等,假如为每个三角形分配3个顶点,但是这样就会出现顶点相互重合的情况,从而造成内存的浪费,显然这是得不偿失的。那有没有更合适的处理方式呢?当然,索引缓冲区可以很好解决这个问题。

索引缓冲区和顶点缓冲区一样,都是COM接口,它其中保存的是多边形的三角形顶点在顶点缓冲区的索引,程序需要做的就是设置三角形的组合,然后通过各种顶点的组合绘制出复杂图形,这样就避免了重复顶点的出现,它的数值最多就是一个1632位的整数,这要比一个顶点所占用的内存小得多。因此在绘制那些顶点重复使用较多的复杂图形时,用索引缓冲区绘制效果好得多。

下面,我们就利用索引缓冲区绘制一个正多边形(此项目基于上一章内容)

首先声明索引缓冲区指针对象:

然后,修改InitVB方法:

在InitVB方法中,我们修改了原来的顶点缓冲区,因为绘制的是正多边形,所以在填充顶点缓冲区时,使用了三角函数进行处理。初始化索引缓冲区大小时需要注意的是,索引缓冲区中的数据一定要可被3整除,因为我们是以三角形为单位绘制的。

其中CreateIndexBuffer方法创建了索引缓冲区,它有6个参数,第一个参数表示创建的索引缓冲区的大小(以字节为单位);第二个参数表示索引缓冲区的属性,此处取默认值0;第三个参数为索引缓冲区中数据的格式,这个有具体使用的数据为准,此处为16位数据;第四个参数为内存类型(D3DPOOL);第五个参数为索引缓冲区指针地址;第六个参数为保留参数,此处置为NULL。

在填充索引缓冲区时,和填充顶点缓冲区相同,都需要先加锁再解锁,以保证操作的安全。

接着是Render方法,

在Render方法中主要增加了一个SetIndices方法,以及修改原来的绘制方法DrawPrimitive为DrawIndexedPrimitive。SetIndices方法只有一个参数,就是索引缓冲区指针。DrawIndexedPrimitive方法有6个参数,第一个参数是绘制的图元的类型,在此为三角形列表;第二个参数为索引缓冲区的起始地址,此处设置为0,表示从头开始绘制;第三个参数为索引缓冲区中最小的索引值;第四个参数为所要绘制的图形的顶点个数;第五个参数表示从索引缓冲区的哪个元素开始绘制;第六个参数绘制图元的数量。

最后,cleanup方法中添加索引缓冲区对象释放代码,

运行程序,我们看到下面的效果,

Direct3D研究院之使用索引缓冲区绘制图形(四) - 雨松MOMO程序研究院 - 1

此文仅供参考,如有不足,还望赐教,大家共同学习进步。

ZXGoto祝大家编程愉快!

 

 

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:ZXGoto
这个作者貌似有点懒,什么都没有留下。
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。