Partager via


Étape du nuanceur de pixels

La phase de nuanceur de pixels (PS) permet de riches techniques d’ombrage telles que l’éclairage par pixel et le post-traitement. Un nuanceur de pixels est un programme qui combine des variables constantes, des données de texture, des valeurs interpolées par sommet et d’autres données pour produire des sorties par pixel. L’étape de rastériseur 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 du multi-échantillonnage d’une texture, un nuanceur de pixels est appelé une fois par pixel couvert, tandis qu’un test de profondeur/gabarit se produit pour chaque multi-échantillonnage couvert. Les exemples qui réussissent le test de profondeur/gabarit sont mis à jour avec la couleur de sortie du nuanceur de pixels.

Les fonctions intrinsèques du nuanceur de pixels produisent ou utilisent des dérivés de quantités par rapport à l’espace d’écran x et y. L’utilisation la plus courante des dérivés consiste à calculer des calculs de niveau de détail pour l’échantillonnage de texture et, dans le cas d’un filtrage anisotropique, en sélectionnant des échantillons le long de l’axe de l’anisotropie. En règle générale, une implémentation matérielle exécute un nuanceur de pixels sur plusieurs pixels (par exemple, une grille 2x2) simultanément, de sorte que les dérivés des quantités calculées dans le nuanceur de pixels peuvent être raisonnablement approximatifs sous forme de deltas des valeurs au même point d’exécution dans les pixels adjacents.

Entrées

Lorsque le pipeline est configuré sans nuanceur de géométrie, un nuanceur de pixels est limité à 16 entrées 32 bits à 4 composants. Sinon, un nuanceur de pixels peut prendre jusqu’à 32 entrées 32 bits à 4 composants.

Les données d’entrée du 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 primitive. Les entrées du nuanceur de pixels sont interpolées à partir des attributs de vertex de la primitive en cours de rastérisation, en fonction du mode d’interpolation déclaré. Si une primitive est coupée avant la rastérisation, le mode d’interpolation est également respecté pendant le processus de découpage.

Les attributs de vertex sont interpolés (ou évalués) à l’emplacement central 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, sur une base par é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 centroïde. L’évaluation centroïde est pertinente uniquement pendant le multi-échantillonnage pour couvrir les cas où un pixel est couvert par une primitive, mais où un centre de pixels peut ne pas l’être ; l’évaluation centroïde 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. Pour instance, une position de pixel doit être marquée avec la sémantique SV_Position. La phase IA peut produire un scalaire pour un nuanceur de pixels (à l’aide de SV_PrimitiveID) ; la phase de rastériseur peut également générer un scalaire pour un nuanceur de pixels (à l’aide de SV_IsFrontFace).

Sorties

Un nuanceur de pixels peut générer jusqu’à 8, 32 bits et 4 couleurs à 4 composants, 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 ; chaque registre est autorisé à un masque de sortie-écriture distinct.

Utilisez l’état d’activation de la profondeur (dans l’étape sortie-fusion) pour contrôler si les données de profondeur sont écrites dans une mémoire tampon de profondeur (ou utilisez l’instruction d’abandon pour ignorer les données pour ce pixel). Un nuanceur de pixels peut également générer une valeur de profondeur facultative 32 bits, 1 composant, à virgule flottante, pour le test de profondeur (à l’aide de la sémantique SV_Depth). 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 changer dynamiquement entre l’utilisation de la profondeur de fonction fixe ou de l’oDepth de nuanceur.

Un nuanceur de pixels ne peut pas générer une valeur de gabarit.

Pipeline graphique

Étapes de pipeline (Direct3D 10)