Freigeben über


Geometryshaderphase (GS)

Die Geometry-Shader-Stufe (GS) verarbeitet ganze Grundtypen: Dreiecke, Linien und Punkte sowie ihre angrenzenden Scheitelpunkte. Es ist nützlich für Algorithmen wie Point Sprite Expansion, Dynamic Particle Systems und Shadow Volume Generation. Es unterstützt geometrieverstärkung und De amplifikation.

Zweck und Verwendung

Die Geometry-Shader-Stufe verarbeitet ganze Grundtypen: Dreiecke (3 Scheitelpunkte mit bis zu 3 angrenzenden Scheitelpunkten), Linien (2 Scheitelpunkte mit bis zu 2 angrenzenden Scheitelpunkten) und Punkt (1 Scheitelpunkt).

Abbildung eines Dreiecks und einer Linie mit angrenzenden Scheitelpunkten

Der Geometry-Shader unterstützt auch eingeschränkte Geometrieverstärkung und De amplifikation. Angesichts eines Eingabegrundtyps kann der Geometry-Shader den Grundtyp verwerfen oder einen oder mehrere neue Grundtypen ausgeben.

Die Geometry-Shaderphase (GS) ist eine programmierbare Shaderstufe; sie wird als abgerundeter Block im Grafikpipelinediagramm angezeigt. Diese Shaderstufe macht ihre eigene einzigartige Funktionalität verfügbar, die auf den Shadermodellen basiert (siehe common-shader core).

Die Geometry-Shader-Stufe eignet sich gut für Algorithmen, darunter:

  • Punkt-Sprite-Erweiterung
  • Dynamische Partikelsysteme
  • Fur/Fin Generation
  • Schattenvolumengenerierung
  • Single Pass Render-to-Cubemap
  • Tausch pro Grundtypmaterial
  • Setup pro Grundtypmaterial – Diese Funktion umfasst die Generierung baryzentrischer Koordinaten als Grundtypdaten, sodass ein Pixelshader eine benutzerdefinierte Attributinterpolation ausführen kann.

Eingabe

Die Geometry-Shader-Stufe führt anwendungsspezifischen Shadercode mit vollständigen Grundtypen als Eingabe und der Möglichkeit zum Generieren von Scheitelpunkten für die Ausgabe aus. Im Gegensatz zu Vertex-Shadern, die auf einem einzelnen Scheitelpunkt arbeiten, sind die Eingaben des Geometrie-Shaders die Scheitelpunkte für einen vollständigen Grundtyp (drei Scheitelpunkte für Dreiecke, zwei Scheitelpunkte für Linien oder einzelner Scheitelpunkt für Punkt). Geometrie-Shader können auch die Vertexdaten für die angrenzenden Grundtypen als Eingabe enthalten (zusätzliche drei für ein Dreieck, zusätzliche zwei Scheitelpunkte für eine Linie).

Die Geometry-Shader-Stufe kann den SV_PrimitiveID vom System generierten Wert nutzen, der automatisch von der Eingabeassemblerphase (Input Assembler, IA) generiert wird. Auf diese Weise können pro Grundtyp daten bei Bedarf abgerufen oder berechnet werden.

Wenn ein Geometrie-Shader aktiv ist, wird er einmal für jeden Grundtyp aufgerufen, der zuvor in der Pipeline übergeben oder generiert wurde. Jeder Aufruf des Geometrie-Shaders sieht als Eingabe der Daten für den aufrufenden Grundtyp, unabhängig davon, ob es sich um einen einzelnen Punkt, eine einzelne Linie oder ein einzelnes Dreieck handelt. Ein Dreiecksstreifen von früher in der Pipeline würde zu einem Aufruf des Geometrie-Shaders für jedes einzelne Dreieck im Streifen führen (als ob der Streifen in eine Dreiecksliste erweitert wurde). Alle Eingabedaten für jeden Scheitelpunkt im einzelnen Grundtyp sind verfügbar (d. h. 3 Scheitelpunkte für ein Dreieck), sowie angrenzende Vertexdaten, falls zutreffend und verfügbar.

