高次プリミティブの使い方 (Direct3D 9)
ここでは、アプリケーションで高次プリミティブを使う方法について説明します。
- 高次プリミティブ サポートの確認
- パッチの描画
- 法線およびテクスチャー座標の生成
高次プリミティブ サポートの確認
D3DCAPS9 構造体の DevCaps メンバーを照会して、高次プリミティブに関する処理のサポート レベルを確認できます。次の表は、Direct3D 9 での高次プリミティブに関連するデバイスの機能を示しています。
デバイスの機能 | 説明 |
---|---|
D3DDEVCAPS_NPATCHES | デバイスは N パッチをサポートしていて、Curved PN Trianglesに基づきます。 |
D3DDEVCAPS_QUINTICRTPATCHES | デバイスは、5 次ベジエ曲線および B スプラインをサポートしています。 |
D3DDEVCAPS_RTPATCHES | デバイスは、矩形およびトライアングル パッチをサポートしています (RT パッチ)。 |
D3DDEVCAPS_RTPATCHHANDLEZERO | RT パッチは、ハンドル 0 を使うと効率的に描画できます。 |
D3DDEVCAPS_RTPATCHHANDLEZERO が設定されていても、ハンドル 0 のパッチを描画できるわけではありません。ハンドル 0 のパッチは、このデバイスの機能が設定されているかどうかに関係なく常に描画できます。このデバイスの機能が設定されている場合、ハードウェア アーキテクチャで情報をキャッシュする必要がありません。キャッシュされていないパッチ (ハンドル 0) でも、キャッシュされた場合と同じように効率的に描画されます。
パッチの描画
Direct3D 9 では、2 種類の高次プリミティブ、つまりパッチがサポートされています。これらは N パッチと Rect/Tri パッチと呼ばれます。N パッチは、nSegments に 1.0 より大きな値を使って IDirect3DDevice9::SetNPatchMode ( nSegments ) を呼び出すことで N パッチを有効にする、三角形レンダリング呼び出しを使ってレンダリングできます。Rect/Tri パッチは、次の明示的なエントリ ポイントを使ってレンダリングする必要があります。
パッチを描画するには、次の方法があります。
- IDirect3DDevice9::DrawRectPatch。頂点バッファーでこのパッチ データを参照する方法の詳細については、「D3DRECTPATCH_INFO」を参照してください。
- IDirect3DDevice9::DrawTriPatch。頂点バッファーでこのパッチ データを参照する方法の詳細については、「D3DTRIPATCH_INFO」を参照してください。
IDirect3DDevice9::DrawRectPatch は、現在設定されているストリームを使って、pRectPatchInfo パラメーターで指定された矩形高次パッチを描画します。Handle パラメーターは、パッチとハンドルを関連付けるために使われます。このため、次にパッチが描画される際は、pRectPatchInfo を指定し直す必要がありません。これにより、順方向差異係数またはその他の情報を事前に計算してキャッシュすることができ、その結果、同じハンドルを使ったその後の IDirect3DDevice9::DrawRectPatch への呼び出しが効率的に実行されます。
静的パッチについては、アプリケーションが頂点シェーダーと適切なストリームを設定し、pRectPatchInfo パラメーター内にパッチ情報を提供し、ハンドルを指定することで、Direct3D が情報を取得しキャッシュできるようにされています。アプリケーションはその後 pRectPatchInfo が NULL に設定された状態で IDirect3DDevice9::DrawRectPatch を呼び出すことにより、パッチを効率的に描画できます。キャッシュされているパッチを描画するときは、現在設定されているストリームは無視されます。ただし、pNumSegs に新しい値を設定することで、キャッシュされた pNumSegs を上書きすることもできます。また、キャッシュされたパッチをレンダリングする場合は、そのパッチがキャプチャーされたときと同じ頂点シェーダーを設定する必要があります。
動的パッチについては、パッチのレンダリングごとにパッチ データが変化するため、情報をキャッシュすることは効率的ではありません。アプリケーションは、Handle を 0 に設定することで、この情報を Direct3D に伝えることができます。この場合、Direct3D は、現在設定されているストリームおよび pNumSegs 値を使ってパッチを描画し、情報のキャッシュを行いません。Handle を 0 に設定した状態で pPatch を NULL に設定すると無効になります。
同じハンドルに pRectPatchInfo を指定し直すことで、アプリケーションは前回キャッシュした情報を上書きできます。
IDirect3DDevice9::DrawTriPatch は IDirect3DDevice9::DrawRectPatch に似ているが、三角形高次パッチを描画する点が異なります。
法線およびテクスチャー座標の生成
柔軟な頂点フォーマット (FVF) シェーダーを使っている場合、法線およびテクスチャー座標を自動生成することはできません。
法線は、直接指定するか、Direct3D に計算させます。
矩形パッチ用に生成される座標は、次の図に示すようなスプライン ベースの座標です。
三角形パッチ用に生成される座標は、次の図に示すようなスプライン ベースの重心座標です。
アプリケーションでは、生成されたテクスチャー座標の範囲を変更する必要がある場合は、テクスチャー トランスフォームを使ってこれを行います。