Compartilhar via


Códigos FVF de função fixa (Direct3D 9)

Um código FVF descreve o conteúdo de vértices armazenados intercalados em um único fluxo de dados. Ele geralmente especifica os dados a serem processados pelo pipeline de processamento de vértice de função fixa. Esta é uma declaração de vértice de estilo mais antigo; para ver o estilo de declaração de vértice atual, consulte D3DVERTEXELEMENT9.

Os aplicativos Direct3D podem definir vértices de modelo de várias maneiras diferentes. O suporte para definições de vértice flexíveis, também conhecidas como formatos de vértice flexíveis ou códigos de formato de vértice flexíveis, possibilita que seu aplicativo use apenas os componentes de vértice necessários, eliminando os componentes que não são usados. Usando apenas os componentes de vértice necessários, seu aplicativo pode conservar a memória e minimizar a largura de banda de processamento necessária para renderizar modelos. Você descreve como os vértices são formatados usando uma combinação de códigos D3DFVF .

A especificação FVF inclui formatos para o tamanho do ponto, especificados por D3DFVF_PSIZE. Esse tamanho é expresso em unidades de espaço da câmera para vértices não transformados e acesos (TL) e em unidades de espaço do dispositivo para vértices TL.

Os métodos de renderização da interface IDirect3DDevice9 fornecem aos aplicativos C++ métodos que aceitam uma combinação desses sinalizadores e os usam para determinar como renderizar primitivos. Basicamente, esses sinalizadores informam ao sistema quais componentes de vértice - posição, pesos de mesclagem de vértice, normais, cores e o número e o formato das coordenadas de textura - seu aplicativo usa e, indiretamente, quais partes do pipeline de renderização você deseja que o Direct3D aplique a eles. Além disso, a presença ou ausência de um sinalizador de formato de vértice específico comunica ao sistema quais campos de componente de vértice estão presentes na memória e que você omitiu.

Para determinar as limitações do dispositivo, você pode consultar um dispositivo quanto aos valores de D3DFVFCAPS_DONOTSTRIPELEMENTS e D3DFVFCAPS_TEXCOORDCOUNTMASK no membro FVFCaps do D3DCAPS9.

As coordenadas de textura podem ser declaradas em formatos diferentes, permitindo que as texturas sejam tratadas usando apenas uma coordenada ou até quatro coordenadas de textura (para coordenadas de textura projetadas em 2D). Para obter mais informações, consulte Formatos de coordenadas de textura (Direct3D 9). Use o conjunto D3DFVF_TEXCOORDSIZEN de macros para criar padrões de bits que identificam os formatos de coordenada de textura usados pelo formato de vértice.

Nenhum aplicativo usará todos os componentes. Os campos recíprocos homogêneos W (RHW) e vértice normal são mutuamente exclusivos. A maioria dos aplicativos também não tentará usar todos os oito conjuntos de coordenadas de textura, mas o Direct3D tem essa capacidade. Há várias restrições sobre quais sinalizadores você pode usar com outros sinalizadores. Por exemplo, você não pode usar os sinalizadores D3DFVF_XYZ e D3DFVF_XYZRHW juntos, pois isso indica que seu aplicativo está descrevendo a posição de um vértice com vértices não transformados e não transformados.

Para usar a mesclagem de vértice indexada, o sinalizador D3DFVF_LASTBETA_UBYTE4 deve aparecer no final da declaração FVF. A presença desse sinalizador indica que o quinto peso de mesclagem será tratado como um DWORD em vez de float. Para obter mais informações, consulte Indexed Vértice Blending (Direct3D 9).

Os exemplos de código a seguir mostram a diferença entre um código FVF que usa o sinalizador D3DFVF_LASTBETA_UBYTE4 e outro que não usa. O sinalizador D3DFVF_XYZB3 está presente quando quatro índices de mesclagem são usados porque você sempre subtrai a soma dos três primeiros do número um para obter o quarto (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
};

O FVF definido abaixo usa o sinalizador 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
};

Declaração de vértice