テセレーション (Direct3D 9)

テセレータユニット

テセレータユニットが強化されました。 これで、これを使用して次のことができます。

  • 上位のすべてのプリミティブのアダプティブ テセレーションを実行します。
  • ディスプレイスメント マップから頂点ごとのディスプレイスメント値を検索し、頂点シェーダーに渡します。
  • 四角形パッチテセレーションをサポートします。 これは、D3DDECLMETHOD_PARTIALUまたはD3DDECLMETHOD_PARTIALVを使用して頂点宣言によって指定されます。 これらのメソッドを含む頂点宣言を使用して三角形パッチを描画すると、 IDirect3DDevice9::D rawTriPatch は失敗します。 頂点宣言の詳細については、「 D3DVERTEXELEMENT9」を参照してください。

DirectX 8.x では、ORDER と呼ばれるものは実際には次数でした。 Direct3D 9 では、 D3DDEGREETYPE で次数が指定されるようになりました。

 // This used to be D3DORDERTYPE and D3DORDER* 
 typedef enum _D3DDEGREETYPE 
 { 
 D3DDEGREE_LINEAR = 1, 
 D3DDEGREE_QUADRATIC = 2, 
 D3DDEGREE_CUBIC = 3, 
 D3DDEGREE_QUINTIC = 5, 
 D3DDEGREE_FORCE_DWORD = 0x7fffffff, 
 } D3DDEGREETYPE; 

度の種類の変化は、他の 2 つの構造体に影響を与えました。

typedef struct _D3DRECTPATCH_INFO 
 { 
 UINT StartVertexOffsetWidth; 
 UINT StartVertexOffsetHeight; 
 UINT Width; 
 UINT Height; 
 UINT Stride; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DRECTPATCH_INFO; 
 typedef struct _D3DTRIPATCH_INFO 
 { 
 UINT StartVertexOffset; 
 UINT NumVertices; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DTRIPATCH_INFO; 

ドライバーは、新しいヘッダーでコンパイルするときに、この変更によって発生するコンパイル エラーを修正する必要があります。 機能を変更する必要はありません。

アダプティブ テセレーション

アダプティブ テセレーションは、N パッチ、四角形パッチ、三角形パッチなどの高次プリミティブに適用できます。 この機能は、D3DRS_ENABLEADAPTIVETESSELLATIONによって有効になり、視線空間内のコントロール頂点の深度値に基づいてパッチをアダプティブテセレーションします。

4 ベクトルを持つドット積を実行して視線空間 (Zieye) に変換されるコントロール頂点 (Vi) の z 座標 (Zi) が深度値として使用されます。 4D ベクター (Mdm) は、4 つのレンダリング状態 (D3DRS_ADAPTIVETESS_X、D3DRS_ADAPTIVETESS_Y、D3DRS_ADAPTIVETESS_Z、D3DRS_ADAPTIVETESS_W) を使用してアプリケーションによって指定されます。 この4ベクトルは、連結されたワールドおよびビュー行列の3番目の列である可能性があります。 また、Zieye にスケールを適用するためにも使用できます。

Zieye からテセレーション レベル Ti を計算する関数は (MaxTessellationLevel/Zieye) と見なされます。これは、MaxTessellationLevel が目の空間の Z = 1 のテセレーション レベルであることを意味します。 MaxTessellationLevel は、N パッチの 場合は IDirect3DDevice9::SetNPatchMode によって設定された値と等しく、RT パッチの場合は pNumSegs と等しくなります。 次に、テセレーション レベルは値にクランプされ、クランプ先の最小テセレーション レベルと最大テセレーション レベルを定義する、D3DRS_MINTESSELLATIONLEVELとD3DRS_MAXTESSELLATIONLEVELの 2 つの追加のレンダリング状態によって定義されます。 パッチのエッジに沿った各頂点の Ti は、そのエッジのテセレーション レベルを取得するために平均化されます。 四角形のパッチ、三角形のパッチ、および N パッチの Ti を計算するためのアルゴリズムは、テセレーション レベルの計算に使用されるコントロール頂点によって異なります。

B スプラインベースの四角形パッチでは、最も外側の 4 つのコントロール頂点が使用されます。 たとえば、D3DORDER_CUBIC次数では、頂点 (1,1) と (1,width-2) が pNumSegs[0]と共に使用されます。 頂点 (1,width-2) と (height-2,height-2) は pNumSegs[1]、頂点 (height-2,width-2) と (1,width-2) は pNumSegs[2] で使用され、頂点 (2,1) と (1,1) は pNumSegs[3] で使用されます。

三角形パッチの場合は、コーナー パッチの頂点が使用されます。 D3DORDER_CUBIC順序: 頂点 (0) と (9) は pNumSegs[0] で使用され、頂点 (9) と (6) は pNumSegs[1] で使用され、頂点 (6) と (0) は pNumSegs[3] と共に使用されます。

N パッチの場合、三角形の頂点が使用されます。

ベジェベースの四角形と三角形のパッチには、コーナーコントロールの頂点が使用されます。

頂点ごとのテセレーション レート コントロール。 アプリケーションは必要に応じて、頂点ごとに単一の正の浮動小数点値を指定できます。これは、テセレーションのレートを制御するために使用できます。 これは、使用インデックスが 0 で入力の種類がD3DDECLTYPE_FLOAT1必要なD3DDECLUSAGE_TESSFACTORを使用して提供されます。 これは頂点ごとのテセレーション レベルに乗算されます。

数値演算

エッジ e のテセレーション レベル (Te) は、次に示すように 2 つのコントロール頂点 (Ve1、Ve2) で表されます。

Vertex Vi: (Xi, Yi, Zi, TFactori (optional)). 
Ze1eye = Ve1 . Mdm 
Ze2eye = Ve2 . Mdm 
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye 
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye 
Te = ( Te1 + Te2 ) / 2; 
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL 
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL 

D3DRS_ENABLEADAPTIVETESSELLATIONが TRUE の場合、三角形プリミティブ (三角形リスト、ファン、ストリップ) が N パッチとして描画され、 IDirect3DDevice9::SetNPatchMode の値が 1.0 未満に設定されます。

API の変更

新しいレンダリング状態:

 D3DRS_ENABLEADAPTIVETESSELLATION // BOOL 
 D3DRS_MAXTESSELLATIONLEVEL       // Float 
 D3DRS_MINTESSELLATIONLEVEL       // Float 
 D3DRS_ADAPTIVETESS_X             // Float 
 D3DRS_ADAPTIVETESS_Y             // Float 
 D3DRS_ADAPTIVETESS_Z             // Float 
 D3DRS_ADAPTIVETESS_W             // Float 
 
 // D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL 
 // cannot be less than 1 

その既定値は次のとおりです。

D3DRS_MAXTESSELLATIONLEVEL = 1.0f 
D3DRS_MINTESSELLATIONLEVEL = 1.0f 
D3DRS_ADAPTIVETESS_X = 0.0f 
D3DRS_ADAPTIVETESS_Y = 0.0f 
D3DRS_ADAPTIVETESS_Z = 1.0f 
D3DRS_ADAPTIVETESS_W = 0.0f 
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE 

新しいハードウェアキャップ:

D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches 
D3DDEVCAPS2_ADAPTIVETESSNPATCH  // Can adaptively tessellate N-patches 

頂点パイプライン