固定函数 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 而不是浮点数。 有关详细信息,请参阅 索引顶点混合 (Direct3D 9)

以下代码示例演示使用 D3DFVF_LASTBETA_UBYTE4 标志的 FVF 代码与不使用标志的 FVF 代码之间的差异。 使用四个混合索引时,标志D3DFVF_XYZB3存在,因为始终从数字一中减去前三个索引的总和,以获取第四个 (blend₄ = 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
};

顶点声明