Partager via


Étape Pixel Shader (PS)

L’étape Du nuanceur de pixels (PS) reçoit des données interpolées pour une primitive et génère des données par pixel, telles que la couleur.

Il s’agit d’une étape de nuanceur programmable ; il s’affiche sous la forme d’un bloc arrondi dans le diagramme du pipeline graphique. Cette étape de nuanceur expose ses propres fonctionnalités uniques, basées sur le modèle de nuanceur 4.0 core common-shader.

L’étape Du nuanceur de pixels (PS) permet de réaliser des techniques d’ombrage enrichies 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 vertex et d’autres données pour produire des sorties par pixel. L’étape Rasterizer (RS) 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.

Lors de l’échantillonnage multiple 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 multisample 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 pour les 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, afin que les dérivés de quantités calculées dans le nuanceur de pixels puissent être raisonnablement approximatifs en tant que 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 entrées 32 bits et 4 composants. Sinon, un nuanceur de pixels peut prendre jusqu’à 32 entrées 32 bits et 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 ratérisée, en fonction du mode d’interpolation déclaré. Si une primitive est dé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) aux emplacements du centre de 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, par élément dans un argument ou une structure d’entrée. Les attributs peuvent être interpolés linéairement ou avec l’échantillonnage centroïde. Consultez la section « Centroid Sampling of Attributes when Multisample Antialiasing » dans les règles de rastérisation. L’évaluation centroïde est pertinente uniquement pendant l’échantillonnage multiple pour couvrir les cas où un pixel est couvert par une primitive, mais qu’un centre de pixels ne peut pas ê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. Par exemple, une position de pixel doit être marquée avec la sémantique SV_Position. L’étape d’assembleur d’entrée (IA) peut produire un scalaire pour un nuanceur de pixels (à l’aide de SV_PrimitiveID), l’étape Rasterizer (RS) 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, couleurs de 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 d’écriture de sortie distinct.

Utilisez l’état d’activation de l’écriture de profondeur (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 d’abandon pour ignorer les données pour ce pixel). Un nuanceur de pixels peut également générer une valeur de profondeur 32 bits, 1 composant, à virgule flottante facultative pour les tests 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 les tests de profondeur (en supposant que les tests de profondeur sont activés). Il n’existe aucun moyen de changer dynamiquement entre l’utilisation de la profondeur de fonction fixe ou de l’oDepth du nuanceur.

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

Pipeline graphique