Share via


D3DX のメッシュ サポート (Direct3D 9)

D3DX はヘルパー サービスを提供するユーティリティ ライブラリです。これは Direct3D 成分より上のレイヤーです。

メッシュ

D3DX は、メッシュ構造体を実装して .x ファイルの内容をロード、操作、 レンダリングします。基本的にメッシュは、ジオメトリの一部を定義する一連の頂点と、面を定義する一連のインデックスで構成されています。メッシュにはいくつかの種類があります。

ID3DXBaseMesh は基本的なメッシュを提供します。ID3DXMesh は ID3DXBaseMesh を継承したうえで、チップ単位の頂点キャッシュを使用してメッシュを最適化します。 ID3DXSkinInfo はスキニングしたメッシュをサポートしています。

ID3DXBaseMesh は、ベース メッシュを継承した ID3DXMesh メッシュ オブジェクトを操作および問い合わせるためのメソッドを提供します。これには、隣接性の操作、ジオメトリ バッファーの取得、Lock/Unlock 操作 (頂点およびインデックス)、およびコピー、レンダリング、面、頂点に関する情報が含まれます。

    Direct3D 9 の以前のリリースで利用可能であった ID3DXPMesh インターフェイス (プログレッシブ メッシュをサポートする) と ID3DXSPMesh インターフェイス (単純化メッシュをサポートする) は廃止されました。

メッシュのアーキテクチャ

メッシュには、複雑なモデルのデータが含まれます。メッシュは、テクスチャーやマテリアルなどのリソース、および位置データや隣接データなどの属性を格納する抽象データ コンテナーです。描画パフォーマンスやサーフェスの外観を改善するメッシュ操作はいくつかあります。また、これ以外にも、メッシュ操作の機能に影響するさまざまなメッシュ概念が存在します。これらのメッシュ概念を理解し、メッシュに適用することによって、メッシュのパフォーマンスが向上します。

メッシュ オブジェクト データ

メッシュには、頂点バッファー、インテックス バッファー、属性バッファーが格納されます。

  • 頂点バッファーには、メッシュの頂点である頂点データが格納されます。
  • インデックス バッファーには頂点バッファーにアクセスするための頂点インデックスが格納されます。これによって、重複する頂点を減少させて頂点バッファー サイズを小さくできます。インデックス バッファーを使用するのは、インデックス化されたメッシュのみです。たとえば、メッシュがトライアングル リストで構成されている場合、このメッシュはインデックス バッファーを使用しません。
  • 属性バッファーには属性データが格納されます。属性は、順不同のメッシュ頂点のプロパティです。D3DX メッシュは、面ごとに、DWORDS グループに属性を格納します。

属性テーブル

属性テーブルは、属性バッファーの内容を簡潔に表したものです。属性テーブルは、D3DXMESHOPT_ATTRSORT フラグを設定して Optimize メソッドの 1 つを呼び出し、属性バッファーをロックして、これにデータを入力するか、SetAttributeTable を呼び出すことで作成できます。メッシュがグループに記録されるときに、メッシュに属性テーブルが格納されます。これは、Optimize を呼び出したときに、属性の並べ替えオプション (D3DXMESHOPT_ATTRSORT 以上) が指定されていると見なして実行されます。D3DX メッシュは、インデックス付きトライアングル リストを使用するため、IDirect3DDevice9::DrawIndexedPrimitive で描画されます。

属性テーブルは、Optimize を呼び出すことによって作成されます。Optimize は隣接するように面を並べ替えるため、面が隣接している必要はありません。たとえば、人の手のメッシュでは同じ属性を使うことができます。属性識別子 (ID) は、面をグループとして並べ替えるのに役立ちます。.x ファイルのメッシュの場合は、マテリアルやテクスチャーのプロパティに対して自動的に属性が生成されます。パフォーマンスを向上させるために、Optimize(ATTRSORT) やさらに効果的な Optimize(VERTEXCACHE) を呼び出す必要があります。ロード関数は、保存時と同じ形式でデータを表示しようとします。頂点バッファーまたはインデックス バッファー ベースのメッシュを使用している場合、メッシュ アプリケーション プログラミング インターフェイス (API) によって最適化関数が提供され、オーバーヘッドがほとんどない状態でスキニング トランスフォームを実行できます。

最適化タイプは、段階的に最小の最適化 (D3DXMESHOPT_COMPACT) から最大の最適化 (D3DXMESHOPT_IGNOREVERTS) まであります。D3DXMESHOPT_STRIPREORDER は、圧縮と属性の並べ替えを実行します。D3DXMESHOPT_VERTEXCACHE は、実際に頂点キャッシュを持たないデバイスでも常に推奨されます。

アプリケーション データ

アプリケーション データは、アプリケーションによって管理されるメッシュ データです。メッシュ頂点データとこれらのバッファーで管理されるデータには、密接な関係があります。

マテリアル バッファーは n マテリアルを格納します。マテリアルは、.x ファイルをロードするときに Load 関数によって返されます。各サブセットは、それぞれマテリアルとテクスチャーを持つことができます。マテリアル バッファーは静的です。

