Partager via


Étape du nuanceur geometry

L’étape geometry-shader (GS) exécute le code de nuanceur spécifié par l’application avec des sommets en entrée et la possibilité de générer des sommets en sortie.

Nuanceur geometry

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 (deux sommets pour les lignes, trois sommets pour les triangles ou un seul vertex pour le point). Les nuanceurs de géométrie peuvent également apporter les données de vertex pour les primitives adjacentes aux bords en entrée (deux sommets supplémentaires pour une ligne, trois autres pour un triangle). L’illustration suivante montre un triangle et une ligne avec des sommets adjacents.

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

Type
TV Sommet triangle
AV Sommet adjacent
LV Vertex de ligne

 

L’étape geometry-shader peut consommer l’SV_PrimitiveID valeur générée par le système qui est générée automatiquement par l’IA. Cela permet d’extraire ou de calculer les données par primitive si vous le souhaitez.

L’étape geometry-shader est capable de sortir plusieurs sommets formant une topologie sélectionnée unique (les topologies de sortie de l’étape GS 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 à partir d’un appel de nuanceur de géométrie peuvent être arbitraires et de nouvelles bandes peuvent être créées via la fonction HLSL RestartStrip .

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 de flux. La sortie alimentée en mémoire est étendue à des listes de points/lignes/triangles individuelles (exactement comme elles seraient passées au rastériseur).

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 en entrée les données de la primitive appelante, qu’il s’agisse d’un point unique, d’une seule ligne ou d’un seul triangle. Une bande de triangles provenant d’un début 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 le triangle), ainsi que les données de vertex adjacentes, le cas échéant/disponibles.

Un nuanceur de géométrie 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 l’une des valeurs suivantes : PointStream, LineStream ou TriangleStream comme sortie pour l’étape GS. Il existe trois types d’objets de flux disponibles : PointStream, LineStream et TriangleStream, qui sont tous des objets avec 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. 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 à chaque appel.

Lorsqu’une sortie de nuanceur géométrique est identifiée en tant que valeur interprétée par le système (par exemple, SV_RenderTargetArrayIndex ou SV_Position), le matériel examine ces données et exécute 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 la sortie de ces données du nuanceur de géométrie a une signification pour le matériel par primitive (par exemple, SV_RenderTargetArrayIndex ou SV_ViewportArrayIndex), plutôt que par sommet (par exemple, SV_ClipDistance[n] ou SV_Position), les données par primitive sont extraites du sommet de début é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 silencieusement. Cela est similaire à la façon dont l’IA traite les primitives partiellement terminées.

Le nuanceur de géométrie peut effectuer des opérations d’échantillonnage de charge et de texture lorsque les dérivés de l’espace d’écran ne sont pas nécessaires (samplelevel, samplecmplevelzero, samplegrad).

Les algorithmes qui peuvent être implémentés dans le nuanceur de géométrie sont les suivants :

  • Extension de sprite de point
  • Systèmes dynamiques de particules
  • Génération de fourrure/fin
  • Génération de volumes d’ombres
  • Rendu à cubemap à passage unique
  • Per-Primitive Échange de matériaux
  • Per-Primitive configuration du matériau : 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 (pour obtenir un exemple d’interpolation normale d’ordre supérieur, consultez l’exemple CubeMapGS).

Graphics Pipeline

Phases de pipeline (Direct3D 10)