Étape nuanceur de pixels
L’étape de nuanceur de pixels (PS) permet d’effectuer des techniques d’ombrage riches, telles que l’éclairage par pixel et le traitement des messages. Un nuanceur de pixels est un programme qui combine des variables constantes, des données de texture, des valeurs interpolées par vertex et d’autres données pour produire des sorties par pixel. L’étape de rastérisation appelle un nuanceur de pixels une fois pour chaque pixel couvert par une primitive. Toutefois, il est possible de spécifier un nuanceur null pour éviter d’exécuter un nuanceur.
Nuanceur de pixels
Lors de l’échantillonnage multiple d’une texture, un nuanceur de pixels est appelé une fois par pixel couvert lorsqu’un test de profondeur/gabarit se produit pour chaque exemple multiple couvert. Les exemples qui réussissent le test de profondeur/stencil sont mis à jour avec la couleur de sortie du nuanceur de pixels.
Les fonctions intrinsèques de nuanceur de pixels produisent ou utilisent des dérivées de quantités par rapport à l’espace d’écran x et y. L’utilisation la plus courante pour les dérivés consiste à calculer les calculs de niveau de détail pour l’échantillonnage de texture et, dans le cas du filtrage anisotrope, à sélectionner des échantillons le long de l’axe de l’anisotropie. En règle générale, une implémentation matérielle exécute simultanément un nuanceur de pixels sur plusieurs pixels (par exemple une grille 2x2), de sorte que les dérivés des quantités calculées dans le nuanceur de pixels peuvent être raisonnablement approchées comme des deltas des valeurs au même point d’exécution en pixels adjacents.
Entrées
Lorsque le pipeline est configuré sans nuanceur Geometry, un nuanceur de pixels est limité à 16, 32 bits, 4 composants. Dans le cas contraire, un nuanceur de pixels peut prendre jusqu’à 32, 32 bits, 4 composants.
Les données d’entrée de nuanceur de pixels incluent des attributs de vertex (qui peuvent être interpolés avec ou sans correction de perspective) ou peuvent être traités comme des constantes par Primitives. Les entrées de nuanceur de pixels sont interpolées à partir des attributs de vertex de la primitive en cours de pixellisation, en fonction du mode d’interpolation déclaré. Si une primitive est découpée avant pixellisation, le mode d’interpolation est également respecté au cours du processus de découpage.
Les attributs de vertex sont interpolés (ou évalués) aux emplacements du centre du nuanceur de pixels. Les modes d’interpolation d’attribut de nuanceur de pixels sont déclarés dans une déclaration de registre d’entrée, en fonction de chaque élément, dans un argument ou une structure d’entrée. Les attributs peuvent être interpolés de manière linéaire ou avec un échantillonnage de centre de gravité. L’évaluation de l’un des centres de gravité s’applique uniquement au cours de l’échantillonnage multiple pour couvrir les cas où un pixel est couvert par une primitive mais un centre de pixels ne peut pas être. l’évaluation du centre de gravité se produit aussi près que possible du centre de pixels (non couvert).
Les entrées peuvent également être déclarées avec une sémantique de valeur système, qui marque un paramètre consommé par d’autres étapes de pipeline. Par exemple, une position de pixel doit être marquée avec la _ sémantique de position SV. L’étape IA peut produire une scalaire pour un nuanceur de pixels (à l’aide de SV _ PrimitiveID); la phase de rastérisation peut également générer une scalaire pour un nuanceur de pixels (à l’aide de SV _ IsFrontFace).
Sorties
Un nuanceur de pixels peut sortir jusqu’à 8, 32 bits, 4 couleurs de composant ou aucune couleur si le pixel est ignoré. Les composants du registre de sortie du nuanceur de pixels doivent être déclarés avant de pouvoir être utilisés. un masque d’écriture de sortie distinct est autorisé pour chaque registre.
Utilisez l’État profondeur-écriture-activer (dans l’étape de fusion de sortie) pour contrôler si les données de profondeur sont écrites dans une mémoire tampon de profondeur (ou utilisez l’instruction ignore pour ignorer les données de ce pixel). Un nuanceur de pixels peut également générer une valeur facultative 32 bits, 1-composant, à virgule flottante, pour le test de profondeur (à l’aide de la _ sémantique de profondeur SV). La valeur de profondeur est sortie dans le registre oDepth et remplace la valeur de profondeur interpolée pour le test de profondeur (en supposant que le test de profondeur est activé). Il n’existe aucun moyen de modifier dynamiquement l’utilisation de la profondeur de fonction fixe ou du nuanceur oDepth.
Un nuanceur de pixels ne peut pas générer une valeur de stencil.