引言:
顶点缓存绘制图形,虽然比较简单,但是简单的图形还好。一个三角形,三个点。但是,比如我们要绘制一个立方体,需要6*2=12个三角形,总共要36个顶点,而实际上表示一个立方体只需要8个顶点就可以了。显然再使用顶点缓存绘图有些划不来,所以就有了索引缓存绘图。
定义:
索引缓存保存的就是一些索引,用于记录顶点缓存中每一个顶点的索引位置。这样,我们在定义顶点的时候,就不需要重复定义那些没有用的顶点坐标了,而是给出有用的顶点坐标,然后根据这些坐标在顶点缓存中的索引值给出顶点值,这样,大大方便了我们绘制图形。
步骤:
注意,索引缓存不是单独存在的,而是和顶点缓存配合使用的。使用索引缓存有以下几个步骤:
(这里只写了索引部分的,但是一定要注意索引是建立在顶点基础上的!顶点和索引都有的例子的在下面整个Demo中)
1.设计顶点格式,这个与顶点缓存一样,例如:
//------------绘制图形步骤1.定义灵活顶点格式
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)//坐标为经过变换的屏幕坐标,顶点的颜色
//------------根据上面定义的顶点格式,创建一个顶点的结构体
struct stVertex
{
float x, y, z,rhw; //位置坐标
DWORD dwColor; //颜色
};
这里只给出创建索引缓存的代码:
LPDIRECT3DINDEXBUFFER9 g_pIB = NULL;
//创建索引缓冲区
g_pDevice->CreateIndexBuffer(
48 * sizeof(WORD), //缓冲区大小
0, //缓冲区属性
D3DFMT_INDEX16, //索引大小,一般采用16位
D3DPOOL_DEFAULT, //存储位置,默认为显卡缓存
&g_pIB, //索引缓冲区指针的指针
NULL //保留参数,NULL即可
);
3.填充顶点缓存以及索引缓存。填写的方法还是差不多。填之前要Lock,填完后要UnLock。中间把索引内容拷贝到缓冲区中。
这里只给出填充索引缓存的代码:
//设置索引数组
WORD index[] = {0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7,
8, 0, 8, 9, 0, 9, 10, 0, 10, 11, 0, 11, 12, 0, 12, 13, 0, 13, 14, 0, 14, 15, 0, 15, 16, 0, 16, 1};
WORD *pIneices = NULL;
//锁缓冲区