鑲嵌 (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 計算鑲嵌層級 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。 這會乘以每個頂點鑲嵌層級。
數學
邊緣 e 的鑲嵌層級 (Te)是以兩個控制頂點表示的鑲嵌層級 (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
相關主題