D3D-从顶点到几何体

Published: 24 Feb 2014 Category: 游戏研发

在计算机3D世界中,所有的物体都是通过多边形进行表示的,而多边形又是由点来存储。

顶点缓冲适用于存放定点的内存块。

灵活顶点格式(FVF,Flexible Vertex Format)适用于描述顶点属性的一种格式,可以自定义。

1 灵活顶点格式

定义顶点结构体。

struct Vertex
{
    float x, y, z; // Position of vertex in 3D space
    DWORD color;   // Color of vertex
};

定义顶点属性的宏。

#define D3DFVF_MY_VERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE )

2 创建顶点缓冲

使用CreateVertexBuffer函数创建顶点缓冲,然后将数据存入顶点缓冲区内。

    g_pd3dDevice->CreateVertexBuffer( 6*sizeof(Vertex), 0, 3DFVF_MY_VERTEX,
                                      D3DPOOL_DEFAULT, &g_pLineStrip_VB,
                                      NULL );

    pVertices = NULL;
    g_pLineStrip_VB->Lock( 0, 0, (void**)&pVertices, 0 );
    memcpy( pVertices, g_lineStrip, sizeof(g_lineStrip) );
    g_pLineStrip_VB->Unlock();

3 绘制多边形

通过存储的顶点缓冲绘制多边形,首先使用SetStreamSource设置多边形的顶点缓冲区。 然后SetFVF设置顶点格式,最后就可以使用DrawPrimitive绘制多边形。

    g_pd3dDevice->SetStreamSource( 0, g_pPointList_VB, 0, sizeof(Vertex) );
    g_pd3dDevice->SetFVF( D3DFVF_MY_VERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 5 );


4 图元

在使用DrawPrimitive时,需要设置图元类型,这样D3D才知道根据输入的顶点流绘制什么样的多边形。

图元类型有三种:点、线和三角形。

点:D3DPT_POINTLIST

线:D3DPTLINELIST,D3DPTLINESTRIP

三角形: D3DPTTRIANGLELIST,D3DPTTRIANGLESTRIP,D3DPT_TRIANGLEFAN

绘制图元的时候是左手坐标系,只可以从法线方向可以看到图元