Traitement de 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 clip et la mise à jour des étendues peuvent également être appliquées, éventuellement. Lorsque vous utilisez le 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 de D3DPV_DONOTCOPYDATA. Cet indicateur s’applique uniquement au traitement de vertex de fonction fixe. L’interface IDirect3DDevice9 expose la méthode IDirect3DDevice9 ::P rocessVertices pour traiter les sommets. Vous traitez les sommets d’un nuanceur de vertex vers l’ensemble de flux de données d’entrée, 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 méthode. La méthode accepte cinq paramètres qui décrivent l’emplacement et la quantité de sommets que la méthode cible, 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 premiers, deuxième et troisième paramètres, SrcStartIndex, DestIndex et VertexCount, reflètent l’index du premier sommet à charger, l’index dans la mémoire tampon de destination à laquelle les sommets seront placés, ainsi que 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'IDirect3DVertexBuffer9 interface 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 de 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 des indicateurs sur 0, les composants de vertex du format de vertex de destination de la mémoire tampon de vertex 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é, autrement dit, D3DRS_LIGHTING est défini sur TRUE. La couleur spéculaire est générée lorsque l’éclairage est activé et que la spécification est activée, autrement dit, D3DRS_SPECULARENABLE et D3DRS_LIGHTING sont définies 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 le traitement des sommets à effectuer.
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 la 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 du vertex.
Pour le traitement de 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 est 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éfinie.
- 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 est 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éfinie.
- Le brouillard de vertex est activé ; autrement dit, D3DRS_FOGVERTEXMODE n’est pas définie 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 nécessaires pour correspondre à ceux des coordonnées de texture de vertex d’entrée. Si D3DPV_DONOTCOPYDATA est définie 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 provenant 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 IDirect3DDevice9 ::D rawPrimitive appels, mais n’est pas visible par le programmeur d’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 requis pour cette étape. Chaque fois qu’un nouvel ensemble est nécessaire, il est alloué dans un ordre croissant. Notez que l’exigence maximale et classique est un ensemble par étape, bien qu’elle soit moins due au partage de coordonnées de texture non transformées par 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 vraie :
- 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 nontransformé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.
- Réprogrammez la D3DTSS_TEXCOORDINDEX de l’étape de texture en fonction du positionnement des coordonnées de texture postprocessées. Notez que le paramétrage du 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.
Enfin, la dimensionnalité des coordonnées de texture (D3DFVF_TEX0 via 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 dimension de 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