Wofür werden Hull-, Domain- und Geometry-Shader verwendet?

21

Ich habe meinen Teil der 3D-Spieleprogrammierung für meinen (ehemaligen) Arbeitgeber erledigt und auch in meinen eigenen benutzerdefinierten Engines für meine eigenen Indie-Spiele.

Anfänglich habe ich mit Direct3D 9 und D3DX9 angefangen, was so ziemlich alles für mich getan hat, und ich musste überhaupt nicht an Shader denken.

Danach habe ich meine ersten Direct3D 9-Shader geschrieben, aber meistens einen sehr einfachen Shader für alles verwendet, was ich getan habe.

In der letzten Iteration meiner Spiel-Engine bin ich auf Direct3D 11 umgestiegen und habe damit viele Shader erstellt. Ich habe GPU-Skinning durchgeführt, GPU-berechnete Partikel, viele Beleuchtungs- und Nachbearbeitungseffekte, alles in der GPU. Wirklich cooles Zeug.

Bisher habe ich nur Vertex- und Pixel / Fragment-Shader verwendet. Obwohl es noch viele Dinge gibt, die ich noch nicht getan habe, glaube ich, dass ich genau weiß, was die Vertex- und Pixel / Fragment-Shader tun und wie das alles in die gesamte 3D-Pipeline passt.

Aufgrund der jüngsten Entwicklungen habe ich mich sehr für die neueren Shader-Stufen interessiert. Das heißt, der Geometry Shader und noch neuer die Hull- und Domain-Shader.

Ich habe diese Stufen noch nie verwendet. Soweit ich weiß, wird der Geometry-Shader, sofern aktiviert, nach dem Vertex-Shader einmal für jeden transformierten Vertex (oder einmal pro Grundelement?) Ausgeführt und ermöglicht es Ihnen, Vertices (und Grundelemente?) Zu verwerfen. , und erstelle neue (die ich schätze gehen an den Anfang der Pipeline zurück?).

Ich vermute, dass der Geometrie-Shader hauptsächlich zum programmgesteuerten Generieren von Geometrie in der GPU verwendet wird. Eine gebräuchliche Verwendung wäre es, Billboard-Quads basierend auf einem einzelnen Vertex zu erstellen, aber ich visualisiere nicht wirklich viele andere häufige Szenarien, abgesehen von der Erzeugung von Fraktalen und anderem Material, das Sie zu 100% programmgesteuert erzeugen können.

Bei den Shadern "Hull" und "Domain" scheint es, als hätten sie etwas mit Tessellation zu tun (aus rauen Oberflächen glattere Oberflächen erstellen?) Und müssen zusammen oder überhaupt nicht verwendet werden. Der Begriff "Patch" scheint auch hier gebräuchlich zu sein.

Würde mir jemand erklären wollen, wozu diese neuen Shader-Stufen dienen, wie sie in die 3D-Pipeline passen und in welchen Fällen sollte ich sie in Betracht ziehen?

Panda-Pyjama
quelle
Ich denke, Sie fragen auf die falsche Art und Weise - anstatt "wofür werden sie verwendet", sollten Sie sich die Frage stellen, was sie tun. Wenn Sie die gegebenen Ressourcen (und ihre Konzepte unter der Haube) verstehen, ist nur der Himmel begrenzt, was Sie sind tatsächlich in der Lage, mit ihnen zu tun.
Wondra
@wondra: Es ist fast dieselbe Frage, aber ich möchte mich eher auf praktische Anwendungsbeispiele konzentrieren als auf die theoretische Erklärung dessen, was sie tun. Tatsächlich gibt es eine Übersicht über die MSDN, die ich oft gelesen habe, aber immer noch nicht verstehe, was sie für mich tun können. Ich bin ein intelligentes Wesen, und ich kann A und B verbinden und daraus C, D, E und F herausfinden.
Panda Pyjama
Ich weiß nicht, "praktische Anwendungsbeispiele" scheinen mir ein bisschen umfassend zu sein. Ich habe es zwar versucht, aber vor diesem Kommentar konzentriert es sich möglicherweise zu sehr auf "Was machen sie" für Sie.
Josh
@Josh: Benutzt du all diese Stufen in der realen Welt oder hast du sie schon benutzt?
Panda Pyjama
1
Ein FYI für diejenigen, die einen Non-Directx-Hintergrund haben (wie ich). Diese beiden werden in OpenGL und Vulkan als "Tessellation Control Shader" und "Tessellation Evaluation Shader" bezeichnet.
Shahbaz

Antworten:

13

Rumpf & Domains

Die Hull- und Domain-Shader-Stufen sind Teil der Tessellation-Pipeline der GPU. Sie werden im Allgemeinen verwendet, um hochdetaillierte Oberflächengeometrien auf der Grundlage von Eingabeoberflächengeometrien mit niedrigeren Details zu berechnen, die als Dreiecke oder Quads (usw.) definiert sind. Die Eingabeprimitive mit den niedrigeren Details werden als "Patches" bezeichnet, und es ist wichtig zu beachten, dass sie möglicherweise nicht die tatsächliche Geometrie darstellen , die eventuell vorhanden sein wird (obwohl dies möglich ist). Stellen Sie sich eher die Kontrollpunkte einer Bezierkurve vor, mit Ausnahme einer Oberfläche.