隣接性バッファーには、エッジ、面、および隣接する面に関する情報が格納されます。一部のメッシュ操作では、どの面が互いに隣接しているかがわかっている必要があります。この情報は隣接性データと呼ばれ、隣接性バッファーに保持されます。この情報はメッシュの一部ではありませんが、アプリケーションによって保守され、必要に応じてメッシュ メソッドに指定する必要があります。

エフェクト インスタンス バッファーには、エフェクト インスタンスのリストが格納されます。エフェクト インスタンスにはステートが格納されます。このステート情報はパイプラインを初期化するために使用されます。エフェクト インスタンスには、エフェクト内の名前と値のペアが格納されます。

メッシュの高度なトピック

最適化メッシュは、ベース メッシュの機能に基づいて構築されており、2 つのメソッドで頂点キャッシュ最適化機能を追加しています。そのメソッドの 1 つは新規メッシュを作成する Optimize で、もう 1 つは元のメッシュを変更する OptimizeInPlace です。

D3DXGeneratePMesh は、D3DX 単純化アルゴリズムを使って、入力メッシュからプログレッシブ メッシュを生成します。D3DXSimplifyMesh は、同じ単純化アルゴリズムを使って、入力メッシュから指定された詳細レベルの標準メッシュを生成します。ユーザーは、頂点の成分ごとに指定された重みと頂点ごとに指定された重みを使ってエラー メトリックを制御します。成分ごとの重みは、エッジの折りたたみごとに計算されたエラーのその成分部分で乗算されます。頂点ごとの重みは、その頂点の削除に対して指定されたエラー メトリック値で乗算されます。たとえば、頂点を削除したくない場合は、その特定の頂点の重みを大きな値に設定します。逆に、頂点を早く削除したい場合は、重みを小さな値 (1 未満) に設定します。

ID3DXSkinInfo は、スキニングされたキャラクターをサポートします。スキニングされたキャラクターは、メッシュのセットと、メッシュの頂点に影響を与えるボーンのセットによって定義されます。ボーンはトランスフォーム階層として表現されます。メッシュごとに、そのメッシュに影響を与えるすべてのボーンに適用する行列があり、その行列によってメッシュがボーンのローカル座標空間にトランスフォームされます。この行列は、メッシュのボーンのボーン空間トランスフォームです。この行列は、オーサリング プロセスで骨組みをメッシュに関連付けるときに定義されます。

スキニング

スキニングは、ボーンを使ってメッシュ頂点をトランスフォームする手法です。ボーンは、通常、人体の骨と同様に、階層的な骨組みとして配置されます。オブジェクトの頂点は、骨に皮膚を貼り付けるように、ボーンに関連付けられます。ボーンをトランスフォームすると、スキンもトランスフォームされます。

スキニングされたメッシュは、ボーンを使って頂点の数を変更します。ボーンのトランスフォーム データは、ボーンの SRT (スケーリング、回転、平行移動) の方法を変更するために、ユーザーが指定します。メッシュは、トランスフォームされたボーンを使って、ボーンに関連付けられた頂点に変更を加えます。パレットは SRT トランスフォームの配列です。パレットは行列として実装されることもありますが、SRT 値を格納できます。

プログレッシブ メッシュのトリミング

詳細ではない領域では、レンダリングされたサーフェスの表示を変更しない頂点が失われても支障はありません。このことは、特にカメラから遠ざかるオブジェクトについて当てはまります。これは詳細レベル (LOD) と呼ばれます。ユーザーは、LOD を設定してレンダリング効率を最大化するために、API レベルでレンダリングを制御できます。

プログレッシブ メッシュ オブジェクトは、最初は面の数が多く、単純化によって面の数を減少させます。プログレッシブ メッシュがビューに依存しない場合、このメッシュをビューに依存しないプログレッシブ メッシュ (VIPM) と呼びます。

面の数を減少させるもう 1 つの方法がトリミングです。これはメッシュから頂点と面を実際に削除します。トリミングは上限 (面の最大数を制限する) または下限 (面の最小数を制限する) で実行できます。トリミングによって描画のパフォーマンスが向上しますが、表示品質を保持するには注意が必要です。トリミングについては、ソフトウェア開発キット (SDK) の Progressive Mesh サンプルを参照してください。

視認性の高い領域については、プログレッシブ詳細レベル (PLOD) を使って解像度を向上させることができます。これは、1 つの面を 2 つの面に分割するための手法です。

パッチ メッシュ

2 種類の特殊なパッチ メッシュもサポートされています。1 つは矩形パッチ メッシュで、もう 1 つは三角形パッチ メッシュです。矩形パッチ メッシュは、制御ポイントが曲がった矩形シーケンスとしてレイアウトされるパッチ メッシュです。矩形パッチおよび三角形パッチは、高次サーフェスを作成するために使わます。パッチ メッシュは三角形メッシュほど一般的には使われません。