固定函式 FVF 程式碼 (Direct3D 9)

FVF 程式碼描述儲存在單一資料流程中交錯的頂點內容。 它通常會指定要由固定函式頂點處理管線處理的資料。 這是較舊的樣式頂點宣告;若要查看目前的頂點宣告樣式,請參閱 D3DVERTEXELEMENT9

Direct3D 應用程式可以透過數種不同的方式定義模型頂點。 支援彈性頂點定義,也稱為彈性頂點格式或彈性頂點格式代碼,可讓您的應用程式只使用所需的頂點元件,排除未使用的元件。 只要使用所需的頂點元件,您的應用程式就可以節省記憶體,並將轉譯模型所需的處理頻寬降到最低。 您會使用 D3DFVF 代碼的組合來描述頂點的格式。

FVF 規格包含D3DFVF_PSIZE所指定的點大小格式。 此大小是以非轉換和光線 (TL) 頂點的相機空間單位表示,並以 TL 頂點的裝置空間單位表示。

IDirect3DDevice9介面的轉譯方法可為 C++ 應用程式提供接受這些旗標組合的方法,並使用這些方法來判斷如何轉譯基本類型。 基本上,這些旗標會告訴系統哪一個頂點元件 - 位置、頂點混合權數、一般、色彩,以及紋理座標的數目和格式-您的應用程式會使用和間接使用,以及您想要 Direct3D 套用至它們之轉譯管線的哪些部分。 此外,存在或缺少特定頂點格式旗標會與記憶體中存在頂點元件欄位且已省略的系統通訊。

若要判斷裝置限制,您可以在 D3DCAPS9的 FVFCaps 成員中查詢D3DFVFCAPS_DONOTSTRIPELEMENTS和D3DFVFCAPS_TEXCOORDCOUNTMASK的值。

紋理座標可以以不同的格式宣告,允許使用一個座標或四個紋理座標 (處理紋理座標,) 。 如需詳細資訊,請參閱 Direct3D 9 (紋理座標格式) 。 使用 D3DFVF_TEXCOORDSIZEN 組宏來建立位模式,以識別頂點格式所使用的紋理座標格式。

沒有應用程式會使用每個元件。 相互同質 W (RHW) 和頂點一般欄位互斥。 大部分的應用程式也不會嘗試使用所有八組紋理座標,但 Direct3D 具有此容量。 您可以搭配其他旗標使用的旗標有數個限制。 例如,您無法同時使用D3DFVF_XYZ和D3DFVF_XYZRHW旗標,這表示您的應用程式描述頂點的位置與未轉換和轉換的頂點。

若要使用索引頂點混合,D3DFVF_LASTBETA_UBYTE4旗標應該會出現在 FVF 宣告的結尾。 此旗標的存在表示第五個混合權數會被視為 DWORD,而不是 float。 如需詳細資訊,請參閱 索引頂點混合 (Direct3D 9)

下列程式碼範例顯示使用 D3DFVF_LASTBETA_UBYTE4 旗標的 FVF 程式碼與不使用的 FVF 程式碼之間的差異。 使用四個混合索引時,旗標D3DFVF_XYZB3存在,因為您一律會從第一個數位減去前三個的總和,以取得第四個 (混合₄ = 1 - (blend₁ + blendー₃) ) 。

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

以下定義的 FVF 會使用 D3DFVF_LAST_UBYTE4 旗標。

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    DWORD       indices; // Referenced as v2.xyzw in the vertex shader 
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

頂點宣告