OptimizedMesh サンプル

この OptimizedMesh サンプル サンプルでは、D3DX で読み込みおよび最適化を行うことができるさまざまな種類のメッシュと、レンダリングできるさまざまな種類の基盤のプリミティブを示します。最適化されたメッシュでは、レンダリングのパフォーマンスを向上できるように、頂点と面の順序が変更されています。

Bb147244.optimizedmesh(ja-jp,VS.85).jpg

Path

ソース : (SDK ルート)\Samples\C++\Direct3D\Meshes\OptimizedMesh
実行可能ファイル : (SDK ルート)\Samples\C++\Direct3D\Bin\x86 or x64\OptimizedMesh.exe

サンプルが動作するしくみ

このサンプルは 2 つの領域に分けることができます。それは、読み込みとレンダリングです。

読み込み

読み込みコードではまず、メッシュ ファイルのデータからメッシュを初期化し、呼び出しのたびに異なる最適化タイプを使用して OptimizeMeshData を 3 回呼び出します。使用する最適化タイプは、D3DXMESHOPT_ATTRSORT、D3DXMESHOPT_VERTEXCACHE、および D3DXMESHOPT_STRIPREORDER です。最適化タイプは、それに応じてメッシュの頂点と面の順序を変更する ID3DXMesh::Optimize に渡されます。

メッシュが設定されると、OptimizeMeshData は、面情報をトライアングル ストリップとして格納するためにいくつかのインデックス バッファーを作成します。まず、メッシュのマテリアルごとに 1 回ずつ D3DXConvertMeshSubsetToSingleStrip を呼び出します。この結果、そのマテリアルのメッシュ トライアングルを 1 つのトライアングル ストリップで表すインデックス バッファーが返されます。その後、このインデックス バッファーを使用してメッシュをレンダリングすることができます。次に、OptimizeMeshData はメッシュのマテリアルごとに D3DXConvertMeshSubsetToStrips を呼び出し、一連のトライアングル ストリップを表すインデックス バッファーを返します。1 つのトライアングル ストリップを返すには、代わりに D3DXConvertMeshSubsetToSingleStrip を呼び出します。

読み込みが完了すると、サンプルにはメッシュ データ セットが 3 つあります。各メッシュ データ セットには、異なるフラグを使用して最適化された ID3DXMesh、トライアングル サブセットを 1 つのストリップとして表すインデックス バッファーがマテリアルごとに 1 つずつ、およびサブセットを一連のストリップとして表すインデックスバッファーがマテリアルごとに 1 つずつ含まれます。

レンダリング

レンダリング コードは、読み込みコードと比べると単純です。これは、メッシュ データ セットが読み込み時に既に設定されており、レンダリングの呼び出しで直接使用できるためです。レンダリングするために、サンプルでは DrawMeshData を呼び出します。この関数はメッシュ データ セットを受け取り、それを使用してレンダリングを実行します。現在の最適化の設定に基づいて、適切なメッシュ データ セットが DrawMeshData に渡されます。

DrawMeshData の内部では、ユーザーが選択したプリミティブ タイプに従ってメッシュがレンダリングされます。トライアングル リストの場合、メッシュ オブジェクトの ID3DXBaseMesh::DrawSubset がマテリアルごとに 1 回ずつ呼び出されます。これは、メッシュが内部的にそのジオメトリをトライアングル リストとして格納するためです。ストリップの場合、DrawMeshData は IDirect3DDevice9::SetStreamSource および SetIndices() を呼び出して、プリミティブ ソースを設定します。IDirect3DDevice9::SetIndices に渡されるインデックス バッファーは、OptimizeMeshData で作成されたインデックス バッファーのいずれかです。メッシュが 1 つのトライアングル ストリップでレンダリングされる場合、D3DXConvertMeshSubsetToSingleStrip によって返されたインデックス バッファーが使用されます。複数のトライアングル ストリップが必要な場合は、代わりに、D3DXConvertMeshSubsetToStrips によって返されたバッファーが使用されます。頂点およびインデックス データが正しく初期化されると、DrawMeshData は IDirect3DDevice9::DrawIndexedPrimitive を呼び出して、メッシュをレンダリングします。