Geometry-Shaderphase
Die Geometrie-Shaderphase (GS) führt anwendungsspezifischen Shadercode mit Scheitelpunkten als Eingabe und der Möglichkeit zum Generieren von Scheitelpunkten für die Ausgabe aus.
Geometrie-Shader
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 (zwei Scheitelpunkte für Linien, drei Scheitelpunkte für Dreiecke oder einzelner Scheitelpunkt für Punkt). Geometrie-Shader können auch die Vertexdaten für die angrenzenden Grundtypen als Eingabe (zusätzliche zwei Scheitelpunkte für eine Linie, eine zusätzliche drei für ein Dreieck) enthalten. Die folgende Abbildung zeigt ein Dreieck und eine Linie mit angrenzenden Scheitelpunkten.
Art | |
---|---|
TV- | Dreiecksvertex |
AV- | Angrenzender Scheitelpunkt |
LV- | Linienvertex |
Die Geometrie-Shader-Stufe kann den vom System generierten wert SV_PrimitiveID , der automatisch von der IA generiert wird, nutzen. Auf diese Weise können pro Grundtyp daten bei Bedarf abgerufen oder berechnet werden.
Die Geometrie-Shader-Stufe kann mehrere Scheitelpunkte ausgeben, die eine einzelne ausgewählte Topologie bilden (verfügbare GS-Phasenausgabetopologien 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 funktion RestartStrip HLSL erstellt werden.
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).
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 Dreiecke), sowie angrenzende Vertexdaten, falls zutreffend/verfügbar.
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 eine von: PointStream, LineStream oder TriangleStream als Ausgabe für die GS-Phase ausgewählt wird. Es gibt drei Arten von Datenstromobjekten, PointStream, LineStream und TriangleStream, 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. 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.
Wenn eine Geometrie-Shaderausgabe als vom System interpretierten Wert (z. B. SV_RenderTargetArrayIndex oder SV_Position) identifiziert wird, untersucht 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).
Algorithmen, die im Geometrie-Shader implementiert werden können, umfassen:
- Punkt-Sprite-Erweiterung
- Dynamische Partikelsysteme
- Fur/Fin Generation
- Schattenvolumengenerierung
- Single Pass Render-to-Cubemap
- Per-Primitive Materialtausch
- Per-Primitive Materialeinrichtung – Einschließlich der Generierung baryzentrischer Koordinaten als Grundtypdaten, sodass ein Pixelshader benutzerdefinierte Attributinterpolation ausführen kann (ein Beispiel für eine normale Interpolation höherer Reihenfolge finden Sie unter CubeMapGS-Beispiel).
Verwandte Themen