Microsoft DirectX 8.0 (C++) |
Microsoft® Direct3D® アプリケーションでメッシュを使用するには、まずメッシュをロードしなければならない。Meshes サンプル プロジェクトでは、必要な Direct3D オブジェクトをロードした後、アプリケーション定義関数 InitGeometry を呼び出して、トラのメッシュをロードする。
メッシュには、使用するすべてのマテリアルおよびテクスチャを格納するマテリアル バッファが必要である。この関数は、次のサンプル コードに示すように、最初にマテリアル バッファを宣言する。
LPD3DXBUFFER pD3DXMtrlBuffer;
次のサンプル コードでは、D3DXLoadMeshFromX メソッドを使って、メッシュをロードしている。
// 指定したファイルからメッシュをロードする。 if( FAILED( D3DXLoadMeshFromX( "tiger.x", D3DXMESH_SYSTEMMEM, g_pd3dDevice, NULL, &pD3DXMtrlBuffer, &g_dwNumMaterials, &g_pMesh ) ) ) return E_FAIL;
D3DXLoadMeshFromX が受け取る最初のパラメータは、ロードする Microsoft DirectX® ファイルの名前を指示する文字列へのポインタである。このサンプルでは、Tiger.x からトラのメッシュをロードする。
2 番目のパラメータはメッシュの作成方法を Direct3D に指示する。このサンプルでは D3DXMESH_SYSTEMMEM フラグを使用している。これは、D3DXMESH_VB_SYSTEMMEM と D3DXMESH_IB_SYSTEMMEM の両方を指定していることと同じである。この 2 つのフラグは、メッシュのインデックス バッファおよび頂点バッファをシステム メモリに配置するよう Direct3D に指示する。
3 番目のパラメータは、メッシュのレンダリングに使用する Direct3D デバイスへのポインタである。
4 番目のパラメータは、ID3DXBuffer オブジェクトへのポインタである。このオブジェクトには、各面の隣接する面に関する情報が格納される。このサンプルでは、この情報は必要ないので、このパラメータは NULL に設定されている。
5 番目のパラメータも ID3DXBuffer オブジェクトへのポインタを取る。このメソッドが終了した後、このオブジェクトにはメッシュの D3DXMATERIAL 構造体が格納される。
6 番目のパラメータは、このメソッドが返った後、ppMaterials 配列に配置される D3DXMATERIAL 構造体の数へのポインタである。
7 番目のパラメータは、ロードされるメッシュを表す、メッシュ オブジェクトへのポインタのアドレスである。
メッシュ オブジェクトおよびマテリアルの情報がロードされた後、マテリアル バッファからマテリアルのプロパティおよびテクスチャ名を抽出する必要がある。
Meshes サンプル プロジェクトでは、まずマテリアル バッファへのポインタを取得することによって、この処理を行う。次のサンプル コードでは、ID3DXBuffer::GetBufferPointer メソッドを使って、このポインタを取得している。
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
次のサンプル コードでは、メッシュのマテリアルの合計数に基づいて、新しいメッシュおよびテクスチャ オブジェクトを作成している。
g_pMeshMaterials = new D3DMATERIAL8[g_dwNumMaterials]; g_pMeshTextures = new LPDIRECT3DTEXTURE8[g_dwNumMaterials];
メッシュ内の各マテリアルについて、次の処理が行われる。
最初のステップは、次のサンプル コードに示されているように、マテリアルをコピーすることである。
g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
第 2 のステップは、次のサンプル コードに示されているように、マテリアルのアンビエント色を設定することである。
g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse;
最後のステップは、次のサンプル コードに示されているように、マテリアルのテクスチャを作成することである。
// テクスチャを作成する。 if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, d3dxMaterials[i].pTextureFilename, &g_pMeshTextures[i] ) ) ) g_pMeshTextures[i] = NULL; }
各マテリアルをロードした後、マテリアル バッファが必要ではなくなったら、IUnknown::Release を呼び出して解放する必要がある。
pD3DXMtrlBuffer->Release();
メッシュ、および対応するマテリアルとテクスチャがロードされる。これでメッシュをディスプレイにレンダリングできる。これについては、「ステップ 2 : メッシュ オブジェクトのレンダリング」で説明する。