テッセレーション (Direct3D 9)

テッセレーター ユニット

テッセレーター ユニットが強化され、次のことができるようになりました。

  • すべての高次プリミティブの適応型テッセレーションを実行する。
  • ディスプレースメント マップ内の頂点ごとのディスプレースメント値を参照し、頂点シェーダーに渡す。
  • 矩形パッチ テッセレーションをサポートする。これは、D3DDECLMETHOD_PARTIALU または D3DDECLMETHOD_PARTIALV を使った頂点宣言で指定します。これらのメソッドを含む頂点宣言を三角形パッチの描画に使うと、IDirect3DDevice9::DrawTriPatch は失敗します。頂点宣言の詳細については、「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 を使ってこの機能を有効にすると、視点空間内の制御頂点の深度の値に基づいて、パッチが適応的にテッセレーションされます。

制御頂点 (Vi) の Z 座標 (Zi) は、4 つのベクトルの内積を計算することによって視点空間 (Zieye) にトランスフォームされます。この制御頂点の Z 座標を深度の値として使用します。アプリケーションは、4 つのレンダリング ステート (D3DRS_ADAPTIVETESS_X、D3DRS_ADAPTIVETESS_Y、D3DRS_ADAPTIVETESS_Z、D3DRS_ADAPTIVETESS_W) を使って 4D ベクトル (Mdm) を指定します。この 4D ベクトルには、連結されたワールド行列およびビュー行列の第 3 列などを指定できます。また、このベクトルを使って Zieye にスケールを適用することもできます。

Zieye からテッセレーション レベル Ti を計算する関数は (MaxTessellationLevel/Zieye) であると仮定します。これは、視点空間の Z = 1 では MaxTessellationLevel とテッセレーション レベルが等しいことを意味します。N パッチの場合、MaxTessellationLevel は、IDirect3DDevice9::SetNPatchMode によって設定された値と等しくなります。RT パッチの場合は、pNumSegs に等しくなります。このテッセレーション レベルは、クランプする最大および最小のテッセレーション レベルを定義する D3DRS_MINTESSELLATIONLEVEL および D3DRS_MAXTESSELLATIONLEVEL によって定義された値にクランプされます。パッチのエッジに沿った各頂点の Ti の平均がそのエッジのテッセレーション レベルとなります。矩形パッチ、三角形パッチ、および N パッチの Ti を計算するアルゴリズムは、テッセレーション レベルの計算に使う制御頂点が異なります。

B スプライン基本タイプの矩形パッチの場合は、最も外側の 4 つの制御頂点を使用します。たとえば、D3DORDER_CUBIC オーダー タイプの場合、pNumSegs[0] には頂点 (1,1) および (1,width-2) を使用し、pNumSegs[1] には頂点 (1,width-2) および (height-2,height-2) を使用します。また、pNumSegs[2] には頂点 (height-2,width-2) および (1,width-2) を使用し、pNumSegs[3] には頂点 (2,1) および (1,1) を使用します。

三角形パッチの場合は、角のパッチ頂点を使用します。D3DORDER_CUBIC オーダー タイプの場合、pNumSegs[0] には頂点 (0) および (9) を使用し、pNumSegs[1] には頂点 (9) および (6) を使用し、pNumSegs[3] には頂点 (6) および (0) を使用します。

N パッチの場合は、三角形頂点を使用します。

ベジェ基本タイプの矩形パッチおよび三角形パッチの場合は、角の制御頂点を使用します。

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

算術演算

エッジ 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 

新しいハードウェア CAP:

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