Freigeben über


Geometrie-Shaderstufe

Die Geometry-Shader-Phase (GS) führt anwendungsspezifischen Shadercode mit Scheitelpunkten als Eingabe und der Möglichkeit aus, Scheitelpunkte bei der Ausgabe zu generieren.

Geometry-Shader

Im Gegensatz zu Vertex-Shadern, die auf einem einzelnen Scheitelpunkt arbeiten, sind die Eingaben des Geometrie-Shaders die Scheitelpunkte für ein vollständiges Grundelement (zwei Scheitelpunkte für Linien, drei Scheitelpunkte für Dreiecke oder einzelne Scheitelpunkte für Punkt). Geometrie-Shader können auch die Scheitelpunktdaten für die randnachfolgenden Grundtypen als Eingabe (zusätzliche zwei Scheitelpunkte für eine Linie, weitere drei für ein Dreieck) einfügen. Die folgende Abbildung zeigt ein Dreieck und eine Linie mit angrenzenden Scheitelpunkten.

Abbildung eines Dreiecks und einer Linie mit angrenzenden Scheitelpunkten

type
TV Dreiecksvertex
AV Angrenzender Scheitelpunkt
LV Linienvertex

 

Die Geometry-Shader-Phase kann den SV_PrimitiveID systemgenerierten Wert nutzen, der automatisch von der IA generiert wird. Dadurch können pro Primitive Daten abgerufen oder bei Bedarf berechnet werden.

Die Geometrie-Shader-Phase kann mehrere Scheitelpunkte ausgeben, die eine einzelne ausgewählte Topologie bilden (verfügbare GS-Phasenausgabetopologien sind: Tristrip, Linienstreifen und Punktliste). Die Anzahl der ausgegebenen Primitiven kann innerhalb jedes Aufrufs 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 Geometrie-Shaderausgabe kann über die Streamausgabephase an die Rasterisierungsstufe und/oder an einen Vertexpuffer im Arbeitsspeicher gefüttert werden. Die Ausgabe, die in den Arbeitsspeicher eingespeist wird, wird auf einzelne Punkt-, Linien-/Dreieckslisten erweitert (genau so, wie sie an den Rasterisierer übergeben werden würden).

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 das aufrufende Primitive, 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 würde der Streifen in eine Dreiecksliste erweitert). Alle Eingabedaten für jeden Scheitelpunkt im einzelnen Grundtyp sind verfügbar (d. h. 3 Scheitelpunkte für Dreiecke), sowie benachbarte Vertexdaten, falls zutreffend/verfügbar.

Ein Geometrie-Shader gibt Daten jeweils einen Scheitelpunkt aus, indem scheitelpunkte an ein Ausgabestreamobjekt angefügt werden. Die Topologie der Datenströme wird durch eine feste Deklaration bestimmt, bei der eine der Folgenden ausgewählt wird: PointStream, LineStream oder TriangleStream als Ausgabe für die GS-Phase. Es stehen drei Arten von Streamobjekten zur Verfügung: PointStream, LineStream und TriangleStream, bei denen es sich um vorlagenbasierte Objekte handelt. Die Topologie der Ausgabe wird durch den jeweiligen Objekttyp bestimmt, während das Format der an den Stream angefügten Scheitelpunkte vom Vorlagentyp bestimmt wird. Die Ausführung eines Geometrie-Shaders instance ist von anderen Aufrufen atomisch, mit der Ausnahme, dass die den Streams hinzugefügten Daten serial sind. Die Ausgaben eines angegebenen Aufrufs eines Geometrie-Shaders sind unabhängig von anderen Aufrufen (obwohl die Reihenfolge beachtet wird). Ein Geometrie-Shader, der Dreiecksstreifen generiert, startet bei jedem Aufruf einen neuen Strip.

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 vom Wert abhängiges Verhalten aus, zusätzlich dazu, dass die Daten selbst für die Eingabe an die nächste Shaderstufe übergeben werden können. Wenn eine solche Datenausgabe aus dem Geometrie-Shader für die Hardware auf basis primitiver Basis (z. B. SV_RenderTargetArrayIndex oder SV_ViewportArrayIndex) und nicht pro Vertex (z. B. SV_ClipDistance[n] oder SV_Position) Bedeutung hat, werden die daten pro Primitiven aus dem führenden Vertex entnommen, der für den Primitiven 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 Primitive werden automatisch verworfen. Dies ähnelt der Art und Weise, wie die IA teilweise abgeschlossene Primitive behandelt.

Der Geometry-Shader kann Last- und Textursamplingsvorgänge ausführen, bei denen keine Bildschirmraumableitungen erforderlich sind (samplelevel, samplecmplevelzero, samplegrad).

Zu den Algorithmen, die im Geometrie-Shader implementiert werden können, gehören:

  • Punkt-Sprite-Erweiterung
  • Dynamische Partikelsysteme
  • Pelz-/Flossengeneration
  • Schattenvolumegenerierung
  • Render-zu-Cube-Karte mit einem einzelnen Pass
  • Per-Primitive Materialaustausch
  • Per-Primitive Materialeinrichtung: Einschließlich der Generierung baryzentrischer Koordinaten als primitive Daten, sodass ein Pixel-Shader benutzerdefinierte Attributinterpolation ausführen kann (ein Beispiel für eine normale Interpolation höherer Ordnung finden Sie unter CubeMapGS-Beispiel).

Grafikpipeline

Pipelinephasen (Direct3D 10)