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. 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 atual da declaração de vértice, consulte D3DVERTEXELEMENT9.
Os aplicativos Direct3D podem definir vértices do 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ível, 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 memória e minimizar a largura de banda de processamento necessária para renderizar modelos. Você descreve como seus vértices são formatados usando uma combinação de códigos de D3DFVF.
A especificação FVF inclui formatos para o tamanho do ponto, especificados por D3DFVF_PSIZE. Este tamanho é expresso em unidades de espaço de câmara para vértices não transformados e iluminados (TL) e em unidades de espaço de dispositivo para vértices TL.
Os métodos de renderização da interfaceIDirect3DDevice9 dofornecem aplicativos C++ com 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 mistura de vértices, normal, cores e o número e 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 componentes de vértice estão presentes na memória e quais você omitiu.
Para determinar as limitações do dispositivo, você pode consultar um dispositivo para obter os valores de D3DFVFCAPS_DONOTSTRIPELEMENTS e D3DFVFCAPS_TEXCOORDCOUNTMASK no membro FVFCaps do D3DCAPS9.
As coordenadas de textura podem ser declaradas em diferentes formatos, permitindo que as texturas sejam abordadas 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 D3DFVF_TEXCOORDSIZEN conjunto de macros para criar padrões de bits que identifiquem os formatos de coordenadas de textura usados pelo formato de vértice.
Nenhum aplicativo usará todos os componentes. Os campos homogéneos recíprocos W (RHW) e vértice normal excluem-se mutuamente. Nem a maioria dos aplicativos tentará usar todos os oito conjuntos de coordenadas de textura, mas o Direct3D tem essa capacidade. Há várias restrições sobre quais bandeiras você pode usar com outras bandeiras. Por exemplo, você não pode usar os sinalizadores D3DFVF_XYZ e D3DFVF_XYZRHW juntos, pois isso indicaria que seu aplicativo está descrevendo a posição de um vértice com vértices não transformados e transformados.
Para usar a mistura de vértices indexados, o sinalizador de D3DFVF_LASTBETA_UBYTE4 deve aparecer no final da declaração FVF. A presença desta bandeira indica que o quinto peso de mistura será tratado como um DWORD em vez de flutuador. Para obter mais informações, consulte Indexed Vertex 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 um que não usa. O sinalizador D3DFVF_XYZB3 está presente quando quatro índices de mistura 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 a bandeira 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
};
Tópicos relacionados