Condividi tramite


Codici FVF della funzione fissa (Direct3D 9)

Un codice FVF descrive il contenuto dei vertici archiviati tra loro in un singolo flusso di dati. In genere specifica i dati da elaborare dalla pipeline di elaborazione dei vertici della funzione fissa. Si tratta di una dichiarazione di vertice in stile precedente; per visualizzare lo stile di dichiarazione del vertice corrente, vedere D3DVERTEXELEMENT9.

Le applicazioni Direct3D possono definire vertici del modello in diversi modi. Il supporto per le definizioni dei vertici flessibili, noto anche come formati di vertice flessibili o codici di formato dei vertici flessibili, consente all'applicazione di usare solo i componenti del vertice necessari, eliminando i componenti che non vengono usati. Usando solo i componenti del vertice necessari, l'applicazione può risparmiare memoria e ridurre al minimo la larghezza di banda di elaborazione necessaria per il rendering dei modelli. Viene descritto come i vertici vengono formattati usando una combinazione di codici D3DFVF .

La specifica FVF include formati per le dimensioni del punto, specificate da D3DFVF_PSIZE. Questa dimensione è espressa nelle unità spaziali della fotocamera per vertici non trasformati e illuminati (TL) e in unità di spazio dispositivo per vertici TL.

I metodi di rendering dell'interfaccia IDirect3DDevice9 forniscono applicazioni C++ con metodi che accettano una combinazione di questi flag e li usano per determinare come eseguire il rendering delle primitive. Fondamentalmente, questi flag indicano al sistema quali componenti del vertice - posizione, vertex blending pesi, normali, colori e il numero e il formato delle coordinate della trama - l'applicazione usa e, indirettamente, quali parti della pipeline di rendering si desidera applicare a loro. Inoltre, la presenza o l'assenza di un particolare flag di formato vertice comunica al sistema i campi dei componenti del vertice presenti in memoria e che sono stati omessi.

Per determinare le limitazioni del dispositivo, è possibile eseguire query su un dispositivo per i valori di D3DFVFCAPS_DONOTSTRIPELEMENTS e D3DFVFCAPS_TEXCOORDCOUNTMASK nel membro FVFCaps di D3DCAPS9.

Le coordinate della trama possono essere dichiarate in formati diversi, consentendo l'indirizzamento delle trame usando una coordinata o un numero massimo di quattro coordinate di trama (per le coordinate della trama proiettate 2D). Per altre informazioni, vedere Formati coordinate trama (Direct3D 9). Usare il set di macro D3DFVF_TEXCOORDSIZEN per creare modelli di bit che identificano i formati di coordinate della trama usati dal formato del vertice.

Nessuna applicazione userà ogni componente. I campi normali di vertice e W (RHW) reciprocamente omogenei sono esclusivi. Né la maggior parte delle applicazioni prova a usare tutti e otto i set di coordinate della trama, ma Direct3D ha questa capacità. Esistono diverse restrizioni per i flag che è possibile usare con altri flag. Ad esempio, non è possibile usare i flag di D3DFVF_XYZ e D3DFVF_XYZRHW insieme, in quanto indica che l'applicazione descrive la posizione di un vertice con vertici non trasformati e non trasformati.

Per usare la fusione dei vertici indicizzati, il flag di D3DFVF_LASTBETA_UBYTE4 deve essere visualizzato alla fine della dichiarazione FVF. La presenza di questo flag indica che il quinto peso di fusione verrà considerato come DWORD anziché float. Per altre informazioni, vedere Blending vertex indicizzato (Direct3D 9).

Gli esempi di codice seguenti illustrano la differenza tra un codice FVF che usa il flag di D3DFVF_LASTBETA_UBYTE4 e uno che non lo fa. Il flag D3DFVF_XYZB3 è presente quando vengono usati quattro indici di fusione perché si sottrae sempre la somma dei primi tre dal numero uno per ottenere il quarto (blend₄ = 1 - (blend₁ + blend ctrl + 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
};

Il FVF definito di seguito usa il flag di 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
};

Dichiarazione vertex