Directx----Meshes

16108 ワード

ID 3 DXmeshインタフェースについては前述しましたが、単純なジオメトリを作成するためにD 3 DXCreateを使用しただけです.この記事では、ID 3 DXmeshインタフェースについて詳しく説明します.

1. Geometry Info


ID 3 DXmeshは、ID 3 DXBaseMeshから継承されています.ID 3 DXBaseMeshにはvertex bufferとindex bufferが含まれています.この二つの組み合わせによって、任意の三角形と任意の三角形の組み合わせを描くことができます.vertex bufferとindex bufferをID 3 DXBaseMeshから抽出するには、次の方法を使用します.
HRESULT ID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9* vertexBuf);
HRESULT ID3DXMesh::GeIndexBuffer(LPDIRECT3DindexBUFFER9* indexBuf);
ID 3 DXmesh自身も一連の方法を定義した.
        (1). GetFVF():頂点に戻るFVF
        (2). GetNumVertices():頂点の数を返します.
        (3). GetNumbytesPreVertex():各頂点のバイト数を返します.
        (4). GetNumFaces():三角形の数を返します.

2. .x File


3 Dグラフィックスでは、メッシュは一連の共面ポリゴンから構成されています.Direct 3 Dでは、メッシュを処理するためのいくつかのインタフェースが提供する、その中で最も一般的なものはID 3 DXmeshである.このインタフェースを用いるメッシュデータをロードし、メッシュの各種情報を得ることができる.
飛行機、花瓶、このような実体をモデルと呼び、このようなモデルを生成する過程をモデリングと呼ぶ.Direct 3 D利用xファイルでモデルを保存します.

3.モデルを表示


1つ表示します.xファイルは、実は簡単です:インポート.xファイル、入手.xファイルのMaterialとTextureに関する情報を使用して、オブジェクトをレンダリングします.
I:まず、いくつかのレンダリングに必要な変数を宣言します.メッシュ、マテリアル、テクスチャ

  
    
1 ID3DXMesh * Mesh = 0 ;
2 std::vector < D3DMATERIAL9 > Mtrls( 0 );
3 std::vector < IDirect3DTexture9 *> Textures( 0 );

 
II. 次に1つインポートする.xファイル.D 3 DXLoadMeshFromXインタフェースを利用して、Meshを得ることができます

  
    
1 HRESULT hr = 0 ;
2
3   // Load the XFile data.
4   ID3DXBuffer * adjBuffer = 0 ;
5 ID3DXBuffer * mtrlBuffer = 0 ;
6 DWORD numMtrls = 0 ;
7 hr = D3DXLoadMeshFromX(
8 _T( " bigship1.x " ),
9 D3DXMESH_MANAGED,
10 Device,
11 & adjBuffer,
12 & mtrlBuffer,
13 0 ,
14 & numMtrls,
15 & Mesh);

 
III:上から出たものを利用して、MaterialとTextureをセットする

  
    
1 if ( mtrlBuffer != 0 && numMtrls != 0 )
2 {
3 D3DXMATERIAL * mtrls = (D3DXMATERIAL * )mtrlBuffer -> GetBufferPointer();
4 for ( int i = 0 ; i < numMtrls; i ++ )
5 {
6 // the MatD3D property doesn't have an ambient value set
7 // when its loaded, so set it now:
8   mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
9 // save the ith material
10   Mtrls.push_back( mtrls[i].MatD3D );
11 // check if the ith material has an associative texture
12   if ( mtrls[i].pTextureFilename != 0 )
13 {
14 // yes, load the texture for the ith subset
15 IDirect3DTexture9 * tex = 0 ;
16 LPCWSTR lpTmp = 0 ;
17 lpTmp = ConvetASCIIToUnicode(mtrls[i].pTextureFilename);
18 D3DXCreateTextureFromFile(
19 Device,
20 lpTmp,
21 & tex);
22 // save the loaded texture
23 Textures.push_back( tex );
24 }
25 else
26 {
27 // no texture for the ith subset
28 Textures.push_back( 0 );
29 }
30 }
31

 
III:カメラ、レンダリングパラメータなどを設定してからモデルを表示できます

  
    
for ( int i = 0 ; i < Mtrls.size(); i ++ )
{
Device
-> SetMaterial( & Mtrls[i] );
Device
-> SetTexture( 0 , Textures[i]);
Mesh
-> DrawSubset(i);
}