Mappage de codes FVF à une déclaration Direct3D 9 (Direct3D 9)

Ce tableau mappe les codes FVF à une structure D3DVERTEXELEMENT9 .

FVF Type de données Utilisation Index d’utilisation
D3DFVF_XYZ D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZRHW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITIONT 0
D3DFVF_XYZW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZB5 et D3DFVF_LASTBETA_UBYTE4 D3DVSDT_FLOAT3, D3DVSDT_FLOAT4 D3DVSDT_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 et 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) et D3DFVF_LASTBETA_UBYTE4 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) et 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

 

Déclarations de vertex avec D3DDECLUSAGE_POSITIONT

La présence d’un élément de vertex avec (D3DUSAGE_POSITIONT, 0) est utilisée pour indiquer à l’appareil que les données de vertex entrantes ont déjà été traitées par un vertex (par exemple, une FVF avec D3DFVF_XYZRHW jeu de bits). Au moment du dessin, si la déclaration actuellement définie a un élément avec la sémantique (D3DUSAGE_POSITIONT, 0), le traitement complet du vertex est ignoré (comme si un FVF avec D3DFVF_XYZRHW bit avait été défini).

Il existe certaines restrictions sur les déclarations de vertex avec (D3DDECLUSAGE_POSITIONT, 0) :

  • Seul le flux zéro peut être utilisé dans ces déclarations.
  • Les éléments de vertex doivent être triés en augmentant le décalage de flux.
  • Le décalage de flux doit être aligné sur DWORD.
  • La même paire (Utilisation, Index d’utilisation) ne doit être répertoriée qu’une seule fois.
  • Seule la méthode D3DDECLMETHOD_DEFAULT peut être utilisée.
  • Les autres éléments de vertex ne peuvent pas avoir la sémantique (D3DDECLUSAGE_POSITION, 0).

En outre, il existe certaines restrictions sur cette déclaration liées à la version du pilote de périphérique. Ces restrictions sont en vigueur, car Direct3D envoie ces déclarations directement au pilote sans effectuer de conversion.

Déclarations de vertex sans D3DDECLUSAGE_POSITIONT

Le runtime valide la création de déclarations. Voici les règles générales applicables aux déclarations légales.

  • Tous les éléments de vertex d’un flux doivent être consécutifs et triés par décalage.
  • Le décalage de flux doit être aligné sur DWORD.
  • La même paire (Utilisation, Index d’utilisation) ne doit être répertoriée qu’une seule fois.
  • Si le D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET est défini, alors
    • Plusieurs éléments de vertex peuvent partager le même décalage dans un flux.
    • Les éléments de vertex peuvent tous être de types différents, qui peuvent être de tailles différentes.
    • Les éléments de vertex peuvent se chevaucher arbitrairement. Par exemple, un élément peut démarrer à l’emplacement d’un flux qui se trouve, en même temps, au milieu d’un autre élément.
    • Les éléments de vertex sont autorisés à avoir un décalage de flux dans n’importe quel ordre.
  • Le nombre d’éléments de vertex ne peut pas être supérieur à 64.
  • UsageIndex doit être dans la plage [0-15].
  • La déclaration, utilisée avec l’API DrawPrimitive, ne doit pas contenir d’éléments de vertex autres que D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED ou D3DDECLMETHOD_LOOKUP.
  • La déclaration, qui contient D3DDECLMETHOD_LOOKUP ou LOOKUPPRESAMPLED, doit être utilisée uniquement avec le pipeline de vertex programmable.
  • La déclaration, utilisée avec l’API DrawRectPatch/DrawTriPatch, ne peut pas avoir d’éléments de vertex avec D3DDECLMETHOD_LOOKUPPRESAMPLED ou D3DDECLMETHOD_LOOKUP.
  • La déclaration ne doit avoir qu’un seul élément avec D3DDECLMETHOD_LOOKUP ou D3DDECLMETHOD_LOOKUPPRESAMPLED méthode.
  • La déclaration avec D3DDECLMETHOD_LOOKUP ou D3DDECLMETHOD_LOOKUPPRESAMPLED ne doit pas contenir d’éléments autres que D3DDECLMETHOD_DEFAULT, car le mappage de déplacement est effectué uniquement pour les N-patchs.
  • Les éléments de vertex avec D3DDECLMETHOD_LOOKUP ou D3DDECLMETHOD_LOOKUPPRESAMPLED peuvent uniquement être utilisés avec la sémantique (D3DDECLUSAGE_SAMPLE, n) et vice versa.
  • Si un élément de vertex avec D3DDECLMETHOD_LOOKUP méthode a un index de flux et un décalage d’un élément de vertex déjà existant, cet élément de vertex doit avoir le même type de données.
  • Un élément de vertex avec la méthode D3DDECLMETHOD_LOOKUP doit avoir le type de données D3DDECLTYPE_FLOAT2/3/4
  • Les éléments de vertex avec des types D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU et D3DDECLMETHOD_PARTIALV doivent avoir un décalage d’un élément de vertex avec un type de données compatible.
  • Un élément de vertex avec la méthode D3DDECLMETHOD_UV ou D3DDECLMETHOD_LOOKUPPRESAMPLED doit avoir le type D3DDECLTYPE_UNUSED, l’index de flux zéro et le décalage de flux zéro.
  • Les déclarations avec des méthodes D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU et D3DDECLMETHOD_PARTIALV ne peuvent être utilisées qu’avec DrawRectPatch.
  • Les D3DDECLUSAGE_TESSFACTOR d’utilisation doivent être utilisés uniquement avec le type de données D3DDECLTYPE_FLOAT1 et l’index d’utilisation 0.
  • Lorsqu’une déclaration est utilisée pour la mise en forme (DrawRectPatch, DrawTriPatch, N-patches), le type de données doit être inférieur ou égal à D3DDECLTYPE_SHORT4.
  • Les déclarations qui contiennent des méthodes nécessitant certaines fonctionnalités d’appareil (par exemple, le mappage des déplacements, les correctifs RT) ne peuvent être créées que si l’appareil les prend en charge.
  • Une déclaration de vertex utilisée pour dessiner des points et des lignes ne peut pas avoir d’autres méthodes que D3DDECLMETHOD_DEFAULT.
  • Les déclarations qui peuvent être créées dépendent également des fonctionnalités du pilote.

