索引缓存的作用
我们填充了6个顶点结构,但是一个矩形只有4个顶点。有两个顶点被写入缓存了两次,这样可能会造成-一些内存的浪费,特别是需要渲染的模型很复杂的时候,那时重复的顶点会变得更多,所以在D3D中还引入了索引缓存。索引缓存( (Index Buffers) ),人如其名,它就是一个索引,用于记录顶点缓存中每一个顶点的索引位置。
例如一个矩形:
如果在没有使用索引缓存的情况下,我们需要创建一个这样的顶点缓存:
vertex={v1,v2,v3,v3,v2,v4}.
需要六个顶点来渲染这个矩形,如果我们使用索引缓存的话,可以这样实现:
vertex={v1,v2,v3,v4}
index={1,2,3,3,2,4}.
索引缓存就好比是数组的下标,可以通过索引找到顶点缓
存
使用步骤
参考顶点缓存
#include<d3d9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#define WINDOWWIDTH 800
#define WINDOWHEIGHT 600
// 函数声明
bool InitializeD3D(HWND hWnd);
bool InitializeObjects();
void RenderScene();
void Shutdown();
//IDirect3D9 对象
IDirect3D9 * g_D3d9 = NULL;
//设备对象
IDirect3DDevice9 * g_D3DDevice = NULL;
//----------------------设置顶点缓存四部曲1:设计顶点缓存格式-----------------//
//保存几何体的顶点缓冲区。
IDirect3DVertexBuffer9 * g_VertexBuffer = NULL;
//设置索引缓存
IDirect3DIndexBuffer9 *g_IndexBuffer=NULL;
//自定义顶点类型的结构
struct TriangleD3DVertex
{
float x, y, z, rhw;
unsigned long color;
};
//我们自定义的FVF,它描述了我们的自定义顶点结构。
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
//回调函数
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
if(wParam == VK_ESCAPE)
{
PostQuitMessage(0);
}
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
WNDCLASSEX wndclass= {
0};
wndclass.cbSize = sizeof( WNDCLASSEX ) ; //设置结构体的字节数大小
//窗口类的附加内存相当于缓冲区 一般为0
wndclass.cbClsExtra = 0;
//窗口的附加内存相当于缓冲区 一般为0
wndclass.cbWndExtra = 0;
//获取一个笔刷 作用