5、
三角形扇形列表
最后一种三角形列表显示是扇形排列的三角形列表。这种排列方式,有一个特别的地方,就是所有三角形共享一个顶点,这样特别适合构成曲面的地方,比如球体和圆形的东西。下面看看这个例子显示的图:
通过上面这个图,可以看到4个三角形共享一个顶点,这个顶点是红颜色的,其它不同的顶点不同的颜色。下面来看看程序是怎么样实现它的显示的:
HRESULT hr;
// 创建顶点缓冲区。
if( FAILED( hr = m_pd3dDevice->CreateVertexBuffer(
2*3 * sizeof(VT_CAIPRIMITIVE),
0, VT_CAIPRIMITIVE::dwFVF,
D3DPOOL_MANAGED, &pVB, NULL ) ) )
{
//创建顶点缓冲区失败。
return DXTRACE_ERR( "CreateVertexBuffer", hr );
}
//
VT_CAIPRIMITIVE* pVertices;
if( FAILED( hr = pVB->Lock( 0, 0, (VOID**)&pVertices, 0 ) ) )
{
//锁住顶点缓冲区。
return DXTRACE_ERR( "Lock", hr );
}
pVertices[0].vPosition = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
pVertices[0].crDiffuse = D3DCOLOR_COLORVALUE( 1.0, 0.0, 0.0, 1.0 );
pVertices[1].vPosition = D3DXVECTOR3( -2.0f, 0.0f, 0.0f );
pVertices[1].crDiffuse = D3DCOLOR_COLORVALUE( 1.0, 0.0, 0.0, 1.0 );
//
pVertices[2].vPosition = D3DXVECTOR3( -sqrt(2.0f), sqrt(2.0f), 0.0f );
pVertices[2].crDiffuse = D3DCOLOR_COLORVALUE( 0.0, 1.0, 0.0, 1.0 );
pVertices[3].vPosition = D3DXVECTOR3( 0.0f, 2.0f, 0.0f );
pVertices[3].crDiffuse = D3DCOLOR_COLORVALUE( 0.0, 1.0, 0.0, 1.0 );
//
pVertices[4].vPosition = D3DXVECTOR3( sqrt(2.0f), sqrt(2.0f), 0.0f );
pVertices[4].crDiffuse = D3DCOLOR_COLORVALUE( 0.0, 0.0, 1.0, 1.0 );
pVertices[5].vPosition = D3DXVECTOR3( 2.0f, 0.0f, 0.0f );
pVertices[5].crDiffuse = D3DCOLOR_COLORVALUE( 0.0, 0.0, 1.0, 1.0 );
//解锁顶点缓冲区。
pVB->Unlock();
上面程序先创建6个顶点缓冲区空间,然后分别设置6个顶点的坐标值。当使用D3DPT_TRIANGLEFAN显示时,它的第一个顶点就是扇形的圆心,其它的顶点就相当圆周边上的点了,并且每个三角形的顶点都是按顺时针方向排列的,也就是按左手坐标系的方式来排列的。
最后按下面的方式来显示这4个三角形:
m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
m_pd3dDevice->SetStreamSource( 0, m_pvbTriangleFan, 0, sizeof(VT_CAIPRIMITIVE) );
m_pd3dDevice->SetFVF( VT_CAIPRIMITIVE::dwFVF );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, m_nTriangleFanCount );
上面还是使用线框图来渲染出来,这样更容易分清楚它们是怎么样显示的,总共有多少个三角形显示。在DrawPrimitive函数里使用D3DPT_TRIANGLEFAN方式显示,就是扇形的方式显示。
在三角形显示中,D3D就提供三种方式显示,那么什么时候使用它们是合适的呢?其实很多建模软件都作出合适的选择,减少顶点占用空间,提高渲染效率。
本电子书、
MM3D
引擎源程序
、例子源程序共
49
元一套
联系人:蔡军生
联系方式:
QQ: 9073204
EMAIL: caimouse1976 at sina.com