Delen via


FVF-codes toewijzen aan een Direct3D 9-declaratie (Direct3D 9)

Deze tabel wijst FVF-codes toe aan een D3DVERTEXELEMENT9-structuur.

FVF Gegevenstype Gebruik Gebruiksindex
D3DFVF_XYZ D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZRHW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITIONT 0
D3DFVF_XYZW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZB5 en D3DFVF_LASTBETA_UBYTE4 D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 en D3DFVF_LASTBETA_D3DCOLOR D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_D3DCOLOR D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT4, D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOATn D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT 0
D3DFVF_XYZBn (n=1..4) en D3DFVF_LASTBETA_UBYTE4 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) en D3DFVF_LASTBETA_D3DCOLOR D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_NORMAL D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_NORMAL 0
D3DFVF_PSIZE D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_PSIZE 0
D3DFVF_DIFFUSE D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 0
D3DFVF_SPECULAR D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 1
D3DFVF_TEXCOORDSIZEm(n) D3DDECLTYPE_FLOATm D3DDECLUSAGE_TEXCOORD n

 

Hoekpuntdeclaraties met D3DDECLUSAGE_POSITIONT

De aanwezigheid van een hoekpuntelement met (D3DUSAGE_POSITIONT, 0) wordt gebruikt om aan te geven aan het apparaat dat de binnenkomende hoekpuntgegevens al zijn verwerkt via vertexverwerking (zoals een FVF met D3DFVF_XYZRHW bitset). Als de huidige setdeclaratie tijdens het tekenen een element met de semantische (D3DUSAGE_POSITIONT, 0) heeft, wordt de gehele hoekpuntverwerking overgeslagen (net als een FVF met D3DFVF_XYZRHW bit is ingesteld).

Er gelden enkele beperkingen voor hoekpuntdeclaraties met (D3DDECLUSAGE_POSITIONT, 0):

  • Alleen stream zero kan worden gebruikt in dergelijke declaraties.
  • Hoekpuntelementen moeten worden gesorteerd door de stroomverschuiving te vergroten.
  • De offset van de datastroom moet een DWORD-uitlijning hebben.
  • Hetzelfde paar (gebruik, gebruiksindex) mag slechts één keer worden vermeld.
  • Alleen de D3DDECLMETHOD_DEFAULT methode kan worden gebruikt.
  • Andere hoekpuntelementen kunnen de semantische (D3DDECLUSAGE_POSITION, 0) niet hebben.

Daarnaast gelden er enkele beperkingen voor dergelijke declaratie met betrekking tot de versie van het apparaatstuurprogramma. Deze beperkingen zijn van kracht omdat Direct3D dergelijke declaraties rechtstreeks naar het stuurprogramma verzendt zonder conversie.

Hoekpuntdeclaraties zonder D3DDECLUSAGE_POSITIONT

Runtime valideert het maken van declaraties. Hieronder vindt u de algemene regels voor welke declaraties wettelijk zijn.

  • Alle vertexelementen voor een stream moeten opeenvolgend zijn en op offset gesorteerd worden.
  • De stroomverschuiving moet DWORD zijn uitgelijnd.
  • Hetzelfde paar (gebruik, gebruiksindex) mag slechts één keer worden vermeld.
  • Als de D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET is ingesteld,
    • Meerdere hoekpuntelementen kunnen dezelfde offset in een stroom delen.
    • De hoekpuntelementen kunnen allemaal van verschillende typen zijn, die van verschillende grootten kunnen zijn.
    • De hoekpuntelementen kunnen willekeurig overlappen. Eén element kan bijvoorbeeld beginnen op een locatie van een stroom die zich in het midden van een ander element bevindt.
    • Hoekpuntelementen mogen stroomverschuivingen in elke willekeurige volgorde hebben.
  • Het aantal hoekpuntelementen mag niet groter zijn dan 64.
  • UsageIndex moet zich in het bereik [0-15] hebben.
  • Declaratie, die wordt gebruikt met de DrawPrimitive-API, mag geen andere hoekpuntelementen hebben dan D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED of D3DDECLMETHOD_LOOKUP.
  • Declaratie, die D3DDECLMETHOD_LOOKUP of LOOKUPPRESAMPLED bevat, mag alleen worden gebruikt met de programmeerbare vertexpijplijn.
  • Declaratie, gebruikt met de DrawRectPatch/DrawTriPatch-API, mag geen hoekpuntelementen hebben met D3DDECLMETHOD_LOOKUPPRESAMPLED of D3DDECLMETHOD_LOOKUP.
  • Declaratie mag slechts één element hebben met D3DDECLMETHOD_LOOKUP of D3DDECLMETHOD_LOOKUPPRESAMPLED methode.
  • Declaratie met D3DDECLMETHOD_LOOKUP of D3DDECLMETHOD_LOOKUPPRESAMPLED mag geen andere elementen bevatten dan D3DDECLMETHOD_DEFAULT, omdat verplaatsingstoewijzing alleen wordt uitgevoerd voor N-patches.
  • Hoekpuntelementen met D3DDECLMETHOD_LOOKUP of D3DDECLMETHOD_LOOKUPPRESAMPLED kunnen alleen worden gebruikt met de semantiek (D3DDECLUSAGE_SAMPLE, n) en vice versa.
  • Als een hoekpuntelement met D3DDECLMETHOD_LOOKUP methode een stroomindex en verschuiving van een al bestaand hoekpuntelement heeft, moet dit hoekpuntelement hetzelfde gegevenstype hebben.
  • Een hoekpuntelement met de methode D3DDECLMETHOD_LOOKUP moet het gegevenstype D3DDECLTYPE_FLOAT2/3/4 hebben
  • Hoekpuntelementen met typen D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU en D3DDECLMETHOD_PARTIALV moeten een verschuiving van een hoekpuntelement met een compatibel gegevenstype hebben.
  • Een hoekpuntelement met de methode D3DDECLMETHOD_UV of D3DDECLMETHOD_LOOKUPPRESAMPLED moet type hebben D3DDECLTYPE_UNUSED, stroomindex nul en stroomverschilnul.
  • Declaraties met methoden D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU en D3DDECLMETHOD_PARTIALV kunnen alleen worden gebruikt met DrawRectPatch.
  • Gebruik D3DDECLUSAGE_TESSFACTOR mag alleen worden gebruikt met gegevenstype D3DDECLTYPE_FLOAT1 en gebruiksindex 0.
  • Wanneer een declaratie wordt gebruikt voor tesseling (DrawRectPatch, DrawTriPatch, N-patches), moet het gegevenstype kleiner zijn dan of gelijk zijn aan D3DDECLTYPE_SHORT4.
  • Declaraties die methoden bevatten die bepaalde apparaatmogelijkheden vereisen (bijvoorbeeld verplaatsingstoewijzing, RT-patches) kunnen alleen worden gemaakt als het apparaat deze ondersteunt.
  • Een hoekpuntdeclaratie die wordt gebruikt om punten en lijnen te tekenen, mag geen andere methoden hebben dan D3DDECLMETHOD_DEFAULT.
  • De declaraties die kunnen worden gemaakt, zijn ook afhankelijk van de mogelijkheden van het stuurprogramma.

