固定函数 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ー 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
};

顶点声明