Considérations relatives aux pilotes

Pilotes pré-Direct3D 9

  • La déclaration d’entrée doit être traduite en FVF valide (avoir le même ordre d’éléments de vertex et leurs types de données).
  • Les écarts dans les coordonnées de texture ne sont pas autorisés. Cela signifie que s’il existe un élément de vertex avec (D3DDECLUSAGE_TEXCOORD, n), il doit également y avoir un élément de vertex avec (D3DDECLUSAGE_TEXCOORD, n-1).

Pilotes Direct3D 9 sans prise en charge du nuanceur de pixels version 3

  • La déclaration d’entrée doit être traduite en FVF valide (avoir le même ordre d’éléments de vertex et leurs types de données).
  • Les écarts dans les coordonnées de texture sont autorisés.

Pilotes Direct3D 9 avec prise en charge du nuanceur de pixels version 3

Les déclarations plus générales sont autorisées.

  • Les éléments de vertex peuvent être dans un ordre arbitraire et peuvent avoir n’importe quel type de données.
  • Plusieurs éléments de vertex peuvent partager le même décalage de flux et être d’un type différent au même moment si D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET est défini par appareil.

Utilisation de la déclaration de vertex avec le pipeline de vertex programmable

  • Au moment du dessin, Direct3D recherche la même combinaison « utilisation - index d’utilisation » dans la déclaration de vertex actuelle et la fonction de nuanceur de vertex actuel. Lorsque la combinaison est trouvée, le registre de la fonction de nuanceur DCL est utilisé comme destination pour l’élément de vertex.
  • Lorsqu’un élément de vertex dans la déclaration de vertex actuelle a une utilisation qui n’est pas trouvée dans le nuanceur de vertex actuel, cet élément de vertex est ignoré.
  • Lorsque vous utilisez une version de nuanceurs de vertex inférieure à 2.0, toute la sémantique mentionnée dans le code du nuanceur doit être présente dans la limite de déclaration au moment du dessin. Lorsque vous utilisez des nuanceurs de vertex 2.0 et versions ultérieures, cette restriction qui permet aux applications d’utiliser des déclarations de vertex différentes avec le même nuanceur de vertex n’existe pas. Cela est utile lorsqu’un nuanceur de vertex lit les données d’entrée en fonction de conditions statiques. Les registres de nuanceur de vertex non initialisés pour cette raison auront des valeurs non définies.

Il existe des restrictions supplémentaires lors de l’utilisation avec le traitement de vertex matériel sur un pilote DirectX 8 :

  • Les éléments de vertex ne peuvent pas se chevaucher ou partager le même décalage.
  • Les types de données sont limités à ce que le pilote DirectX 8 peut comprendre.