Allgemeine Scheitelpunkt-Abkürzungen:

Abkürzung Begriff
TV Dreiecksvertex
LV Linienvertex
AV Angrenzender Scheitelpunkt

 

Ausgabe

Die Geometry-Shaderphase (GS) kann mehrere Scheitelpunkte ausgeben, die eine einzelne ausgewählte Topologie bilden. Verfügbare Geometrie-Shaderausgabetopologien sind Tristrip, Linienstreifen und Zeigerliste. Die Anzahl der ausgegebenen Grundtypen kann in jedem Aufruf des Geometrie-Shaders frei variieren, obwohl die maximale Anzahl von Scheitelpunkten, die ausgegeben werden könnten, statisch deklariert werden muss. Striplängen, die von einem Geometrie-Shaderaufruf ausgegeben werden, können beliebig sein, und neue Strips können über die RestartStrip HLSL-Funktion erstellt werden.

Die Ausführung einer Geometrie-Shaderinstanz ist von anderen Aufrufen atomierend, mit der Ausnahme, dass daten, die den Datenströmen hinzugefügt wurden, serial sind. Die Ausgaben eines bestimmten Aufrufs eines Geometrie-Shaders sind unabhängig von anderen Aufrufen (obwohl die Sortierung beachtet wird). Ein Geometrie-Shader, der Dreiecksstreifen generiert, startet bei jedem Aufruf einen neuen Strip.

Die Geometrie-Shaderausgabe kann in die Rasterizerphase und/oder in einen Vertexpuffer im Arbeitsspeicher über die Datenstromausgabestufe übertragen werden. Die in den Arbeitsspeicher eingespeiste Ausgabe wird auf einzelne Punkt-/Linien-/Dreieckslisten erweitert (genau so, wie sie an den Rasterizer übergeben würden).

Ein Geometrie-Shader gibt Daten jeweils einen Scheitelpunkt aus, indem Scheitelpunkte an ein Ausgabedatenstromobjekt angefügt werden. Die Topologie der Datenströme wird durch eine feste Deklaration bestimmt, wobei ein TriangleStream, LineStream und PointStream als Ausgabe für die GS-Phase ausgewählt werden.

Es stehen drei Arten von Datenstromobjekten zur Verfügung: TriangleStream, LineStream und PointStream, die alle vorlagenbasierten Objekte sind. Die Topologie der Ausgabe wird durch den jeweiligen Objekttyp bestimmt, während das Format der an den Datenstrom angefügten Scheitelpunkte vom Vorlagentyp bestimmt wird.

Wenn eine Geometrie-Shaderausgabe als Vom System interpretierter Wert (z . B. SV_RenderTargetArrayIndex oder SV_Position) identifiziert wird, untersucht die Hardware diese Daten und führt ein Verhalten aus, das vom Wert abhängig ist, zusätzlich dazu, dass die Daten selbst an die nächste Shaderstufe für die Eingabe übergeben werden können. Wenn eine solche Datenausgabe aus dem Geometrie-Shader eine Bedeutung für die Hardware pro Grundtyp hat (z . B. SV_RenderTargetArrayIndex oder SV_ViewportArrayIndex), und nicht auf Vertexbasis (z . B. SV_ClipDistance[n] oder SV_Position), werden die Pro-Grundtyp-Daten aus dem führenden Vertex entnommen, der für den Grundtyp ausgegeben wird.

Teilweise abgeschlossene Grundtypen können vom Geometrie-Shader generiert werden, wenn der Geometrie-Shader endet und der Grundtyp unvollständig ist. Unvollständige Grundtypen werden im Hintergrund verworfen. Dies ähnelt der Behandlung teilweise abgeschlossener Grundtypen durch die IA.

Der Geometrie-Shader kann Lade- und Textursamplingvorgänge ausführen, bei denen Bildschirmraumderivate nicht erforderlich sind (Beispielebene, Samplecmplevelzero, Samplegrad).

Grafikpipeline