D3D9--图元
Direct3D9中有6种图元,就是最基本的图形,再复杂的模型也是以这6种图元构造而成。
1.准备工作
定义顶点格式和布局,并初始化14个顶点
struct Vertex
{
D3DXVECTOR3 Position;
D3DCOLOR Diffuse;
};
D3DVERTEXELEMENT9 VertexElements[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION,0 },
{ 0, 12, D3DDECLTYPE_D3DCOLOR,D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },
D3DDECL_END()
};
Vertex Vertices[] =
{
D3DXVECTOR3( -0.5, 0.9,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( 0.5, 0.9, 0.5), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( -0.5, 0.6,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( 0.5, 0.6, 0.5), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( -0.5, 0.3,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( 0.5, 0.3, 0.5), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( -0.5, 0.0,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( 0.5, 0.0, 0.5), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( -0.5, -0.3,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( 0.5, -0.3,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( -0.5, -0.6,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( 0.5, -0.6,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( -0.5, -0.9,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
D3DXVECTOR3( 0.5, -0.9,0.5 ), D3DCOLOR_ARGB( 255, 255, 255, 255 ),
};
2. D3DPT_POINTLIST 点列表图元
g_pd3dDevice->SetVertexDeclaration(g_pVertexDec);
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( Vertex ) );
g_pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 14 );
看一下DrawPrimitive,很简单,三个参数,第一个参数指定图元类型,第二个参数从第几个顶点开始绘制,第三个参数绘制多少个图元。这里我们选择点列表图元,从第0个顶点开始绘制,总共绘制14个,这样就把所有顶点都绘制出来。
3. D3DPT_LINELIST 线列表图元
g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, 7 );
从第0个顶点开始,绘制7个线列表图元。
4.D3DPT_LINESTRIP 线带图元
g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, 13 );
从第0个顶点开始,绘制13个线带图元。和线列表图元的不同点是,上一个图元的最后一个顶点算是下一个图元的第一个顶点,从而把前后两个图元都连接起来
5. D3DPT_TRIANGLELIST 三角形列表图元
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4 );
从第0个顶点开始,绘制4个三角形列表图元,我们总共只有14个顶点,除以3,最多能画4个三角形,但D3D默认做了剔除运算,逆时针构成的三角形会被剔除不显示,所以我们只看到两个三角形,如果我们关闭剔除:
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
则四个三角形都会绘制出来。这个和线列表类似,上一个图元的点不会给下一个图元用。
6. D3DPT_TRIANGLESTRIP 三角形带图元
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 12 );
从第0个顶点开始,绘制12个三角形带图元。上一个图元的点(后俩个点)会给下一个图元用。所以最多能画12个三角形。
7. D3DPT_TRIANGLEFAN 三角形扇图元
这个适用于绘制圆形等,一个公用的顶点,所有三角形成扇形排布。
使用“三角形带”和“三角形扇”图元效率比“三角形列表”高,因为减少了点的重复性。比如我们绘制一个矩形,用“三角形列表”就会有两个重复点。
参考文档
http://msdn.microsoft.com/en-us/library/windows/desktop/bb172589(v=vs.85).aspx