Geometry Blending (Direct3D 9)

Direct3D 可讓應用程式藉由轉譯分段多邊形物件,特別是具有順暢混合結合的字元,來增加其場景的實境。 這些效果通常稱為面板。 系統會將其他世界轉換矩陣套用至單一頂點集合來建立多個結果,然後在結果頂點之間執行線性混合,以建立單一的幾何集合來呈現,以達到此效果。 下圖顯示此程式。

將兩個物件與根紋理混合的程式圖例

上圖顯示您可能會想像幾何混合程式的方式。 在單一轉譯呼叫中,系統會取得根的頂點、轉換兩次 -一次而不修改,一次具有簡單的旋轉,然後混合結果以建立彎曲的水果。 系統會在啟用光源時混合頂點位置,以及頂點常態。 應用程式不限於兩個混合路徑;Direct3D 可以在多達四個世界矩陣之間混合幾何,包括標準世界矩陣, D3DTS_WORLD

注意

啟用光源時,頂點常態會由對應的反向世界檢視矩陣進行轉換,並以與頂點位置計算相同的方式加權。 如果D3DRS_NORMALIZENORMALS轉譯狀態設定為 TRUE,系統會正規化產生的一般向量。

 

在沒有幾何混合的情況下,動態表達模型通常會在區段中轉譯。 例如,請考慮人類手部的 3D 模型。 在最簡單的檢視中,arm 有兩個部分:連接到主體的上部,以及連接到手部的下半部。 兩者會連接在橢圓形上,而下方的 Arm 會在該點旋轉。 轉譯 arm 的應用程式可能會保留上部和下半部的頂點資料,每個都有不同的世界轉換矩陣。 下列程式碼範例會說明這點。

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

若要轉譯 arm,會進行兩個轉譯呼叫,如下列程式碼所示。

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

下圖是經過修改以使用這項技術的根。

混合的水果圖例,不含幾何混合

混合幾何與非blended 幾何之間的差異很明顯。 此範例有點極端。 在真實世界應用程式中,分段模型的聯結是設計來讓接合不明顯。 不過,有時可以看到接合,這會顯示模型設計工具的常數挑戰。

Direct3D 中的幾何混合提供傳統分段模型化案例的替代方案。 不過,改善分段物件的視覺品質會以轉譯期間混合計算的成本來計算。 為了將這些額外作業的影響降到最低,Direct3D 幾何管線會優化為混合幾何,並降低可能的額外負荷。 以智慧方式使用 Direct3D 所提供的幾何混合服務的應用程式可以改善其字元的實境,同時避免嚴重的效能反應。

混合轉換和轉譯狀態

IDirect3DDevice9::SetTransform方法可辨識D3DTS_WORLDD3DTS_WORLDn宏,其對應至D3DTS_WORLDMATRIX宏可定義的值。 這些宏可用來識別要混合幾何之間的矩陣。

D3DRENDERSTATETYPE列舉型別包含D3DRS_VERTEXBLEND轉譯狀態,以啟用和控制幾何混合。 這個轉譯狀態的有效值是由 D3DVERTEXBLENDFLAGS 列舉型別所定義。 如果已啟用幾何混合,頂點格式必須包含適當的混合權數。

混合權數

混合權數有時稱為 Beta 權數,可控制指定世界矩陣影響頂點的範圍。 混合權數是介於 0.0 到 1.0 之間的浮點值,以頂點格式編碼,其中值為 0.0 表示頂點不會與該矩陣混合,而 1.0 表示頂點會受到矩陣的完整影響。

幾何混合權數會以頂點格式編碼,出現在每個頂點的位置之後,如 固定函式 FVF 程式碼 (Direct3D 9 中所述) 。 您可以在頂點描述中包含您提供給轉譯方法的其中一個 FVF 常數 ,以頂點格式傳達混合權數的數目。

系統會在混合矩陣的加權結果之間執行線性混合。 下列方程式是完整的混合公式。

使用世界轉換矩陣進行線性混合的方程式

在上述方程式中,vBlend 是輸出頂點,v 元素是套用世界矩陣所產生的頂點, (D3DTS_WORLDn) 。 W 元素是頂點格式內的對應加權值。 在 n 矩陣之間混合的頂點可以有 - 1 個混合加權值,每個混合矩陣各有一個,但最後一個除外。 系統會自動產生最後一個世界矩陣的權數,讓擁有權數的總和是 1.0,以此處的 sigma 標記法表示。 Direct3D 支援的每個案例都可以簡化此公式,如下列方程式所示。

三個混合案例的線性混合方程式

這些是兩個、三個和四個混合矩陣案例的完整混合公式的簡化形式。

注意

雖然 Direct3D 包含 FVF 描述元來定義最多包含五個混合權數的頂點,但在此版本的 DirectX 中只能使用三個。

 

下列主題包含其他資訊。

頂點管線