既然已经定义了顶点格式,接下来就要初始化顶点。Vertices示例工程在创建了Direct3D对象之后,调用自定义函数InitVB来完成这件工作。下面初始化三个自定义顶点,并赋值给它们:
CUSTOMVERTEX vertices[] =
{
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
};
上面的代码将所有顶点值填充为一个三角形,并且指定了每个顶点发光的颜色。第一个顶点位于150,50并发出红光,第二个顶点位于250,250并发出绿光,第三个顶点位于50,250并发出蓝绿光。每个顶点都有0.5的深度值,和1.0的RHW值。
下一步是要调用IDirect3DDevice9::CreateVertexBuffer来创建一个顶点缓冲,如下所示:
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0 /**//* Usage */, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB ) ) )
return E_FAIL;
前两个参数是告知Direct3D新顶点缓冲的大小和用途。之后的两个参数指定了新缓冲的向量格式和存储区域。这里向量格式是D3DFVF_CUSTOMVERTEX,这也是前面的示例代码中创建的灵活顶点格式(FVF)。D3DPOOL_DEFAULT标志表明在一个最合适的存储区域里面创建这个缓冲。最后一个参数是将要创建的顶点缓冲的地址。
创建了顶点缓冲之后,经过如下操作就可以将顶点数据填充进去。
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, g_Vertices, sizeof(vertices) );
g_pVB->Unlock();
首先调用IDirect3DVertexBuffer9::Lock锁定顶点缓冲。第一个参数是待锁定数据区域的偏移量(按字节)。第二个参数是待锁定顶点数据的大小(以字节为单位)。第三个参数是一个字节型指针的地址,其内容是指向顶点数据的指针。第四个参数告诉顶点缓冲怎样锁定数据。
通过调用memcpy,顶点就被拷贝到顶点缓冲当中。做完memcpy之后,就需要调用IDirect3DVertexBuffer9::Unlock来对顶点缓冲进行解锁。之所以需要这种锁定和解锁的机制是因为,顶点缓冲可能位于设备内存当中。
现在顶点数据已经位于顶点缓冲当中,下面到了渲染显示的时候了。详见第三步:渲染并显示。