Códigos FVF de función fija (Direct3D 9)

Un código FVF describe el contenido de los vértices almacenados intercalados en un único flujo de datos. Por lo general, especifica los datos que va a procesar la canalización de procesamiento de vértices de función fija. Se trata de una declaración de vértice de estilo anterior; para ver el estilo de declaración de vértice actual, vea D3DVERTEXELEMENT9.

Las aplicaciones de Direct3D pueden definir vértices de modelo de varias maneras diferentes. La compatibilidad con definiciones de vértices flexibles, también conocidas como formatos de vértices flexibles o códigos de formato de vértices flexibles, permite que la aplicación use solo los componentes de vértice que necesita, lo que elimina los componentes que no se usan. Al usar solo los componentes de vértice necesarios, la aplicación puede ahorrar memoria y minimizar el ancho de banda de procesamiento necesario para representar los modelos. Describe cómo se da formato a los vértices mediante una combinación de códigos D3DFVF .

La especificación FVF incluye formatos para el tamaño de punto, especificados por D3DFVF_PSIZE. Este tamaño se expresa en unidades de espacio de cámara para vértices no transformados y iluminados (TL), y en unidades de espacio de dispositivo para vértices TL.

Los métodos de representación de la interfaz IDirect3DDevice9 proporcionan aplicaciones de C++ con métodos que aceptan una combinación de estas marcas y los usan para determinar cómo representar primitivos. Básicamente, estas marcas indican al sistema qué componentes de vértice ( posición, grosores de mezcla de vértices, normales, colores y el número y formato de las coordenadas de textura): la aplicación usa y, indirectamente, qué partes de la canalización de representación desea que Direct3D se apliquen a ellos. Además, la presencia o ausencia de una marca de formato de vértice determinada se comunica con el sistema en el que los campos de componente de vértice están presentes en la memoria y que se han omitido.

Para determinar las limitaciones del dispositivo, puede consultar un dispositivo para conocer los valores de D3DFVFCAPS_DONOTSTRIPELEMENTS y D3DFVFCAPS_TEXCOORDCOUNTMASK en el miembro FVFCaps de D3DCAPS9.

Las coordenadas de textura se pueden declarar en diferentes formatos, lo que permite que las texturas se aborden con tan solo una coordenada o hasta cuatro coordenadas de textura (para coordenadas de textura proyectadas en 2D). Para obtener más información, vea Formatos de coordenadas de textura (Direct3D 9). Use el conjunto D3DFVF_TEXCOORDSIZEN de macros para crear patrones de bits que identifiquen los formatos de coordenadas de textura que usa el formato de vértice.

Ninguna aplicación usará todos los componentes. Los campos normales de vértice y W (RHW) recíprocamente homogéneos son mutuamente excluyentes. Tampoco la mayoría de las aplicaciones intentarán usar los ocho conjuntos de coordenadas de textura, pero Direct3D tiene esta capacidad. Hay varias restricciones en las que se pueden usar las marcas con otras marcas. Por ejemplo, no puede usar las marcas D3DFVF_XYZ y D3DFVF_XYZRHW juntas, ya que esto indicaría que la aplicación describe la posición de un vértice con vértices no transformados y transformados.

Para usar la combinación de vértices indexados, la marca D3DFVF_LASTBETA_UBYTE4 debe aparecer al final de la declaración FVF. La presencia de esta marca indica que el quinto peso de mezcla se tratará como DWORD en lugar de float. Para obtener más información, vea Indexed Vertex Blending (Direct3D 9) (Mezcla de vértices indexados [Direct3D 9]).

En los ejemplos de código siguientes se muestra la diferencia entre un código de FVF que usa la marca D3DFVF_LASTBETA_UBYTE4 y otra que no lo hace. La marca D3DFVF_XYZB3 está presente cuando se usan cuatro índices de mezcla porque siempre se resta la suma de los tres primeros del número uno para obtener el cuarto (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
};

El FVF definido a continuación usa la marca 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
};

Declaración de vértices