Direct3D索引缓存其实就是在顶点缓存的基础上对固定的顶点进行连接,比如我们平面有4个点,分别再左右上角,和左右下角,从左上角开始按顺时针顺序给他们索引依次为0,1,2,3。(这些索引是你在顶点结构体里面设置的顺序)。
接着我们要利用这四个点绘制出一个正方形我们只需要利用索引缓存进行标号,比如012就形成了正方形右边的三角形,接着023就形成了另一边的三角形,这样就绘制出了一个正方形。是不是觉得不是很难。我们来看具体操作。
现在创建索引缓存和顶点缓存对象
LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer =NULL;
LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer =NULL;
然后设置顶点结构
struct VECREX3
{
FLOAT x,y,z;
WORD color;
};
#define VECREX3_FVF (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)//灵活顶点格式
这些步骤基本和顶点缓存差不多
然后再初始化顶点坐标和索引
srand(timeGetTime());
if (FAILED(g_pd3dDevic->CreateVertexBuffer(8*sizeof(VECREX3),0,VECREX3_FVF,
D3DPOOL_DEFAULT,&g_pVertexBuffer,NULL)))
{
return E_FAIL;
}
VECREX3 vertexs[]={
{270.0f,100.0f,0.0f,D3DCOLOR_XRGB(rand()%256,rand()%256,rand()%256),},//0
{540.0f,100.0f,0.0f,D3DCOLOR_XRGB(rand()%256,rand()%256,rand()%256),},//1
{810.0f,100.0f,0.0f,D3DCOLOR_XRGB(rand()%256,rand()%256,rand()%256),},//2
{810.0f,300.0f,0.0f,D3DCOLOR_XRGB(rand()%256,rand()%256,rand()%256),},//3
{810.0f,500.0f,0.0f,D3DCOLOR_XRGB(rand()%256,rand()%256,rand()%256),},//4
{540.0f,500.0f,0.0f,D3DCOLOR_XRGB(rand()%256,rand()%256,rand()%256),},//5
{270.0f,500.0f,0.0f,D3DCOLOR_XRGB(rand()%256,rand()%256,rand()%256),},//6
{270.0f,300.0f,0.0f,D3DCOLOR_XRGB(rand()%256,rand()%256,rand()%256),}//7
};
VOID *pVertices;
if (FAILED(g_pVertexBuffer->Lock(0,sizeof(vertexs),(void**)&pVertices,0)))
{
return E_FAIL;
}
memcpy(pVertices,vertexs,sizeof(vertexs));
g_pVertexBuffer->Unlock();
if (FAILED(g_pd3dDevic->CreateIndexBuffer(36*sizeof(DWORD),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,
&g_pIndexBuffer,NULL)))
{
return E_FAIL;
}
WORD indices[]={
0,1,7,
1,2,3,
3,4,5,
5,6,7
};
WORD *pIndices=NULL;
if (FAILED(g_pIndexBuffer->Lock(0,0,(void**)&pIndices,0)))
{
return E_FAIL;
}
memcpy(pIndices,indices,sizeof(indices));
g_pIndexBuffer->Unlock();
细心的人会发现我们这次的顶点里面少了设置了很多坐标,是的,因为索引缓存是将这些点在顶点数组里的下标来进行连接的017,123,345,567这些就是指连接那些顶点的顺序。
最后绘制图形也有一点变化如下
g_pd3dDevic->BeginScene();
g_pd3dDevic->SetRenderState( D3DRS_LIGHTING, FALSE);
g_pd3dDevic->SetStreamSource(0,g_pVertexBuffer,0,sizeof(VECREX3));
g_pd3dDevic->SetFVF(VECREX3_FVF);
g_pd3dDevic->SetIndices(g_pIndexBuffer);
g_pd3dDevic->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,4);
8代表8个顶点,4代表4个图元。
索引缓存更多具体解释请看http://blog.youkuaiyun.com/poem_qianmo/article/details/8304741