Traitement du vertex de fonction fixe (Direct3D 9)
Dans le pipeline de vertex de fonction fixe, le traitement des sommets dans une mémoire tampon de vertex applique les matrices de transformation actuelles pour l’appareil. Les opérations de vertex telles que l’éclairage, la génération d’indicateurs de découpage et la mise à jour des extensions peuvent également être appliquées, si vous le souhaitez. Lors de l’utilisation du traitement de vertex de fonction fixe, la modification des éléments dans la mémoire tampon de vertex de destination est contrôlée par l’indicateur D3DPV_DONOTCOPYDATA . Cet indicateur s’applique uniquement au traitement du vertex de fonction fixe. L’interface IDirect3DDevice9 expose la méthode IDirect3DDevice9::P rocessVertices pour traiter les vertex. Vous traitez les sommets d’un nuanceur de vertex vers l’ensemble de flux de données d’entrée, en générant un seul flux de données de vertex entrelacées vers la mémoire tampon de vertex de destination en appelant la méthode IDirect3DDevice9::P rocessVertices . La méthode accepte cinq paramètres qui décrivent l’emplacement et la quantité de sommets ciblés par la méthode, la mémoire tampon de vertex de destination et les options de traitement. Après l’appel, la mémoire tampon de destination contient les données de vertex traitées.
Les premier, deuxième et troisième paramètres, SrcStartIndex, DestIndex et VertexCount, reflètent l’index du premier vertex à charger, l’index dans la mémoire tampon de destination à laquelle les sommets seront placés et le nombre total de sommets à traiter et à placer dans la mémoire tampon de destination, respectivement. Le quatrième paramètre, pDestBuffer, doit être défini sur l’adresse de l’interface IDirect3DVertexBuffer9 de l’objet tampon de vertex qui recevra les sommets sources. Le paramètre SrcStartIndex spécifie l’index auquel la méthode doit commencer à traiter les sommets.
Le paramètre final, Flags, détermine les options de traitement spéciales pour la méthode . Vous pouvez définir ce paramètre sur 0 pour le traitement des vertex par défaut ou pour D3DPV_DONOTCOPYDATA pour optimiser le traitement dans certaines situations. Vous pouvez également combiner la valeur D3DPV_DONOTCOPYDATA avec une ou plusieurs valeurs D3DLOCK appropriées pour la mémoire tampon de destination. Lorsque vous définissez Indicateurs sur 0, les composants de vertex du format de vertex de la mémoire tampon de vertex de destination qui ne sont pas affectés par l’opération de vertex sont toujours copiés à partir du nuanceur de vertex ou définis sur 0. Toutefois, lors de l’utilisation de D3DPV_DONOTCOPYDATA, IDirect3DDevice9::P rocessVertices ne remplace pas les informations de coordonnées de couleur et de texture dans la mémoire tampon de destination, sauf si ces données sont générées par Direct3D. La couleur diffuse est générée lorsque l’éclairage est activé, c’est-à-dire D3DRS_LIGHTING a la valeur TRUE. La couleur spéculaire est générée lorsque l’éclairage est activé et que le spéculaire est activé, c’est-à-dire que D3DRS_SPECULARENABLE et D3DRS_LIGHTING sont définis sur TRUE. La couleur spéculaire est également générée lorsque le brouillard est activé. Les coordonnées de texture sont générées lorsque la transformation de texture ou la génération de texture est activée. IDirect3DDevice9::P rocessVertices utilise les états de rendu actuels pour déterminer quel traitement de vertex doit être effectué.
Paramètres d’utilisation FVF pour les mémoires tampons de vertex de destination
La méthode IDirect3DDevice9::P rocessVertices nécessite des paramètres spécifiques pour le D3DFVF de la mémoire tampon de vertex de destination. Les paramètres d’utilisation FVF doivent être compatibles avec les paramètres actuels pour le traitement des vertex.
Pour le traitement des vertex de fonction fixe, IDirect3DDevice9::P rocessVertices nécessite les paramètres FVF suivants :
- Le type de position est toujours D3DFVF_XYZRHW ; par conséquent, D3DFVF_XYZ Et D3DFVF_XYZB1 via D3DFVF_XYZB5 Ne sont pas valides.
- Les indicateurs D3DFVF_NORMAL, D3DFVF_RESERVED0 et D3DFVF_RESERVED2 ne doivent pas être définis.
-
L’indicateur D3DFVF_DIFFUSE doit être défini si une opération OR des conditions suivantes retourne true :
- L’éclairage est activé ; autrement dit, D3DRS_LIGHTING a la valeur TRUE.
- L’éclairage est désactivé, la couleur diffuse est présente dans les flux de vertex d’entrée et D3DPV_DONOTCOPYDATA n’est pas défini.
-
L’indicateur D3DFVF_SPECULAR doit être défini si une opération OR des conditions suivantes retourne true :
- L’éclairage est activé et la couleur spéculaire est activée ; autrement dit, D3DRS_SPECULARENABLE a la valeur TRUE.
- L’éclairage est désactivé, la couleur spéculaire est présente dans les flux de vertex d’entrée et D3DPV_DONOTCOPYDATA n’est pas défini.
- Le brouillard de vertex est activé ; autrement dit, D3DRS_FOGVERTEXMODE n’est pas défini sur D3DFOG_NONE.
En outre, le nombre de coordonnées de texture doit être défini de la manière suivante :
- Si la transformation de texture et la génération de texture sont désactivées pour toutes les étapes de texture actives et que la D3DPV_DONOTCOPYDATA n’est pas définie, le nombre et le type de coordonnées de texture de sortie sont requis pour correspondre à ceux des coordonnées de texture de vertex d’entrée. Si D3DPV_DONOTCOPYDATA est défini et que la transformation de texture et la génération de texture sont désactivées, les coordonnées de texture de sortie sont ignorées.
- Si la transformation de texture ou la génération de texture est activée pour toutes les étapes de texture actives, le vertex de sortie peut avoir besoin de contenir plus de jeux de coordonnées de texture que le vertex d’entrée. Cela est dû à la prolifération des coordonnées de texture à partir de celles générées par la génération de texture ou dérivées par les transformations de texture. Notez qu’une prolifération similaire de coordonnées de texture se produit pendant les appels IDirect3DDevice9::D rawPrimitive , mais n’est pas visible par le programmeur de l’application. Dans ce cas, Direct3D génère un nouvel ensemble de coordonnées de texture. Le nouvel ensemble de coordonnées de texture est dérivé en parcourant les étapes de texture et en analysant les paramètres de génération de texture, de transformation de texture et d’index de coordonnées de texture pour déterminer si un ensemble unique de coordonnées de texture est nécessaire pour cette étape. Chaque fois qu’un nouvel ensemble est nécessaire, il est alloué dans l’ordre croissant. Notez que l’exigence maximale et classique est d’un jeu par étape, bien qu’elle puisse être moindre en raison du partage de coordonnées de texture non transformées via D3DTSS_TEXCOORDINDEX.
Ainsi, pour chaque étape de texture, un nouvel ensemble de coordonnées de texture est généré si une texture est liée à cette étape et que l’une des conditions suivantes est remplie :
- La génération de texture est activée pour cette étape.
- La transformation de texture est activée pour cette étape.
- Les coordonnées de texture d’entrée non transformées sont référencées via D3DTSS_TEXCOORDINDEX pour la première fois.
Lorsque Direct3D génère des coordonnées de texture, l’application doit effectuer les actions suivantes :
- Utilisez une mémoire tampon de vertex de destination avec l’utilisation de FVF appropriée.
- Reprogrammez la D3DTSS_TEXCOORDINDEX de l’étape de texture en fonction de l’emplacement des coordonnées de texture post-traitées. Notez que la reprogrammation du paramètre D3DTSS_TEXCOORDINDEX se produit lorsque la mémoire tampon de vertex traitée est utilisée dans les appels IDirect3DDevice9::D rawPrimitive et IDirect3DDevice9::D rawIndexedPrimitive suivants.
Enfin, la dimensionnalité des coordonnées de texture (D3DFVF_TEX0 à D3DFVF_TEX8 ) doit être définie de la manière suivante :
- Pour chaque jeu de coordonnées de texture, si la transformation de texture et la génération de texture sont désactivées, la dimensionnalité de la coordonnée de texture de sortie doit correspondre à l’entrée. Si la transformation de texture est activée, la dimensionnalité de sortie doit correspondre au nombre défini par les paramètres D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3 ou D3DTTFF_COUNT4. Si la transformation de texture est désactivée et que la génération de texture est activée, la dimensionnalité de sortie doit correspondre aux paramètres du mode de génération de texture ; Actuellement, tous les modes génèrent trois valeurs float.
Lorsque IDirect3DDevice9::P rocessVertices échoue en raison d’un code FVF de mémoire tampon de vertex de destination incompatible, le code attendu est imprimé dans la sortie de débogage (builds de débogage uniquement).
Rubriques connexes