Étape du nuanceur geometry
L’étape du nuanceur geometry (GS) exécute le code de nuanceur spécifié par l’application avec des sommets comme entrée et la possibilité de générer des sommets en sortie.
Nuanceur geometry
Contrairement aux nuanceurs de vertex, qui opèrent sur un seul sommet, les entrées du nuanceur géométrique sont les sommets d’une primitive complète (deux sommets pour les lignes, trois sommets pour les triangles 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 (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.
Type | |
---|---|
TV | Sommet de triangle |
AV | Vertex adjacent |
LV | Sommet de 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’IA. Cela permet aux données par primitive d’être extraites ou calculées si vous le souhaitez.
L’étape du nuanceur géométrique est capable de sortir plusieurs sommets formant une topologie sélectionnée (les topologies de sortie de phase GS disponibles sont les suivantes : 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 bande émises à partir d’un appel de nuanceur géométrique peuvent être arbitraires et de nouvelles bandes peuvent être créées via la fonction RestartStrip HLSL.
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).
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 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 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 l’une des 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 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. 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.
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 transmettre les données à l’étape de nuanceur suivante pour l’entrée. Lorsque ces données proviennent du nuanceur géométrique ont 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).
Les algorithmes qui peuvent être implémentés dans le nuanceur geometry sont les suivants :
- 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
- échange de matériaux Per-Primitive
- Per-Primitive Configuration matérielle : y compris 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 un exemple d’interpolation normale d’ordre supérieur, voir Exemple CubeMapGS).
Rubriques connexes