2.6 Vertices and cVertexBuffer(顶点缓冲)
累死我了:
class cVertexBuffer { private: cGraphics *m_Graphics; // cGraphics父类 IDirect3DVertexBuffer8 *m_pVB; // Vertex buffer COM DWORD m_NumVertices; // 顶点数量 DWORD m_VertexSize; // 顶点大小 DWORD m_FVF; // FVF 灵活定点格式 BOOL m_Locked; // 标志缓冲是否locked char *m_Ptr; // 指向缓冲区的指针
public: cVertexBuffer(); // 构造函数 ~cVertexBuffer(); // 析构函数 // 获得COM, 大小, FVF, 和顶点数量 IDirect3DVertexBuffer8 *GetVertexBufferCOM(); unsigned long GetVertexSize(); unsigned long GetVertexFVF(); unsigned long GetNumVertices(); // 创建和释放顶点缓冲区 BOOL Create(cGraphics *Graphics, / unsigned long NumVertices, DWORD Descriptor, / long VertexSize); BOOL Free(); BOOL IsLoaded(); // 如果缓冲区分已经被分配返回TRUE. // 复制一系列顶点到顶点缓冲区 BOOL Set(unsigned long FirstVertex, / unsigned long NumVertices, void *VertexList); // 演示顶点缓冲区内容 BOOL Render(unsigned long FirstVertex, / unsigned long NumPrimitives, DWORD Type); // Lock 和 unlock 一个顶点缓冲区 BOOL Lock(unsigned long FirstVertex = 0, / unsigned long NumVertices = 0); BOOL Unlock(); void *GetPtr(); // 返回一个锁定的顶点缓冲区的指针 }; |
使用cVertextBuffer::Create创建顶点缓冲区,你需要一个cGraphics对象,顶点数量,FVF,每个顶点的大小。没错,你仍然需要自己定义一个顶点结构体,但是不要担心,这并不难,接下来你就会看到。
当你做完所有工作,记得要释放他,调用cVertexBuffer::Free进行释放。在这之前,调用cVertexBuffer::Set用顶点信息填充缓冲区。调用cVertexBuffer::Set使用第一个顶点的索引,顶点的数量和一个指向你定义的定点结构体的数组的指针
现在就可以使用cVertexBuffer::Render来进行绘制渲染多边形了。注意你可以指定从那个顶点开始绘制、要绘制多少面。使用Type参数,如图:(一看就想起来了)
(图在上边)
直接上例子:
// 如果 g_Graphics 是一个已经初始化过的 cGraphics 对象 // 定义一个顶点结构体和FVF typedef struct sVertex { float x, y, z, rhw; D3DCOLOR Diffuse; } sVertex; #define VERTEXFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) cVertexBuffer g_VB; g_VB.Create(&g_Graphics, 4, VERTEXFVF, sizeof(sVertex)); // Triangle strip vertices in 顺时针方向 sVertex Verts[4] = { { 0.0f, 0.0f, 0.0f,1.0f, D3DCOLOR_RGBA(255,0,0,255) }, { 200.0f, 0.0f, 0.0f,1.0f, D3DCOLOR_RGBA(0,255,0,255) }, { 0.0f, 200.0f, 0.0f,1.0f, D3DCOLOR_RGBA(0,0,255,255) }, { 200.0f, 200.0f, 0.0f,1.0f, D3DCOLOR_RGBA(255,255,255,255) }, }; g_VB.Set(0, 4, (void*)&Verts); // 绘制演示 the triangle strip g_VB.Render(0, 2, D3DPT_TRIANGLESTRIP); // 释放 vertex buffer g_VB.Free(); |