Partager via


Étape Geometry Shader (GS)

L’étape du nuanceur geometry (GS) traite des primitives entières : triangles, lignes et points, ainsi que leurs sommets adjacents. Il est utile pour les algorithmes, notamment l’expansion point sprite, les systèmes de particules dynamiques et la génération de volume d’ombre. Il prend en charge l’amplification géométrique et la dé-amplification.

Objectif et utilisations

L’étape du nuanceur geometry traite des primitives entières : triangles (3 sommets avec jusqu’à 3 sommets adjacents), lignes (2 sommets avec jusqu’à 2 sommets adjacents) et points (1 vertex).

illustration d’un triangle et d’une ligne avec sommets adjacents

Le nuanceur geometry prend également en charge l’amplification géométrique limitée et la dé-amplification. Étant donné une primitive d’entrée, le nuanceur geometry peut ignorer la primitive ou émettre une ou plusieurs nouvelles primitives.

L’étape du nuanceur geometry (GS) est 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 les modèles de nuanceur (voir core common-shader).

L’étape du nuanceur geometry convient parfaitement aux algorithmes, notamment :

  • Extension de sprite de point
  • Systèmes de particules dynamiques
  • Génération de fourrure/fin
  • Génération de volume d’ombre
  • Rendu à cubemap à pass unique
  • Per-Primitive Material Swapping
  • Configuration du matériau par primitive : cette fonctionnalité inclut la génération de coordonnées barycentriques en tant que données primitives afin qu’un nuanceur de pixels puisse effectuer une interpolation d’attribut personnalisée.

Entrée

L’étape du nuanceur Geometry exécute le code de nuanceur spécifié par l’application avec des primitives entières comme entrée et la possibilité de générer des sommets en sortie. Contrairement aux nuanceurs de vertex, qui fonctionnent sur un seul sommet, les entrées du nuanceur géométrique sont les sommets d’une primitive complète (trois sommets pour les triangles, deux sommets pour les lignes ou un sommet unique pour le point). Les nuanceurs géométriques peuvent également importer les données de vertex pour les primitives adjacentes aux bords comme entrée (trois supplémentaires pour un triangle, deux sommets supplémentaires pour une ligne).

L’étape du nuanceur geometry peut consommer la valeur générée par le système SV_PrimitiveID générée automatiquement par l’étape d’assembleur d’entrée (IA). Cela permet aux données par primitive d’être extraites ou calculées si vous le souhaitez.

Lorsqu’un nuanceur de géométrie est actif, il est appelé une fois pour chaque primitive transmise ou générée précédemment dans le pipeline. Chaque appel du nuanceur géométrique voit comme entrée les données de la primitive appelante, qu’il s’agisse d’un point unique, d’une seule ligne ou d’un triangle unique. Une bande de triangles antérieure dans le pipeline entraînerait un appel du nuanceur géométrique pour chaque triangle individuel de la bande (comme si la bande était développée dans une liste de triangles). Toutes les données d’entrée pour chaque vertex dans la primitive individuelle sont disponibles (autrement dit, 3 sommets pour un triangle), ainsi que les données de vertex adjacentes le cas échéant et disponibles.

Abréviations courantes de vertex :

Abréviation Terme
TV Sommet de triangle
LV Sommet de ligne
AV Vertex adjacent

 

Sortie

L’étape du nuanceur geometry (GS) est capable de sortir plusieurs sommets formant une topologie sélectionnée unique. Les topologies de sortie de nuanceur géométrique disponibles sont tristrip, linestrip et pointlist. Le nombre de primitives émises peut varier librement dans n’importe quel appel du nuanceur géométrique, bien que le nombre maximal de sommets pouvant être émis doit être déclaré statiquement. Les longueurs de bandes émises à partir d’un appel de nuanceur géométrique peuvent être arbitraires et de nouvelles bandes peuvent être créées via la fonction HLSL RestartStrip .

L’exécution d’une instance de nuanceur geometry est atomique à partir d’autres appels, sauf que les données ajoutées aux flux sont série. Les sorties d’un appel donné d’un nuanceur géométrique sont indépendantes d’autres appels (bien que le classement soit respecté). Un nuanceur geometry générant des bandes de triangles démarre une nouvelle bande sur chaque appel.

La sortie du nuanceur geometry peut être alimentée à l’étape de rastériseur et/ou à une mémoire tampon de vertex en mémoire via l’étape de sortie de flux. La sortie alimentée en mémoire est développée en listes de points/lignes/triangles individuels (exactement comme elles seraient passées au rastériseur).

Un nuanceur geometry génère des données d’un sommet à la fois en ajoutant des sommets à un objet de flux de sortie. La topologie des flux est déterminée par une déclaration fixe, en choisissant un TriangleStream, LineStream et PointStream comme sortie pour l’étape GS.

Il existe trois types d’objets de flux disponibles : TriangleStream, LineStream et PointStream, qui sont tous des objets de modèle. La topologie de la sortie est déterminée par leur type d’objet respectif, tandis que le format des sommets ajoutés au flux est déterminé par le type de modèle.

Lorsqu’une sortie du nuanceur géométrique est identifiée comme une valeur interprétée par le système (par exemple, SV_RenderTargetArrayIndex ou SV_Position), le matériel examine ces données et effectue un comportement dépendant de la valeur, en plus de pouvoir passer les données à l’étape suivante du nuanceur pour l’entrée. Lorsqu’une telle sortie de données du nuanceur géométrique a une signification pour le matériel par primitive (par exemple, SV_RenderTargetArrayIndex ou SV_ViewportArrayIndex), plutôt que sur une base par vertex (par exemple, SV_ClipDistance[n] ou SV_Position), les données par primitive sont extraites du sommet principal émis pour la primitive.

Les primitives partiellement terminées peuvent être générées par le nuanceur géométrique si le nuanceur géométrique se termine et que la primitive est incomplète. Les primitives incomplètes sont ignorées silencieusement. Cela est similaire à la façon dont l’IA traite les primitives partiellement terminées.

Le nuanceur geometry peut effectuer des opérations de chargement et d’échantillonnage de texture où les dérivés de l’espace écran ne sont pas obligatoires (samplelevel, samplecmplevelzero, samplegrad).

Pipeline graphique