テセレーション
テセレーション
テセレーション ユニット
テセレーション ユニットが強化された。次のことができるようになった。
- すべての高次プリミティブの適応型テセレーションを実行する。
- ディスプレースメント マップ内の頂点ごとのディスプレースメント値を参照し、頂点シェーダに渡す。
- 矩形パッチ テセレーションをサポートする。これは、D3DDECLMETHOD_PARTIALU または D3DDECLMETHOD_PARTIALV を使った頂点宣言で指定する。これらのメソッドを含む頂点宣言を三角形パッチの描画に使うと、IDirect3DDevice9::DrawTriPatch は失敗する。頂点宣言の詳細については、「D3DVERTEXELEMENT9」を参照すること。
Microsoft® DirectX® 8.x で ORDER と呼ばれていたものは、実際は次数であった。DirectX 9.0 では、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
新しいハードウェア能力:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches