Higher-Order プリミティブの使用 (Direct3D 9)

このセクションでは、アプリケーションで上位のプリミティブを使用する方法について説明します。

プリミティブ サポートHigher-Order決定する

D3DCAPS9 構造体の DevCaps メンバーに対してクエリを実行して、上位のプリミティブを含む操作のサポート レベルを決定できます。 次の表に、Direct3D 9 の上位プリミティブに関連するデバイス機能を示します。

デバイス機能 説明
D3DDEVCAPS_NPATCHES デバイスは N パッチをサポートし、 曲線 PN 三角形 (特殊な種類の立方ベジエ三角形) に基づいています。
D3DDEVCAPS_QUINTICRTPATCHES デバイスでは、クインティック ベジエ曲線と B スプラインがサポートされています。
D3DDEVCAPS_RTPATCHES デバイスでは、四角形と三角形のパッチ (RT パッチ) がサポートされています。
D3DDEVCAPS_RTPATCHHANDLEZERO RT パッチは、ハンドル 0 を使用して効率的に描画される場合があります。

 

D3DDEVCAPS_RTPATCHHANDLEZEROは、ハンドルが 0 のパッチを描画できることを意味するわけではないことに注意してください。 このデバイス機能が設定されているかどうかに関係なく、ハンドルゼロパッチは常に描画できます。 この機能を設定すると、ハードウェア アーキテクチャは情報のキャッシュを必要とせず、キャッシュされていないパッチ (ハンドルゼロ) をキャッシュされたパッチと同じくらい効率的に描画します。

パッチの描画

Direct3D 9 では、2 種類の上位プリミティブまたはパッチがサポートされています。 これらは N パッチおよび Rect/Tri パッチと呼ばれます。 N パッチは、NSegments 値が 1.0 より大きい IDirect3DDevice9::SetNPatchMode( nSegments ) の呼び出しを通じて N パッチを有効にすることで、任意の三角形レンダリング呼び出しを使用してレンダリングできます。 Rect/Tri パッチは、次の明示的なエントリ ポイントを使用してレンダリングする必要があります。

パッチを描画するには、次の方法を使用します。

IDirect3DDevice9::D rawRectPatch は、現在設定されているストリームを使用して pRectPatchInfo パラメーターで指定された長方形の高次パッチを描画します。 Handle パラメーターは、パッチをハンドルに関連付けるために使用されるため、次回パッチを描画する際に pRectPatchInfo を再指定する必要はありません。 これにより、前方差分係数またはその他の情報を事前計算してキャッシュすることができます。これにより、同じハンドルを使用して IDirect3DDevice9::D rawRectPatch を呼び出して効率的に実行できるようになります。

静的パッチの場合、アプリケーションは頂点シェーダーと適切なストリームを設定し、pRectPatchInfo パラメーターにパッチ情報を指定し、Direct3D が情報をキャプチャしてキャッシュできるようにハンドルを指定することを目的としています。 その後、アプリケーションは pRectPatchInfo を NULL に設定して IDirect3DDevice9::D rawRectPatch を呼び出して、パッチを効率的に描画できます。 キャッシュされたパッチを描画する場合、現在設定されているストリームは無視されます。 ただし、pNumSegs に新しい値を指定することで、キャッシュされた pNumSegs をオーバーライドできます。 また、キャプチャ時に設定されたのと同じ頂点シェーダーを、キャッシュされたパッチをレンダリングするときに設定する必要があります。

動的パッチの場合、パッチ データはパッチのレンダリングごとに変更されるため、情報をキャッシュするのは効率的ではありません。 アプリケーションは、Handle を 0 に設定することで、Direct3D にこれを伝えることができます。 この場合、Direct3D は現在設定されているストリームと pNumSegs 値を使用してパッチを描画し、情報をキャッシュしません。 同時に Handle を 0 に設定し、pPatch を NULL に設定することはできません。

同じハンドルに pRectPatchInfo を再指定することで、アプリケーションは以前にキャッシュされた情報を上書きできます。

IDirect3DDevice9::D rawTriPatch は、三角形の高次パッチを描画する点を除き、 IDirect3DDevice9::D rawRectPatch に似ています。

法線とテクスチャ座標の生成

フレキシブル頂点形式 (FVF) シェーダーを使用している場合、法線とテクスチャ座標を自動生成することはできません。

法線の場合は、直接指定することも、Direct3D で計算することもできます。

次の図に示すように、四角形のパッチに対して生成される座標はスプラインベースの座標です。

元のテクスチャとスプラインベースの座標を持つテクスチャの図

三角形パッチに対して生成される座標は、次の図に示すように、バリセントリック スプラインベースの座標です。

バリセントリック スプラインベースの座標を持つ元のテクスチャとテクスチャの図

アプリケーションで生成されたテクスチャ座標の範囲を変更する必要がある場合は、テクスチャ変換を使用してこれを行うことができます。

上位のプリミティブ