Delen via


Vaste functie-FVF-codes (Direct3D 9)

Een FVF-code beschrijft de inhoud van hoekpunten die zijn opgeslagen in één gegevensstroom. In het algemeen worden gegevens opgegeven die moeten worden verwerkt door de vertexverwerkingspijplijn van de vaste functie. Dit is een declaratie van een ouder hoekpunt; zie D3DVERTEXELEMENT9om de huidige stijl voor declaratie van hoekpunten te zien.

Direct3D-toepassingen kunnen modelhoeken op verschillende manieren definiëren. Ondersteuning voor flexibele hoekpuntdefinities, ook wel flexibele hoekpuntindelingen of flexibele hoekpuntindelingcodes genoemd, maakt het mogelijk dat uw toepassing alleen de benodigde hoekpuntonderdelen gebruikt, waardoor deze onderdelen die niet worden gebruikt, worden geëlimineerd. Door alleen de benodigde hoekpuntonderdelen te gebruiken, kan uw toepassing geheugen besparen en de verwerkingsbandbreedte minimaliseren die nodig is om modellen weer te geven. U beschrijft hoe de hoekpunten worden opgemaakt met behulp van een combinatie van D3DFVF- codes.

De FVF-specificatie bevat indelingen voor puntgrootte, opgegeven door D3DFVF_PSIZE. Deze grootte wordt uitgedrukt in cameraruimte-eenheden voor niet-getransformeerde en verlichte (TL)-hoekpunten en in apparaatruimte-eenheden voor TL-hoekpunten.

De renderingmethoden van de IDirect3DDevice9-interface bieden C++-toepassingen met methoden die een combinatie van deze vlaggen accepteren en deze gebruiken om te bepalen hoe primitieven moeten worden weergegeven. In principe vertellen deze vlaggen het systeem welke hoekpuntonderdelen - positie, hoekpuntmenmening gewichten, normale kleuren en het aantal en de notatie van patrooncoördinaten - uw toepassing gebruikt en, indirect, welke delen van de renderingpijplijn u Direct3D erop wilt toepassen. Bovendien communiceert de aanwezigheid of afwezigheid van een bepaalde vlag voor hoekpuntindeling met het systeem welke hoekpuntonderdeelvelden aanwezig zijn in het geheugen en die u weglaat.

Als u de apparaatbeperkingen wilt bepalen, kunt u een query uitvoeren op een apparaat voor de waarden van D3DFVFCAPS_DONOTSTRIPELEMENTS en D3DFVFCAPS_TEXCOORDCOUNTMASK in het lid FVFCaps van D3DCAPS9.

Patrooncoördinaten kunnen in verschillende indelingen worden gedeclareerd, zodat patronen kunnen worden aangepakt met slechts één coördinaat of zo veel als vier patrooncoördinaten (voor 2D-projected patrooncoördinaten). Zie Bitmapcoördinaatindelingen (Direct3D 9)voor meer informatie. Gebruik de D3DFVF_TEXCOORDSIZEN set macro's om bitpatronen te maken die de patrooncoördinaatindelingen identificeren die door de hoekpuntindeling worden gebruikt.

Er wordt geen toepassing gebruikt voor elk onderdeel. De wederzijdse homogene W (RHW) en hoekpunt normale velden sluiten elkaar wederzijds uit. De meeste toepassingen proberen niet alle acht sets patrooncoördinaten te gebruiken, maar Direct3D heeft deze capaciteit. Er zijn verschillende beperkingen voor welke vlaggen u kunt gebruiken met andere vlaggen. U kunt bijvoorbeeld de D3DFVF_XYZ- en D3DFVF_XYZRHW vlaggen niet samen gebruiken, omdat dit aangeeft dat uw toepassing de positie van een hoekpunt beschrijft met zowel niet-getransformeerde als getransformeerde hoekpunten.

Als u geïndexeerde hoekpuntmix wilt gebruiken, moet de vlag D3DFVF_LASTBETA_UBYTE4 worden weergegeven aan het einde van de FVF-declaratie. De aanwezigheid van deze vlag geeft aan dat het vijfde menggewicht wordt behandeld als een DWORD in plaats van float. Zie Geïndexeerde hoekpuntmix (Direct3D 9)voor meer informatie.

In de volgende codevoorbeelden ziet u het verschil tussen een FVF-code die gebruikmaakt van de D3DFVF_LASTBETA_UBYTE4 vlag en een code die dat niet doet. De vlag D3DFVF_XYZB3 aanwezig is wanneer er vier mengindexen worden gebruikt, omdat u altijd de som van de eerste drie aftrekken van de eerste drie om de vierde te verkrijgen (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
};

De hieronder gedefinieerde FVF gebruikt de D3DFVF_LAST_UBYTE4 vlag.

#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
};

declaratie van hoekpunten