Der Hull-Shader nimmt ein Eingabe-Patch und erzeugt ein Ausgabe-Patch (oder Patches; hier würde im Allgemeinen eine Unterteilung des Patches erfolgen). Konstante Metadaten zum Patch können auch im Hull-Shader berechnet und zur Verarbeitung in späteren Phasen der Pipeline ausgegeben werden.

Die Ausgabe des Hull-Shaders durchläuft eine Tessellierungsstufe (mit fester Funktion), die gekachelte, normalisierte Domänen des entsprechenden Typs (z. B. Quads oder Dreiecke) erzeugt.

Der Domain-Shader wird für diese Domains ausgeführt, um die tatsächliche Scheitelpunktposition eines beliebigen Punkts in einer Domain zu berechnen, die sich aus der oben genannten Tessellation ergibt. Der Domain-Shader gibt somit eine Vertex-Position aus.

Die Tessellierungsphase tritt nach der Vertex-Shader-Stufe in der Pipeline auf.

Geometrie-Shader

Geometrie-Shader sind in gewisser Weise wie vereinfachte Hull- / Domain-Shader. Sie nehmen einfach Eingangsscheitelpunkte und erzeugen Ausgangsscheitelpunkte. Für einen bestimmten Eingangsscheitelpunkt können viele Ausgangsscheitelpunkte erzeugt werden, sodass sie zum "Erzeugen von Geometrie" verwendet werden können.

Die Geometrie-Shader-Stufe tritt nach der Vertex-Shader-Stufe und nach der Tesselationsstufe auf.

Verwendet

Der Geometrie-Shader kann in Stream-Ausgabepuffer schreiben, anstatt direkt in die Rasterungs- und Fragment-Shading-Phase der Pipeline eingespeist zu werden. Dies bedeutet effektiv, dass Sie die durch eine Kombination aus Vertex-, Hull-, Domain- und Geometry-Shader-Iteration erzeugte Geometrie erneut durch die Pipeline ausführen können, um zusätzliche Arbeit in einer anderen Vertex-Shader-Phase oder in einer anderen Phase auszuführen.

Wofür Sie diese verwenden können, ist ein ziemlich breites, praktisch unbegrenztes Thema, daher werde ich nicht wirklich versuchen, darauf einzugehen. Einige motivierende Gründe, sie in Betracht zu ziehen ... Das Besondere an diesen Shader-Phasen ist, dass Sie mit ihnen möglicherweise eine ganze Menge zusätzlicher Details erhalten, ohne die Speicher- oder Bandbreitenkosten dafür zu bezahlen. Und auch, um die Verarbeitung von der CPU auf die GPU zu verlagern.

Terrain ist ein gutes Beispiel dafür, wo Sie einige dieser Technologien einsetzen möchten, da Sie diese im Allgemeinen sowohl sehr nah (wenn Ihr Charakter darauf steht) als auch sehr weit entfernt (die Berge in der Ferne) und in der Lage sein müssen Über diese Shader-Stufen können Sie steuern, wo und wie viele Details Sie "on the fly" in die Terrain-Geometrie einfügen. In der Vergangenheit haben die Alternativen entweder zu jeder Zeit konstante Durchschnittskosten für das Terrain gezahlt (ein Ansatz mit dem niedrigsten gemeinsamen Nenner) oder manuell Geometrie-Chunks für unterschiedliche Detaillierungsgrade im und außerhalb des GPU-Speichers ausgelagert, was mühsam und schwierig ist teuer.

Jede ähnliche Situation, in der Sie möglicherweise ein wirklich breites Spektrum an Detaillierungsgraden benötigen, um ein Netz oder Modell zu unterstützen, das auch einigermaßen unterteilbar ist, ist möglicherweise ein Kandidat, um auch mit diesen Shadern etwas Gescheites zu tun. Allerdings lässt sich nicht alles gut auf die Optimierung der Unterteilung der Oberflächenstile übertragen . Sie könnten sie wahrscheinlich auch für Kleidung und Haare verwenden.

Zur weiteren Lektüre, einschließlich weitaus detaillierterer Informationen, als ich sie mir zumutbar merken oder hier ausführen kann:

Josh
quelle
4
Beachten Sie, dass Hull- und Domain-Shader Direct3D Feature Level 11.0 oder höher und Geometrie-Shader Direct3D Feature Level 10.0 oder höher benötigen. Darüber hinaus bieten die meisten Grafikkartendesigns der Geometrie-Shader-Stufe nur sehr wenig bis gar keine dedizierte Hardware, sodass ihr Nutzen in der Praxis weitaus geringer ist, als ursprünglich angenommen.
Chuck Walbourn
@ChuckWalbourn: Ich würde wirklich gerne mehr hören, wenn Sie möchten, in einer separaten Antwort
Panda Pyjama