Microsoft DirectX 8.0 (Visual Basic) |
Microsoft® Direct3D® アプリケーションでメッシュを使用するには、まずメッシュをロードしなければならない。Meshes サンプル プロジェクトでは、必要な Direct3D オブジェクトをロードした後、アプリケーション定義関数 InitGeometry を呼び出して、トラのメッシュをロードする。
メッシュには、使用するすべてのマテリアルおよびテクスチャに関する情報を格納するマテリアル バッファが必要である。この関数は、最初にマテリアル バッファを宣言する。
Dim MtrlBuffer As D3DXBuffer
Meshes サンプル プロジェクトでは、次のコードに示すように、D3DX8.LoadMeshFromX メソッドを使ってメッシュをロードする。
Set g_Mesh = g_D3DX.LoadMeshFromX(App.Path + "\Tiger.x", D3DXMESH_MANAGED, _ g_D3DDevice, Nothing, MtrlBuffer, g_NumMaterials) If g_Mesh Is Nothing Then Exit Function
D3DXLoadMeshFromX が受け取る最初のパラメータは、ロードする Microsoft DirectX® ファイルの名前を指示する文字列である。このサンプルでは、Tiger.x からトラのメッシュをロードする。2 番目のパラメータは、メッシュの作成方法を Direct3D に指示する。このサンプルでは D3DXMESH_MANAGED フラグを使用している。このフラグは、インデックス バッファ用に D3DPOOL_MANAGED メモリ クラスを使用するように Direct3D に指示する。3 番目のパラメータは、メッシュのレンダリングに使用する Direct3D デバイスである。4 番目のパラメータは、D3DXBuffer オブジェクトを取る。このオブジェクトには、各面の隣接する面に関する情報が格納される。このサンプルでは、この情報は必要ないので、このパラメータは Nothing に設定されている。5 番目のパラメータも ID3DXBuffer オブジェクトへのポインタを取る。このメソッドが終了した後、このオブジェクトにはメッシュの D3DXMATERIAL 構造体が格納される。6 番目のパラメータは、このメソッドが返った後、RetMaterials パラメータに配置される D3DXMATERIAL 構造体の数を指定する Long 型の変数である。
メッシュ オブジェクトおよびマテリアルの情報がロードされた後、マテリアル バッファからマテリアルのプロパティおよびテクスチャ名を抽出する必要がある。
この情報をマテリアル バッファから取得する前に、このメッシュのすべてのマテリアルおよびテクスチャを格納できるように、マテリアルおよびテクスチャの配列のサイズを変更しなければならない。
ReDim g_MeshMaterials(g_NumMaterials) ReDim g_MeshTextures(g_NumMaterials)
メッシュ内の各マテリアルについて、次の処理が行われる。
最初のステップは、次のコードに示されているように、D3DX8.BufferGetMaterial を使ってマテリアルをコピーすることである。
g_D3DX.BufferGetMaterial MtrlBuffer, i, g_MeshMaterials(i)
BufferGetMaterial が受け取る最初のパラメータはマテリアル オブジェクトで、この場合は、MtrlBuffer である。2 番目のパラメータは、取得するマテリアルのインデックスである。3 番目のパラメータは、マテリアルを配置する位置である。
第 2 のステップは、次のコードに示されているように、マテリアルのアンビエント色を設定することである。
g_MeshMaterials(i).Ambient = g_MeshMaterials(i).diffuse
最後のステップは、次のコードに示されているように、マテリアルのテクスチャを作成することである。
strTexName = g_D3DX.BufferGetTextureName(MtrlBuffer, i) If strTexName <> "" Then Set g_MeshTextures(i) = g_D3DX.CreateTextureFromFile(g_D3DDevice, App.Path + "\" + strTexName) End If
すべてのマテリアルをロードした後、マテリアル バッファを Nothing に設定して、マテリアル バッファの使用を終了したことを Direct3D に知らせる必要がある。
Set MtrlBuffer = Nothing
メッシュ、および対応するマテリアルとテクスチャがロードされる。これでメッシュをディスプレイにレンダリングできる。これについては、「ステップ 2 : メッシュ オブジェクトのレンダリング」で説明する。