共用方式為


固定函式 FVF 代碼 (Direct3D 9)

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

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

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

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

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

紋理座標可以用不同的格式宣告,允許使用一個座標或多達四個紋理座標來尋址紋理(針對 2D 投影紋理座標)。 如需詳細資訊,請參閱 紋理座標格式 (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,因為您一律從第一個數字減去前三個的總和,以取得第四個 (blend₄ = 1 - (blend₁ + 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
};

頂點宣告