索引缓存的好处
- 减少了顶点缓存的顶点个数(不需重复顶点)。
- 灵活修改图形形状(通过修改索引序列而不是顶点序列)。
- 提高渲染效率,runtime将多次用到的顶点数据放置在相近的地方Cache中(local reference)。
三角形的顶点缓存
画一个三角形需要3个顶点,先建立一个大小为3个顶点的缓存大小
Device->CreateVertexBuffer(
3 * sizeof(Vertex), // size in bytes
D3DUSAGE_WRITEONLY, // flags
Vertex::FVF, // vertex format
D3DPOOL_MANAGED, // managed memory pool
&Triangle, // return create vertex buffer
0); // not used - set to 0
//
// Fill the buffers with the triangle data.
//
Vertex* vertices;
Triangle->Lock(0, 0, (void**)&vertices, 0);
vertices[0] = Vertex(-1.0f, 0.0f, 2.0f);
vertices[1] = Vertex( 0.0f, 1.0f, 2.0f);
vertices[2] = Vertex( 1.0f, 0.0f, 2.0f);
Triangle->Unlock();
在display函数中设定图元等信息
bool Display(float timeDelta)
{
if( Device )
{
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
Device->BeginScene();
Device->SetStreamSource(0, Triangle, 0, sizeof(Vertex));
Device->SetFVF(Vertex::FVF);
// Draw one triangle.
Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
Device->EndScene();
Device->Present(0, 0, 0, 0);
}
return true;
}
<img src = ‘https://i.loli.net/2019/07/22/5d35626b7af0710270.png’ width=400></img>
四边形的顶点缓存
如果要画一个四边形,我们可以建立6个顶点,
Vertex* vertices;
Triangle->Lock(0, 0, (void**)&vertices, 0);
vertices[0] = Vertex(0.0f, 0.0f, 2.0f);
vertices[1] = Vertex(0.0f, 1.0f, 2.0f);
vertices[2] = Vertex(1.0f, 0.0f, 2.0f);
vertices[3] = Vertex(1.0f, 0.0f, 2.0f);
vertices[4] = Vertex(0.0f, 1.0f, 2.0f);
vertices[5] = Vertex(1.0f, 1.0f, 2.0f);
Triangle->Unlock();
<img src = ‘https://i.loli.net/2019/07/22/5d35643b0c53477999.png’ width=400></img>
但是这样有2个重复的顶点,浪费了2个的顶点的空间,所以我们可以用索引缓存。
四边形的索引缓存
Vertex rect[6] = {v0, v1, v2, //triangle 0
v0,v2,v3}; //triangle 1
<img src = ‘(https://i.loli.net/2019/07/22/5d3565c7b3ca336364.png’ width=400></img>
这样只需要4个顶点就能实现同样的效果了。注意顶点是逆时针排序的。