Microsoft DirectX 8.0 (C++) |
Microsoft® DirectX® 8.0 では、2 種類の高次プリミティブ、つまりパッチがサポートされている。これらは N パッチおよび Rect/Tri パッチと呼ばれる。N パッチは、D3DRS_PATCHSEGMENTS に 1.0 より大きな値を設定することで、三角形レンダリング呼び出しを使ってレンダリングできる。Rect/Tri パッチは、次の明示的なエントリ ポイントを使ってレンダリングする必要がある。
次のメソッドを使って、Microsoft Direct3D® for DirectX でパッチを描画できる。
DrawRectPatch は、現在設定されているストリームを使って、pRectPatchInfo パラメータで指定された四角形高次パッチを描画する。Handle パラメータは、パッチとハンドルを関連付けるために使用される。このため、次にパッチが描画される際は、pRectPatchInfo を指定し直す必要がない。これにより、順方向差異係数またはその他の情報を事前に計算してキャッシュすることができ、その結果、同じハンドルを使ったその後の DrawRectPatch への呼び出しが効率的に実行される。
静的パッチについては、アプリケーションが頂点シェーダと適切なストリームを設定し、pRectPatchInfo パラメータ内にパッチ情報を提供し、ハンドルを指定することで、Direct3D が情報をキャプチャしキャッシュできるようにされている。アプリケーションはその後 pRectPatchInfo が NULL に設定された状態で DrawRectPatch を呼び出すことにより、パッチを効率的に描画できる。キャッシュされたパッチを描画するときは、現在設定されているストリームは無視される。ただし、pNumSegs に新しい値を設定することで、キャッシュされた pNumSegs を上書きすることもできる。また、キャッシュされたパッチをレンダリングする場合は、そのパッチがキャッシュされたときと同じ頂点シェーダを設定する必要がある。
動的パッチについては、パッチのレンダリングごとにパッチ データが変化するため、情報をキャッシュすることは効率的ではない。アプリケーションは、Handle を 0 に設定することで、この情報を Direct3D に伝えることができる。この場合、Direct3D は、現在設定されているストリームおよび pNumSegs 値を使ってパッチを描画し、情報のキャッシュを行わない。Handle を 0 に設定した状態で pPatch を NULL に設定すると無効になる。
同じハンドルに pRectPatchInfo を指定し直すことで、アプリケーションは前回キャッシュした情報を上書きすることができる。
pNumSegs が NULL に設定されている場合は、テッセレータは D3DRS_PATCHSEGMENTS を使ってテッセレーションの量を制御する。この場合は、当然、すべての辺に同じテッセレーションが使用される。N パッチには特別なメソッドはない。テッセレーションは、D3DRS_PATCHSEGMENTS によって制御される。法線を指定する必要がある。
DrawTriPatch は DrawRectPatch に似ているが、三角形高次パッチを描画する点が異なる。