Geometry-Shaderphase
Die Geometry-Shaderphase (GS) führt anwendungsspezifischen Shadercode mit Scheitelpunkten als Eingabe aus und kann Bei der Ausgabe Scheitelpunkte generieren. Im Gegensatz zu Vertex-Shadern, die auf einem einzelnen Scheitelpunkt arbeiten, sind die Eingaben des Geometrieshaders die Scheitelpunkte für einen vollständigen Grundtyp (d. a. zwei Scheitelpunkte für Linien, drei Scheitelpunkte für Dreiecke oder ein einzelner Scheitelpunkt für einen Punkt) plus die Vertexdaten für die edge-angrenzenden Grundtypen (also zusätzliche zwei Scheitelpunkte für eine Linie oder zusätzliche drei Scheitelpunkte für ein Dreieck). Die folgende Abbildung zeigt Beispiele für Grundtypen, die in einen Geometry-Shader eingegeben werden.
Eine weitere Eingabe für den Geometry-Shader ist eine primitive ID, die automatisch vom Eingabeassess assembler (IA) generiert wird. Mit einer primitiven ID kann der Geometry-Shader bei Bedarf Daten pro Gesicht abrufen oder berechnen.
Die Geometry-Shaderphase kann mehrere Scheitelpunkte ausgeben, um eine einzelne ausgewählte Topologie zu bilden. Verfügbare GS-Ausgabetopologien sind Tristrip, Linestrip und Pointlist. Die Anzahl der Grundtypen, die ein Geometry-Shader ausgibt, kann variieren, obwohl die maximale Anzahl von Scheitelpunkten, die ein Geometrieshader ausgeben kann, statisch deklariert werden muss. Striplängen, die ein Geometrie-Shader ausgibt, können beliebig sein (es gibt einen Cut-Befehl ).
Die Ausgabe des Geometrieshaders kann an den Rasterizer und an einen Vertexpuffer im Arbeitsspeicher gesendet werden. Die an den Arbeitsspeicher gesendete Ausgabe wird auf einzelne Punkt-, Linien- und Dreieckslisten erweitert (ähnlich wie die Ausgabe an den Rasterizer übergeben wird).
Die Geometry-Shaderphase kann die folgenden Algorithmen implementieren:
Punkt-Sprite-Tessellation: Der Shader akzeptiert einen einzelnen Scheitelpunkt und generiert vier Scheitelpunkte (zwei Ausgabedreiecke), die die vier Ecken eines Quads mit beliebigen Texcoords, Normals und anderen Attributen darstellen.
Breitlinien-Tessellation: Der Shader empfängt zwei Linienvertices (LV0 und LV1) und generiert vier Scheitelpunkte für ein Quad, das eine verbreiterte Linie darstellt. Darüber hinaus kann ein Geometrie-Shader die angrenzenden Linienvertices (AV0 und AV1) verwenden, um eine Entschärfung auf Linienendpunkten durchzuführen.
Pelz-/Fin-Generierung: Rendern mehrerer Offsets potenziell mit unterschiedlichen Texturen (extrudierte Gesichter), um die parallaktischen Effekte von Pelz zu simulieren. Fins sind extrudierte Kanten, die oft ausblenden, wenn der Winkel nicht schräg ist. Flossen werden verwendet, um Objekte in schrägen Winkeln besser aussehen zu lassen.
Schattenvolumegenerierung: Adjacency-Informationen, die verwendet werden, um zu bestimmen, ob extrudiert werden soll.
Single Pass Rendering to Multiple Texture Cube Faces(Single Pass Rendering to Multiple Texture Cube Faces): Primitive werden sechsmal projiziert und an einen Pixelshader ausgegeben. Jeder Grundtyp wird von einem Renderzielarrayindex begleitet, der ein Cubegesicht auswählt.
Richten Sie baryzentrische Koordinaten als primitive Daten ein, damit der Pixelshader benutzerdefinierte Attributinterpolation durchführen kann.
Ein pathologischer Fall: Eine Anwendung generiert eine Geometrie, dann n-Patches für diese Geometrie und extrudiert dann Schattenvolumen aus dieser Geometrie. In solchen Fällen ist multidurchlauf die Lösung mit der Möglichkeit, Vertex- und Primitivedaten in einen Stream auszugeben und die Daten zurückzugeben.
Da jeder Aufruf des Geometrie-Shaders eine unterschiedliche Anzahl von Ausgaben erzeugen kann, sind parallele Hardwareaufrufe in dieser Phase schwieriger als bei paralleler Ausführung anderer Pipelinephasen (z. B. Vertex- oder Pixelshaderphasen). Während Hardwareimplementierungen Geometrie-Shaderaufrufe parallel ausführen, bedeutet die komplexe Pufferung, die erforderlich ist, um parallele Geometrie-Shaderaufrufe auszuführen, dass Anwendungen nicht verlangen sollten, dass die in der Geometrie-Shaderphase erreichbare Parallelitätsebene nicht so groß sein sollte wie bei anderen Pipelinephasen. Anders ausgedrückt: Der Geometry-Shader kann abhängig von der Programmlast des Geometry-Shaders zu einem Engpass in der Pipeline werden. Das Ziel ist jedoch, dass Algorithmen, die die Funktion des Geometrieshaders verwenden, immer noch effizienter ausgeführt werden als die Anwendung, die das Verhalten auf Hardware emulieren muss, die keine Geometrie programmgesteuert generieren kann.
Die Direct3D-Runtime ruft die folgenden Treiberfunktionen auf, um den Geometrieshader zu erstellen, einzurichten und zu zerstören: