(Direct3D 9) 创建顶点缓冲区

通过调用 IDirect3DDevice9::CreateVertexBuffer 方法创建顶点缓冲区对象,该方法接受五个参数。 第一个参数指定顶点缓冲区长度(以字节为单位)。 使用 sizeof 运算符确定顶点格式的大小(以字节为单位)。 请考虑以下自定义顶点格式。

struct CUSTOMVERTEX {
        FLOAT x, y, z;
        FLOAT rhw;
        DWORD color;
        FLOAT tu, tv;   // Texture coordinates
};

// Custom flexible vertex format (FVF) describing the custom vertex structure
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

若要创建顶点缓冲区来保存四个 CUSTOMVERTEX 结构,请为 Length 参数指定 [4*sizeof (CUSTOMVERTEX) ]。

第二个参数是一组使用控件。 除其他事项外,其值确定顶点缓冲区是否能够包含位于查看区域外部的顶点的剪裁信息(以剪裁标志的形式)。 若要创建不能包含剪辑标志的顶点缓冲区,请包含 Usage 参数的 D3DUSAGE_DONOTCLIP 标志。 仅当同时指示顶点缓冲区将包含转换的顶点时,才会应用D3DUSAGE_DONOTCLIP标志 - D3DFVF_XYZRHW标志包含在 FVF 参数中。 如果指示缓冲区将包含未转换的顶点 (D3DFVF_XYZ标志) , 则 IDirect3DDevice9::CreateVertexBuffer 方法将忽略D3DUSAGE_DONOTCLIP标志。 剪切标志占用额外的内存,使支持剪切的顶点缓冲区略大于无法包含剪切标志的顶点缓冲区。 由于这些资源是在创建顶点缓冲区时分配的,因此必须提前请求支持剪辑的顶点缓冲区。

第三个参数 FVF 是描述顶点缓冲区顶点格式的 D3DFVF 的组合。 如果为此参数指定 0,则顶点缓冲区为非 FVF 顶点缓冲区。 有关详细信息,请参阅 FVF 顶点缓冲区 (Direct3D 9) 。 第四个参数描述要放置顶点缓冲区的内存类。

IDirect3DDevice9::CreateVertexBuffer 接受的最后一个参数是变量的地址,如果调用成功,该变量将使用指向顶点缓冲区对象的新 IDirect3DVertexBuffer9 接口的指针填充。

不能为在没有支持顶点的情况下创建的顶点缓冲区生成剪辑标志。

以下 C++ 代码示例演示创建顶点缓冲区在代码中的外观。

   
// d3dDevice contains the address of an IDirect3DDevice9 interface
// g_pVB is a variable of type LPDIRECT3DVERTEXBUFFER9 

// The custom vertex type
struct CUSTOMVERTEX {
    FLOAT x, y, z;
    FLOAT rhw;
    DWORD color;
    FLOAT tu, tv;   // The texture coordinates
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

// Create a clipping-capable vertex buffer. Allocate enough memory 
// in the default memory pool to hold three CUSTOMVERTEX 
// structures

    if( FAILED( d3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
            0 /*Usage*/, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
        return E_FAIL;

顶点缓冲区