D3DX でのメッシュのサポート (Direct3D 9)
D3DX は、ヘルパー サービスを提供するユーティリティ ライブラリです。 これは Direct3D コンポーネントの上位レイヤーです。
メッシュ
D3DX は、.x ファイルの内容の読み込み、操作、レンダリングを行うメッシュ コンストラクトを実装しています。 基本的に、メッシュは何らかのジオメトリを定義する頂点のコレクションと、面を定義する一連のインデックスです。 メッシュにはいくつかの種類があります。
ID3DXBaseMesh には基礎が用意されています。 ID3DXMesh は ID3DXBaseMesh から継承し、チップごとの頂点キャッシュを使ってメッシュの最適化を追加します。 ID3DXSkinInfo はスキン メッシュのサポートを提供します。
ID3DXBaseMesh には、ベース メッシュから継承する ID3DXMesh メッシュ オブジェクトの操作とクエリを実行するメソッドが用意されています。 これには、隣接操作、ジオメトリ バッファーの取得、ロックまたはロック解除の操作 (頂点とインデックス)、コピー、レンダリング、面、頂点情報が含まれます。
Note
Direct3D 9 の以前のリリースで使用できた ID3DXPMesh インターフェイスと ID3DXSPMesh インターフェイス (それぞれプログレッシブ メッシュと簡易メッシュをサポートします) は削除されました。
メッシュのアーキテクチャ
メッシュには複雑なモデルのデータが含まれています。 これは、テクスチャや素材などのリソース、位置データや隣接データなどの属性を含む抽象データ コンテナーです。 描画のパフォーマンスと画面の外観を向上させるメッシュ操作がいくつかあります。 さらに、メッシュ操作の機能に影響を与えるメッシュの概念が他にもいくつかあります。 これらのメッシュの概念を理解して適用できるようになると、メッシュのパフォーマンスが向上します。
メッシュ オブジェクト データ
メッシュには、頂点バッファー、インデックス バッファー、属性バッファーが含まれています。
- 頂点バッファーには、メッシュの頂点である頂点データが含まれています。
- インデックス バッファーには、頂点バッファーにアクセスするための頂点インデックスが含まれています。 これにより、重複する頂点が減り、頂点バッファーのサイズを減らすことができます。 インデックス バッファーを使うのは、インデックス付きメッシュのみです。 たとえば、メッシュが三角形リストで構成されている場合、インデックス バッファーは使われません。
- 属性バッファーには属性データが含まれています。 属性はメッシュ頂点のプロパティであり、順不同です。 D3DX メッシュは、各面の属性を DWORD のグループに格納します。
属性テーブル
属性テーブルは、属性バッファーの内容を簡潔に表現したものです。 属性テーブルを作成するには、D3DXMESHOPT_ATTRSORT を使っていずれかの Optimize メソッドを呼び出すか、属性バッファーをロックしてデータを入力するか、SetAttributeTable を呼び出します。 メッシュをグループに並べ替えると、メッシュには属性テーブルが含まれます。 このようなことが起こるのは、属性並べ替えオプション (D3DXMESHOPT_ATTRSORT 以上) が指定されている状態で、Optimize が呼び出されたときです。 D3DX メッシュはインデックス付き三角形リストを使うため、IDirect3DDevice9::DrawIndexedPrimitive を使って描画されます。
Optimize を呼び出した結果として属性テーブルが作成されます。 最適化によって隣接するように並べ替えられるため、面は隣接している必要はありません。 たとえば、人間のメッシュの手には同じ属性を使用できます。 ID は面をグループに並べ替えるのに役立ちます。 .x ファイルのメッシュには、素材とテクスチャのプロパティの属性が自動的に生成されます。 良いパフォーマンスを得るには、Optimize (ATTRSORT) またはより効果的な Optimize (VERTEXCACHE) を呼び出す必要があります。 読み込み関数は、保存されたときとまったく同じ形式でデータを表示しようとします。 頂点バッファーまたはインデックス バッファー ベースのメッシュを使っている場合、メッシュ API は、ほとんどオーバーヘッドがない最適化関数とスキニング変換を提供します。
最適化の種類には、最も最適でないもの (D3DXMESHOPT_COMPACT) から最も最適なもの (D3DXMESHOPT_IGNOREVERTS) まで段階があります。 D3DXMESHOPT_STRIPREORDER は圧縮と属性の並べ替えを行います。 頂点キャッシュが true ではないデバイス上であっても、D3DXMESHOPT_VERTEXCACHE が常に推奨されます。
アプリケーション データ
アプリケーション データは、アプリケーションが管理するメッシュ データです。 メッシュの頂点データとこれらのバッファーによって管理されるデータの間には密接な結合があります。
素材バッファーには n 個の素材が含まれています。 .x ファイルが読み込まれると、Load 関数によって素材が返されます。 各サブセットは、独自の素材とテクスチャを持つことができます。 素材バッファーは静的です。
隣接バッファーには、エッジ、面、隣接する面に関する情報が含まれています。 一部のメッシュ操作は、どの面が互いに隣接しているかに関する認識に依存します。 この情報は隣接データと呼ばれ、隣接バッファーに保持されます。 これはメッシュの一部ではありませんが、アプリケーションによって維持され、必要に応じてメッシュ メソッドに提供する必要があります。
効果インスタンス バッファーには、効果インスタンスの一覧が含まれています。 効果インスタンスは状態が格納されています。 この状態情報はパイプラインを初期化するために使われます。 効果インスタンスには効果内の名前と値のペアが含まれます。
高度なメッシュに関するトピック
最適化されたメッシュは、ベース メッシュ機能に基づいて構築され、さらに新しいメッシュを作成する Optimize と元のメッシュを変更する OptimizeInPlace という 2 つのメソッドを含む頂点キャッシュの最適化機能を備えています。
D3DXGeneratePMesh は D3DX 簡略化アルゴリズムを使って、入力メッシュからプログレッシブ メッシュを生成します。 D3DXSimplifyMesh は、同じ簡略化アルゴリズムを使って、指定した詳細レベルの標準メッシュを入力メッシュから生成します。 ユーザーは、頂点コンポーネントごとに指定した重みと頂点ごとに指定した重みを通して、使われるエラー メトリックを制御できます。 コンポーネントごとの重みは、エッジの折りたたみごとに計算されたエラーのコンポーネント部分に対して乗算されます。 頂点ごとの重みは、その頂点の削除に決められたエラー メトリック値に対して乗算されます。 たとえば、頂点を削除したくない場合は、その頂点の重みを大きな値に設定します。 逆に、早く削除したい場合は、小さな値 (1 未満) に設定します。
ID3DXSkinInfo はスキン キャラクターをサポートしています。 スキン キャラクターは、一連のメッシュと、メッシュの頂点に影響を与える一連のボーンによって定義されます。 ボーンは変換階層として表されます。 各メッシュには、それに影響するすべてのボーンのマトリックスがあり、それによってメッシュはボーンのローカル座標空間に変換されます。 このマトリックスは、メッシュに対するボーンのボーン空間変換です。 これは、作成プロセスでスケルトンをメッシュに関連付けるときに定義されます。
スキン適用
スキニングは、ボーンを使ってメッシュの頂点を変換する手法です。 通常、ボーンは、人体の骨と同様に、階層的なスケルトンに配置されます。 その後、スキンをボーンにアタッチするなど、オブジェクトの頂点はボーンに関連付けられます。 ボーンが変形するとスキンも変形します。
スキン メッシュは、ボーンを使って多数の頂点に影響を与えます。 ボーンの SRT 方法に影響を与えるボーン変換データはユーザーが用意します。 メッシュは、変換されたボーンを使って、ボーンに関連付けられた頂点に影響を与えます。 パレットは SRT 変換の配列です。 多くの場合、パレットはマトリックスとして実装されますが、SRT 値を含めることができます。
プログレッシブ メッシュ トリミング
詳細度が低い領域では、レンダリングされた画面の外観が変わらない頂点の損失が許容されます。 これは、カメラから遠ざかるオブジェクトに特に当てはまります。 これは詳細レベルと呼ばれます。 ユーザーは、レンダリング効率を最大化するために詳細レベルを設定する API レベルのレンダリング コントロールを使用できます。
プログレッシブ メッシュ オブジェクトは多数の面から始まり、簡略化を使って面の数を減らします。 ビューに依存しないプログレッシブ メッシュは、ビュー非依存プログレッシブ メッシュ (VIPM) と呼ばれます。
面の数を減らすもう 1 つの方法はトリミングです。 これにより、メッシュから頂点と面が実際に削除されます。 トリミングは、上限 (面の最大数を制限するため) または下限 (面の最小数を制限するため) を指定して行うことができます。トリミングによって描画パフォーマンスは向上しますが、視覚的な品質を保つように使う必要があります。 トリミングの例については、Progressive Mesh SDK サンプルを参照してください。
視認性の高い領域の場合、プログレッシブ詳細レベル (PLOD) を使って解像度を上げることができます。 これは 1 つの面を 2 つの面に分割する手法です。
パッチ メッシュ
四角形と三角形のパッチという 2 種類の特殊なパッチ メッシュもサポートされています。 四角形パッチ メッシュは、コントロール ポイントが曲がりくねった四角形のシーケンスでレイアウトされているパッチ メッシュです。 四角形と三角形のパッチは、高次のサーフェスを作成するために使われます。 これらは三角形メッシュほど一般的には使われません。
関連トピック