索引缓冲
很多时候,相邻的三角形会共用一些顶点,例如组成四方形的两个三角形就共用了一条边,即共用了两个顶点信息。如果不使用索引,我们需要六个顶点的信息来绘制这个四方形,但实际上绘制一个四方形只要四个顶点信息就足够了。如果使用了索引就不一样了,在顶点缓冲区里我们可以只保存四个顶点的信息,然后通过索引来读取顶点信息。要使用索引得先创建一个索引缓冲。也许读到这里你会有个疑问,创建一个索引缓冲不就更浪费内存空间了吗?其实不然,索引缓冲区的元素保存的是数字,一个数字所占用的内存肯定要比一个顶点所占用的小得多啦。当你节省了几千个顶点,你就会发现浪费那么一点点索引缓冲区是很值得的。
创建索引缓冲的函数是:IDirect3DDevice9::CreateIndexBuffer
HRESULT CreateIndexBuffer(
UINT Length,
DWORD Usage,
D3DFORMAT Format,
D3DPOOL Pool,
IDirect3DIndexBuffer9** ppIndexBuffer
);
Length:索引缓冲区的长度。通常使用索引数目乘以sizeof(WORD)或sizeof(DWORD)来设置,因为索引号的数据类型是字节(WORD)或双字节(DWORD),嗯,一个WORD只有两个字节,DWORD也就只有四个字节,比顶点的大小小多了吧。
Usage:和CreateVertexBuffer中的Usage设置一样。一般设为0。
Format:设置索引格式。不是D3DFMT_INDEX16就是D3DFMT_INDEX32的啦。
Pool:又是和CreateVertexBuffer中的一样。一般设为D3DPOOL_DEFAULT。
ppIndexBuffer:指向IDirect3DIndexBuffer9的指针。操作索引缓冲区就靠它的啦。记得使用完后要Release啊。
和填充顶点缓冲区一样,要填充索引缓冲区,要先使用IDirect3DIndexBuffer9::Lock来锁定缓冲区。
HRESULT Lock(
UINT OffsetToLock,
UINT SizeToLock,
void **ppbData,
DWORD Flags
);
是不是和IDirect3DVertexBuffer9::Lock一样呢?具体说明也可以参照上面的内容。填充完之后使用IDirect3DIndexBuffer9::UnLock来解锁。
最后使用IDirect3DDevice9::SetIndices来告诉设备要使用哪个索引。
HRESULT Setindices(
IDirect3DindexBuffer9* pIndexData,
UINT BaseVertexIndex
);
pIndexData:设置使用哪个索引缓冲。
BaseVertexIndex:设置以顶点缓冲区中的哪个顶点为索引0。
本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/html/20070514/19204.html