Overwegingen voor bestuurders

Pre-Direct3D 9-stuurprogramma's

  • De invoerdeclaratie moet vertaalbaar zijn naar een geldige FVF (met dezelfde volgorde van hoekpuntelementen en de bijbehorende gegevenstypen).
  • Hiaten in patrooncoördinaten zijn niet toegestaan. Dit betekent dat als er een hoekpuntelement met (D3DDECLUSAGE_TEXCOORD, n) is, er ook een hoekpuntelement moet zijn met (D3DDECLUSAGE_TEXCOORD, n-1).

Direct3D 9-stuurprogramma's zonder ondersteuning voor Pixel Shader versie 3

  • De invoerdeclaratie moet vertaalbaar zijn naar een geldige FVF (met dezelfde volgorde van hoekpuntelementen en de bijbehorende gegevenstypen).
  • Hiaten in textuurcoördinaten zijn toegestaan.

Direct3D 9-stuurprogramma's met ondersteuning voor Pixel Shader versie 3

Meer algemene verklaringen zijn toegestaan.

  • Hoekpuntelementen kunnen in willekeurige volgorde zijn en kunnen gegevenstypen hebben.
  • Meerdere vertex-elementen kunnen dezelfde stroomoffset delen en tegelijkertijd van een ander type zijn als D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET is ingesteld door het apparaat.

Gebruik van hoekpuntdeclaratie met de programmeervriendelijke hoekpuntpijplijn

  • Tijdens het tekenen zoekt Direct3D naar dezelfde combinatie van 'gebruik - gebruiksindex' in de huidige vertexdeclaratie en de huidige vertexshaderfunctie. Wanneer de combinatie wordt gevonden, wordt het register van de arceringsfunctie DCL gebruikt als de bestemming voor het hoekpuntelement.
  • Wanneer een hoekpuntelement in de huidige hoekpuntdeclaratie een gebruik heeft dat niet wordt gevonden in de huidige hoekpunt-shader, wordt dat hoekpuntelement genegeerd.
  • Wanneer u een versie van een hoekpunt-shaders gebruikt die kleiner is dan 2.0, moeten alle semantiek die in de shader-code wordt genoemd aanwezig zijn in de declaratie die tijdens het tekenen is gebonden. Wanneer u hoekpunt-shaders 2.0 en hoger gebruikt, bestaat deze beperking waarmee toepassingen verschillende hoekpuntdeclaraties kunnen gebruiken met dezelfde hoekpunt-shader niet. Dit is handig wanneer een hoekpunt-shader invoergegevens leest op basis van statische voorwaarden. Vertexshader-registers zijn niet geïnitialiseerd en zullen hierdoor ongedefinieerde waarden hebben.

Er zijn extra beperkingen voor het gebruik met hardwarepuntverwerking op een DirectX 8-stuurprogramma:

  • Hoekpuntelementen mogen dezelfde offset niet overlappen of delen.
  • Gegevenstypen zijn beperkt tot wat het DirectX 8-stuurprogramma kan begrijpen.

