菜鸟DirectX之索引缓存

很佩服自己这个点还在写BLOG,因为一个游戏下载了一半中间报错了,靠,重新下载。

什么是索引缓存

索引指的是对顶点的索引,也就是我们上一篇BLOG中讲到的,想象一个正方形,有四个顶点,顺时针编号为 0,1,2,3 那么它的索引就是 {0,1,2} {0,2,3}

为什么要用索引缓存

正方形一共就四个点,如果采用顶点缓存我们就要设计六个点(两个三角形),这样就多存了50&的无用点,这不科学。

如何使用顶点缓存

使用地点缓存分为四步

1 设计顶点格式

和设计顶点缓存一样

struct MYVERTEX

{

float  x,y,z,rhw;

DWORD color;

}

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) 

2 创建顶点缓存和索引

函数 CreateVertexBuff 和 CreateIndexBuffer

比如:

LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL;    //顶点缓冲区对象
LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer  = NULL;    // 索引缓存对象


//创建顶点缓存
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) )
{
return E_FAIL;
}
// 创建索引缓存
if( FAILED( g_pd3dDevice->CreateIndexBuffer(6 * sizeof(WORD), 0, 
D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL)) )
{
return E_FAIL;


}

3 访问顶点缓存和索引缓存

这里直接贴代码,思路和顶点缓存的一样

//顶点数据的设置,
CUSTOMVERTEX Vertices[4];
Vertices[0].x = 10;
Vertices[0].y = 10;
Vertices[0].z = 0;
Vertices[0].color = D3DCOLOR_XRGB(255, 0,0);


Vertices[1].x = 10;
Vertices[1].y =210;
Vertices[1].z =0;
Vertices[1].color = D3DCOLOR_XRGB(255, 0,0);


Vertices[2].x = 210;
Vertices[2].y =210;
Vertices[2].z = 0;
Vertices[2].color = D3DCOLOR_XRGB(255, 0,0);


Vertices[3].x = 210;
Vertices[3].y = 10;
Vertices[3].z = 0;
Vertices[3].color = D3DCOLOR_XRGB(255, 0,0);

//填充顶点缓冲区
VOID* pVertices;
if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(Vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, Vertices, sizeof(Vertices) );
g_pVertexBuffer->Unlock();



//索引数组的设置
WORD Indices[] ={ 0,2,1,0,3,2};
 //这里三个点必须是顺时针,不然点会被剔除

// 填充索引数据
WORD *pIndices = NULL;
g_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0);
memcpy( pIndices, Indices, sizeof(Indices) );
g_pIndexBuffer->Unlock();

4 绘制图形

这里绘制正方形

// 设置渲染状态
g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);
g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX) );//设置数据源
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetIndices(g_pIndexBuffer);//设置索引缓存
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);//利用索引缓存配合顶点缓存绘制图形


你可能感兴趣的:(菜鸟DirectX之索引缓存)