テッセレーション (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 パッチの場合、三角形の頂点が使用されます。
ベジエベースの四角形と三角形のパッチには、コーナーコントロールの頂点が使用されます。
頂点ごとのテッセレーション レート コントロール。 アプリケーションは必要に応じて、頂点ごとに 1 つの正の浮動小数点値を指定できます。これを使用して、テッセレーションのレートを制御できます。 これは、使用インデックスが 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
関連トピック
-
頂点パイプライン の