De CreateVertexDeclaration kan mislukken als de opgegeven declaratie niet kan worden geconverteerd naar een DirectX 8-declaratie. Voor een apparaat in de gemengde modus zal deze fout optreden tijdens de rendertijd omdat dit het enige moment is waarop kan worden vastgesteld of deze shader wordt gebruikt met hardware- of softwarematige verwerking van hoekpunten.

Gebruik van hoekpuntdeclaratie met de vaste functiepijplijn

Alleen declaraties die voldoen aan de volgende regels kunnen worden gebruikt:

  • Er mogen geen hiaten zijn tussen hoekpuntelementen (SKIP is niet toegestaan in een DirectX 8-declaratie, die wordt gebruikt voor de vaste functiepijplijn).
  • Semantisch (D3DDECLUSAGE_POSITION, 0) moet worden opgegeven en moet D3DDECLTYPE_FLOAT3 gegevenstype hebben.
  • Een vertexelement met de methode D3DDECLMETHOD_UV moet de gebruiksspecificatie D3DDECLUSAGE_TEXCOORD of D3DDECLUSAGE_BLENDWEIGHT opgeven.
  • Een hoekpuntelement met methode D3DDECLMETHOD_PARTIALU, _PARTIALV of _CROSSUV kan alleen worden gebruikt met D3DDECLUSAGE_POSITION, _NORMAL, _BLENDWEIGHT of _TEXCOORD en moet invoertype D3DDECLTYPE_FLOAT3 gebruiken.

Wanneer een declaratie wordt gebruikt met hardwarepuntverwerking op een DirectX 8-stuurprogramma, converteert de Direct3D-runtime deze naar een DirectX 8-declaratie met de volgende regels:

  • Hoekpuntelementen kunnen niet dezelfde offset in een stroom delen en ze kunnen niet overlappen.
  • Het gegevenstype moet kleiner of gelijk zijn aan D3DDECLTYPE_SHORT4.
  • Alleen de volgende methoden zijn toegestaan: D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV en D3DDECLMETHOD_UV
  • Toewijzing tussen een Direct3D 9-declaratie en een Direct3D 8-declaratie (Direct3D 9) laat zien welke Direct3D 9-semantiek kan worden geconverteerd naar 8-declaratie van DirectX. Usage en UsageIndex worden geconverteerd naar een registerwaarde.
  • Als er n hoekpuntelementen in een declaratie zijn en 0 - m (waarbij m < n) is toegewezen aan een FVF (elementen beschreven in de toewijzing tussen een Direct3D-declaratie en FVF-codes (Direct3D 9)), maar m + 1 niet, dan:
    • Als een van de m + 2 tot n - 1 hoekpuntelementen is toegewezen aan FVF/dx8decl, is de declaratie ongeldig.
    • De elementen 0 tot m worden geconverteerd (door de runtime voor DirectX 8- en oudere stuurprogramma's, en door de Direct3D 9-stuurprogramma's) met behulp van de Toewijzing tussen een Direct3D-declaratie en FVF-codes (Direct3D 9), m + 1, m + 2 tot n - 1 worden toegewezen aan aaneengesloten texcoord(k), texcoord(k+1), beginnend met een texcoord in elementen 0 - m.
    • Het gegevenstype bij een toegewezen texcoord wordt verondersteld float[1234] te zijn, waarbij het alles vervangt wat het huidige element bevat qua gegevenstype (maar met dezelfde grootte). Daarom kan het bestaande gegevenstype iets zijn dat zich niet in toewijzing bevindt tussen een Direct3D-declaratie en FVF-codes (Direct3D 9).
    • Als k 8 bereikt, is de declaratie ongeldig voor FVF/dx8decl.
    • Als er toewijzingen aan texcoords voorkomen, moet de volledige declaratie geen elementen bevatten met een andere generatiemanier dan DEFAULT, anders is de declaratie ongeldig voor FVF/dx8decl.

Hoekpuntdeclaraties gebruiken met ProcessVertices

Een hoekpuntdeclaratie kan worden gebruikt om de uitvoer van ProcessVertices te beschrijven. Deze verklaring moet voldoen aan de volgende regels:

  • Alleen stream 0 moet worden gebruikt.
  • Alleen D3DDECLMETHOD_DEFAULT methoden zijn toegestaan.
  • Alleen D3DDECLTYPE_FLOATn of D3DDECLTYPE_D3DCOLOR gegevenstypen kunnen worden gebruikt.
  • Hoekpuntelementen kunnen niet dezelfde offset delen of elkaar overlappen.
  • Hoekpuntelementen met (D3DDECLUSAGE_POSITION, 0) of (D3DDECLUSAGE_POSITIONT,0) zijn niet vereist.
  • Hoekpuntelementen met (D3DDECLUSAGE_POSITION, 0) en (D3DDECLUSAGE_POSITIONT,0) kunnen niet aanwezig zijn in dezelfde declaratie.
  • De huidige hoekpunt-shader moet versie 3.0 of hoger zijn wanneer een dergelijke declaratie wordt gebruikt.

Verklaring van Vertex