La déclaration CreateVertexDeclaration peut échouer si la déclaration fournie ne peut pas être convertie en déclaration de style DirectX 8. Pour un appareil en mode mixte, cette défaillance se produit au moment de Draw*, car c’est la seule fois où il peut être connu si ce nuanceur est utilisé avec le traitement du vertex matériel ou logiciel.

Utilisation de la déclaration de vertex avec le pipeline de fonction fixe

Seules les déclarations qui respectent les règles suivantes peuvent être utilisées :

  • Il ne doit pas y avoir d’intervalles entre les éléments de vertex (SKIP n’était pas autorisé dans une déclaration DirectX 8, qui est utilisée pour le pipeline de fonction fixe).
  • La sémantique (D3DDECLUSAGE_POSITION, 0) doit être spécifiée et doit avoir D3DDECLTYPE_FLOAT3 type de données.
  • Un élément de vertex avec la méthode D3DDECLMETHOD_UV doit spécifier D3DDECLUSAGE_TEXCOORD ou D3DDECLUSAGE_BLENDWEIGHT d’utilisation.
  • Un élément de vertex avec D3DDECLMETHOD_PARTIALU de méthode, _PARTIALV ou _CROSSUV ne peut être utilisé qu’avec D3DDECLUSAGE_POSITION, _NORMAL, _BLENDWEIGHT ou _TEXCOORD, et doit utiliser le type d’entrée D3DDECLTYPE_FLOAT3.

Lorsqu’une déclaration est utilisée avec le traitement de vertex matériel sur un pilote DirectX 8, le runtime Direct3D la convertit en déclaration de style DirectX 8 avec les règles suivantes :

  • Les éléments de vertex ne peuvent pas partager le même décalage dans un flux et ils ne peuvent pas se chevaucher.
  • Le type de données doit être inférieur ou égal D3DDECLTYPE_SHORT4.
  • Seules les méthodes suivantes sont autorisées : D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV et D3DDECLMETHOD_UV
  • Le mappage entre une déclaration Direct3D 9 et une déclaration Direct3D 8 (Direct3D 9) montre quelle sémantique Direct3D 9 peut être convertie en déclaration de style DirectX 8. Utilisation et UsageIndex sont convertis en valeur de registre.
  • S’il y a n éléments de vertex dans une déclaration et que 0 - m (m < n) est mappé à un FVF (éléments décrits dans Le mappage entre une déclaration Direct3D et des codes FVF (Direct3D 9)), mais pas m + 1, alors :
    • Si l’un des éléments m + 2 jusqu’à n - 1 vertex est mappé à FVF/dx8decl, la déclaration n’est pas valide.
    • Les éléments 0 en m sont convertis (par le runtime pour DirectX 8 et les pilotes Plus anciens, et par les pilotes Direct3D 9) à l’aide du mappage entre une déclaration Direct3D et des codes FVF (Direct3D 9), m + 1, m + 2 jusqu’à ce que n - 1 devienne mappé à texcoord(k), texcoord(k+1), à partir de n’importe quel texcoord dans les éléments 0 - m.
    • Le type de données d’un texcoord mappé est supposé être float[1234] en remplaçant le type de données que l’élément actuel contient (mais de la même taille). Par conséquent, le type de données existant peut être quelque chose qui n’est pas dans Mappage entre une déclaration Direct3D et des codes FVF (Direct3D 9).
    • Si k atteint 8, la déclaration n’est pas valide pour FVF/dx8decl.
    • Si des mappages à des texcoords se sont produits, la déclaration entière ne doit avoir aucun élément avec une méthode de génération autre que DEFAULT ou la déclaration n’est pas valide pour FVF/dx8decl.

Utilisation de déclarations de vertex avec ProcessVertices

Une déclaration de vertex peut être utilisée pour décrire la sortie de ProcessVertices. Cette déclaration doit respecter les règles suivantes :

  • Seul le flux 0 doit être utilisé.
  • Seules D3DDECLMETHOD_DEFAULT méthodes sont autorisées.
  • Seuls les types de données D3DDECLTYPE_FLOATn ou D3DDECLTYPE_D3DCOLOR peuvent être utilisés.
  • Les éléments de vertex ne peuvent pas partager le même décalage ou se chevaucher les uns avec les autres.
  • Les éléments de vertex avec (D3DDECLUSAGE_POSITION, 0) ou (D3DDECLUSAGE_POSITIONT,0) ne sont pas obligatoires.
  • Les éléments de vertex avec (D3DDECLUSAGE_POSITION, 0) et (D3DDECLUSAGE_POSITIONT,0) ne peuvent pas être présents dans la même déclaration.
  • Le nuanceur de vertex actuel doit être version 3.0 ou ultérieure lorsque cette déclaration est utilisée.

Déclaration de vertex