FVF-koder för fast funktion (Direct3D 9)
En FVF-kod beskriver innehållet i hörn som lagras i en enda dataström. Den anger vanligtvis data som ska bearbetas av pipelinen för bearbetning av fast funktionshörn. Det här är en deklaration av ett hörn i äldre stil. Om du vill se det aktuella hörndeklarationsformatet kan du läsa D3DVERTEXELEMENT9.
Direct3D-program kan definiera modellhörn på flera olika sätt. Stöd för flexibla hörndefinitioner, även kallade flexibla hörnformat eller flexibla hörnformatkoder, gör det möjligt för ditt program att endast använda de hörnkomponenter som behövs, vilket eliminerar de komponenter som inte används. Genom att bara använda de hörnkomponenter som behövs kan programmet spara minne och minimera den bearbetningsbandbredd som krävs för att återge modeller. Du beskriver hur dina hörn formateras med hjälp av en kombination av D3DFVF- koder.
FVF-specifikationen innehåller format för punktstorlek som anges av D3DFVF_PSIZE. Den här storleken uttrycks i kamerautrymmesenheter för icke-transformerade och upplysta hörn (TL) och i enheter med enhetsutrymme för TL-hörn.
Återgivningsmetoderna för IDirect3DDevice9-gränssnittet ger C++-program metoder som accepterar en kombination av dessa flaggor och använder dem för att fastställa hur primitiver ska återges. I grund och botten talar dessa flaggor om för systemet vilka hörnkomponenter - position, hörnblandningsvikter, normal, färger och antalet och formatet för strukturkoordinater - ditt program använder och indirekt vilka delar av renderingspipelinen du vill att Direct3D ska gälla för dem. Dessutom kommunicerar förekomsten eller frånvaron av en viss hörnformatflagga till systemet vilka hörnkomponentfält som finns i minnet och som du har utelämnat.
För att fastställa enhetsbegränsningar kan du fråga en enhet efter värdena för D3DFVFCAPS_DONOTSTRIPELEMENTS och D3DFVFCAPS_TEXCOORDCOUNTMASK i FVFCaps-medlemmen i D3DCAPS9.
Strukturkoordinater kan deklareras i olika format, vilket gör att texturer kan hanteras med så få som en koordinat eller så många som fyra strukturkoordinater (för 2D-projicerade strukturkoordinater). Mer information finns i Strukturkoordinatformat (Direct3D 9). Använd D3DFVF_TEXCOORDSIZEN uppsättning makron för att skapa bitmönster som identifierar de strukturkoordinatformat som används i hörnformatet.
Inget program kommer att använda varje komponent. De ömsesidiga homogena fälten W (RHW) och hörnens normala fält är ömsesidigt uteslutande. De flesta program kommer inte heller att försöka använda alla åtta uppsättningar strukturkoordinater, men Direct3D har den här kapaciteten. Det finns flera begränsningar för vilka flaggor du kan använda med andra flaggor. Du kan till exempel inte använda flaggorna D3DFVF_XYZ och D3DFVF_XYZRHW tillsammans, eftersom detta tyder på att ditt program beskriver ett hörns position med både otransformerade och transformerade hörn.
Om du vill använda indexerad brytpunktsblandning bör flaggan D3DFVF_LASTBETA_UBYTE4 visas i slutet av FVF-deklarationen. Förekomsten av den här flaggan anger att den femte blandningsvikten behandlas som ett DWORD i stället för flyttal. Mer information finns i Indexed Vertex Blending (Direct3D 9).
Följande kodexempel visar skillnaden mellan en FVF-kod som använder flaggan D3DFVF_LASTBETA_UBYTE4 och en som inte gör det. Flaggan D3DFVF_XYZB3 finns när fyra blandningsindex används eftersom du alltid subtraherar summan av de tre första från nummer ett för att få den fjärde (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
};
FVF:n som definieras nedan använder flaggan 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
};
Relaterade ämnen