Tessellation (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;
度類型的變更會影響其他兩個結構。
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) 。 4D 向量 (Mdm) 是由應用程式使用四個轉譯狀態 (D3DRS_ADAPTIVETESS_X、D3DRS_ADAPTIVETESS_Y、D3DRS_ADAPTIVETESS_Z和D3DRS_ADAPTIVETESS_W) 來指定。 這個 4 向量可以是串連世界的第三個數據行,並檢視矩陣。 它也可以用來將縮放比例套用至 Zieye。
計算 Zieye 中鑲嵌層級 Ti 的函式假設為 (MaxTessellationLevel/Zieye) ,這表示 MaxTessellationLevel 是 Z = 1 的眼球空間鑲嵌層級。 MaxTessellationLevel 等於 IDirect3DDevice9::SetNPatchMode 針對 N 修補程式所設定的值,而 RT 修補程式則等於 pNumSegs。 接著,鑲嵌層級會限制為值,由兩個額外的轉譯狀態D3DRS_MINTESSELLATIONLEVEL和D3DRS_MAXTESSELLATIONLEVEL所定義,定義要限制的最小和最大鑲嵌層級。 每個頂點的 Ti 沿著修補程式邊緣的頂點都是平均的,以取得該邊緣的鑲嵌層級。 計算 Ti 的矩形修補程式、三角形修補程式和 N 修補程式的演算法在用來計算鑲嵌層級的控制頂點有所不同。
針對具有 B 曲線基礎的矩形修補程式,會使用四個最外層控制項頂點。 例如,使用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 修補程式,會使用三角形頂點。
針對具有 Bezier 基礎的矩形和三角形修補程式,會使用邊角控制頂點。
每個頂點鑲嵌速率控制。 應用程式可以選擇為每個頂點提供單一正浮點值,可用來控制鑲嵌率。 這會使用 D3DDECLUSAGE_TESSFACTOR來提供,其使用索引必須為 0,且輸入類型必須D3DDECLTYPE_FLOAT1。 這會乘以每個頂點鑲嵌層級。
數學
tessellation level (Te) for an edge e, represented by two control vertices (Ve1, Ve2) , is computed as shown:
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-patchs、 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
相關主題