Codici FVF a funzione fissa (Direct3D 9)
Un codice FVF descrive il contenuto dei vertici archiviati traleaved 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 di tipo precedente; per visualizzare lo stile corrente della dichiarazione dei vertici, vedere D3DVERTEXELEMENT9.
Le applicazioni Direct3D possono definire vertici del modello in diversi modi. Il supporto per definizioni di vertici flessibili, noti anche come formati di vertici flessibili o codici di formato dei vertici flessibili, consente all'applicazione di usare solo i componenti dei vertici necessari, eliminando i componenti non usati. Usando solo i componenti dei vertici necessari, l'applicazione può risparmiare memoria e ridurre al minimo la larghezza di banda di elaborazione necessaria per il rendering dei modelli. Viene descritto il modo in cui 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 in unità di spazio della fotocamera per vertici non trasformati e illuminati (TL) e in unità di spazio del dispositivo per vertici TL.
I metodi di rendering dell'interfaccia IDirect3DDevice9 forniscono alle applicazioni C++ 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 dei vertici, ovvero posizione, pesi di fusione dei vertici, normali, colori e il numero e il formato delle coordinate della trama, l'applicazione usa e, indirettamente, quali parti della pipeline di rendering si vuole applicare a loro. Inoltre, la presenza o l'assenza di un particolare flag di formato vertice comunica al sistema quali campi del componente vertice sono presenti in memoria e che sono stati omessi.
Per determinare le limitazioni del dispositivo, è possibile eseguire una query su un dispositivo per individuare i valori di D3DFVFCAPS_DONOTSTRIPELEMENTS e D3DFVFCAPS_TEXCOORDCOUNTMASK nel membro FVFCaps di D3DCAPS9.
Le coordinate delle trame possono essere dichiarate in formati diversi, consentendo l'indirizzamento delle trame usando solo una coordinata o fino a quattro coordinate di trama (per le coordinate delle trame proiettate 2D). Per altre informazioni, vedere formati di 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 dei vertici.
Nessuna applicazione userà ogni componente. I campi comuni omogenei W (RHW) e i campi normali dei vertici si escludono a vicenda. Né la maggior parte delle applicazioni proverà a usare tutti e otto i set di coordinate delle trame, ma Direct3D ha questa capacità. Esistono diverse restrizioni per i flag che è possibile usare con altri flag. Ad esempio, non è possibile usare insieme i flag D3DFVF_XYZ e D3DFVF_XYZRHW, in quanto indicare 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 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 Vertex Blending indicizzato (Direct3D 9).
Gli esempi di codice seguenti illustrano la differenza tra un codice FVF che usa il flag 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").
#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 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
};
Argomenti correlati