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?
quelle
Antworten:
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:
quelle