Partager via


Étape Geometry Shader (GS)

La phase de nuanceur de géométrie (GS) traite des primitives entières : triangles, lignes et points, ainsi que leurs sommets adjacents. Il est utile pour les algorithmes tels que l’expansion de sprite de point, les systèmes de particules dynamiques et la génération de volumes d’ombres. Il prend en charge l’amplification géométrique et la dé-amplification.

Objectif et utilisations

L’étape Geometry Shader 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 des sommets adjacents

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

L’étape Geometry Shader (GS) est une étape de nuanceur programmable ; il s’affiche sous la forme d’un bloc arrondi dans le diagramme de pipeline graphique . Cette étape de nuanceur expose ses propres fonctionnalités uniques, basées sur les modèles de nuanceur (voir common-shader core).

La phase geometry shader est bien adaptée aux algorithmes, notamment :

  • Point Sprite Expansion
  • Systèmes de particules dynamiques
  • Génération de fourrures/fin
  • Génération de volumes d’ombres
  • Rendu à cubemap à passage unique
  • Per-Primitive échange de matériaux
  • Per-Primitive Configuration matérielle : 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

La phase Geometry Shader exécute le code de nuanceur spécifié par l’application avec des primitives entières en 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 de géométrie sont les sommets d’une primitive complète (trois sommets pour les triangles, deux sommets pour les lignes ou un seul sommet pour point). Les nuanceurs de géométrie peuvent également apporter les données de vertex pour les primitives adjacentes aux bords en tant qu’entrée (trois autres pour un triangle, deux sommets supplémentaires pour une ligne).

L’étape Geometry Shader peut consommer la SV_PrimitiveID valeur générée par le système qui est générée automatiquement par la phase Assembleur d’entrée (IA). Cela permet d’extraire ou de calculer des données par primitive 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 de géométrie voit comme entrée les données de la primitive appelante, qu’il s’agisse d’un point unique, d’une ligne ou d’un triangle unique. Une bande de triangle à partir de précédemment dans le pipeline entraînerait un appel du nuanceur de géométrie 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 sommet de la primitive individuelle sont disponibles (c’est-à-dire 3 sommets pour un triangle), ainsi que les données de vertex adjacentes, le cas échéant et disponibles.

Abréviations de vertex courantes :

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

 

Sortie

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

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

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

Un nuanceur geometry génère des données 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 TriangleStream, LineStream et PointStream comme sortie pour la phase GS.

Il existe trois types d’objets stream disponibles : TriangleStream, LineStream et PointStream, qui sont tous des objets 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 de nuanceur geometry 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 elles-mêmes à l’étape de nuanceur suivante pour l’entrée. Lorsque ces données sorties du nuanceur geometry ont une signification pour le matériel sur une base par primitive (par exemple , SV_RenderTargetArrayIndex ou SV_ViewportArrayIndex), plutôt que sur une base par sommet (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 de géométrie si le nuanceur de géométrie se termine et que la primitive est incomplète. Les primitives incomplètes sont ignorées en mode silencieux. Cela est similaire à la façon dont l’IA traite les primitives partiellement terminées.

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

Pipeline graphique