共用方式為


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 

頂點管線