Was sind Vertex- und Pixel-Shader?


Antworten:


49

Ein Pixel Shader ist eine GPU-Komponente (Graphic Processing Unit), die so programmiert werden kann, dass sie pro Pixel arbeitet und sich um Dinge wie Beleuchtung und Bump-Mapping kümmert.

Ein Vertex-Shader ist auch eine GPU-Komponente und wird auch mit einer bestimmten Assembler-ähnlichen Sprache wie Pixel-Shadern programmiert. Er ist jedoch an der Szenengeometrie ausgerichtet und kann Objekte wie Cartoony-Silhouette-Kanten usw. hinzufügen.

Keiner ist besser als der andere, jeder hat seine spezifischen Verwendungszwecke. Die meisten modernen Grafikkarten, die DirectX 9 oder besser unterstützen, bieten diese Funktionen.

Es gibt mehrere Ressourcen im Web, um besser zu verstehen, wie diese Dinge verwendet werden. Insbesondere NVidia und ATI sind gute Ressourcen für Dokumente zu diesem Thema.


14
Shader werden auch in höheren Sprachen (ohne Assemblierung) wie Cg, HLSL und GLSL geschrieben.
Walt Ritscher

67

DirectX 10 und OpenGL 3 führten den Geometry Shader als dritten Typ ein.

Beim Rendern der Pipeline-Reihenfolge -

Vertex Shader - Nimmt einen einzelnen Punkt und kann ihn anpassen. Kann verwendet werden, um komplexe ** Vertex-Beleuchtungsberechnungen als Setup für die nächste Stufe zu berechnen und / oder die Punkte zu verzerren (Wackeln, Skalieren usw.).

Jedes resultierende Grundelement wird an das übergeben

Geometry Shader - Nimmt jedes transformierte Grundelement (Dreieck usw.) und kann Berechnungen daran durchführen. Dadurch können neue Punkte hinzugefügt, entfernt oder nach Bedarf verschoben werden. Dies kann verwendet werden, um Detailebenen dynamisch zu einem einzelnen Basisnetz hinzuzufügen oder daraus zu entfernen, mathematische Netze basierend auf einem Punkt (für komplexe Partikelsysteme) und anderen ähnlichen Aufgaben zu erstellen.

Jedes resultierende Grundelement wird in die Scanlinie konvertiert und jedes Pixel, das die Spanne abdeckt, wird durch die durchlaufen

Pixel Shader (Fragment Shader in OpenGL) - Berechnet die Farbe eines Pixels auf dem Bildschirm basierend auf dem, was der Vertex Shader übergibt, gebundenen Texturen und vom Benutzer hinzugefügten Daten. Dies kann den aktuellen Bildschirm überhaupt nicht lesen. Ermitteln Sie einfach, welche Farbe / Transparenz dieses Pixel für das aktuelle Grundelement haben soll.

Diese Pixel werden dann in den aktuellen Zeichenpuffer (Bildschirm, Backbuffer, Render-to-Texture, was auch immer) eingefügt.

Alle Shader können auf globale Daten wie die Weltbildmatrix zugreifen, und der Entwickler kann einfache Variablen übergeben, die sie für die Beleuchtung oder andere Zwecke verwenden können. Shader werden in einer Assembler-ähnlichen Sprache verarbeitet, aber moderne DirectX- und OpenGL-Versionen verfügen über C-ähnliche Sprachcompiler auf hoher Ebene, die als HLSL bzw. GLSL bezeichnet werden. NVidia hat auch einen Shader-Compiler namens CG, der auf beiden APIs funktioniert.

[bearbeitet, um die falsche Reihenfolge wiederzugeben, die ich zuvor hatte (Geometrie-> Scheitelpunkt-> Pixel), wie in einem Kommentar angegeben.]

In DirectX 11 werden jetzt 3 neue Shader für die Tessellation verwendet. Die neue vollständige Shader-Reihenfolge lautet Vertex-> Hull-> Tessellation-> Domain-> Geometry-> Pixel. Ich habe diese neuen noch nicht verwendet, fühle mich also nicht qualifiziert, sie genau zu beschreiben.


2
Ihre Rendering-Pipeline ist falsch. Die Scheitelpunkte werden zuerst im Scheitelpunkt-Shader verarbeitet, und dann durchlaufen die Grundelemente, aus denen sie bestehen, den Geometrie-Shader. Ich frage mich, warum sich noch niemand über diese falsche Reihenfolge beschwert hat.
Christian Rau

2
Der Tessellation-Shader besteht aus dem Hull-Shader und dem Domain-Shader . Die Zwischenstufe Tessellator ist nicht programmierbar. Es gibt also nur zwei zusätzliche Shader. Die GL-Äquivalente wären Tessellationskontrolle und Tessellationsbewertung .
Christian Rau

12

Vertex- und Pixel-Shader bieten unterschiedliche Funktionen innerhalb der Grafikpipeline. Vertex-Shader erfassen und verarbeiten vertexbezogene Daten (Positionen, Normalen, Texcoords).

Pixel-Shader (oder genauer Fragment-Shader) verwenden Werte, die aus den im Vertex-Shader verarbeiteten Werten interpoliert wurden, und generieren Pixelfragmente. Das meiste "coole" Zeug wird in Pixel-Shadern gemacht. Hier finden Dinge wie Textur-Lookup und Beleuchtung statt.


6

DirectX-spezifisch:

Shader:

Satz von Programmen, die zusätzliche grafische Funktionen zu den Objekten implementieren, die nicht in der festen Rendering-Pipeline definiert sind. Aus diesem Grund können wir unsere eigenen grafischen Effekte entsprechend unseren Anforderungen erzielen - dh wir sind nicht mehr auf vordefinierte „feste“ Operationen beschränkt.

HLSL: (High-Level Shading Language):

HLSL ist eine Programmiersprache wie C ++, mit der Shader (Pixel Shaders / Vertex Shaders) implementiert werden.

Vertex Shader:

Ein Vertex-Shader ist ein Programm, das auf der GPU der Grafikkarte ausgeführt wird und auf jedem Vertex einzeln ausgeführt wird. Dies erleichtert es uns, unseren eigenen benutzerdefinierten Algorithmus zu schreiben, um mit den Scheitelpunkten zu arbeiten.

Pixel Shader:

Ein Pixel-Shader ist ein Programm, das während des Rasterungsprozesses für jedes Pixel auf der GPU der Grafikkarte ausgeführt wird. Es gibt uns die Möglichkeit, direkt auf einzelne Pixel zuzugreifen / diese zu bearbeiten. Dieser direkte Zugriff auf Pixel ermöglicht es uns, eine Vielzahl von Spezialeffekten zu erzielen, z. B. Multitexturierung, Beleuchtung pro Pixel, Schärfentiefe, Wolkensimulation, Feuersimulation und ausgefeilte Abschattungstechniken.

Hinweis: Sowohl Vertex-Shader als auch Pixel-Shader (Programme) sollten vor der Verwendung mit einer bestimmten Version des Compilers kompiliert werden. Die Kompilierung kann wie das Aufrufen einer API mit den erforderlichen Parametern wie Dateiname, Haupteingabefunktion usw. erfolgen.


4

In Bezug auf die Entwicklung ist ein Pixel-Shader ein kleines Programm, das jedes Pixel einzeln bearbeitet, ähnlich wie ein Vertex-Shader jeden Vertex einzeln bearbeitet.

Diese können verwendet werden, um Spezialeffekte, Schatten, Beleuchtung usw. zu erzeugen.

Da jedes Pixel / Vertex einzeln bearbeitet wird, eignen sich diese Shader für die hochparallele Architektur moderner Grafikprozessoren.


0

Früher gab es eine Flash-Demo, in der die Belichtungsebenen aus der Nähe des Betrachters bis zum Abstand der Reflexion dargestellt wurden. Dies repräsentiert Betrachtungsebenen der Entfernung des reflektierten Lichts zurück zum Betrachter durch jede andere Ebene auf seinem Weg. Alles auf diesen Ebenen kann unverändert verwendet oder in einem parametrisierten Datenwert verwendet werden, um das zurückkehrende Licht oder die Farbe zu ändern. Dies ist die einfachste Erklärung, die Sie sehen werden. Ich wünschte, die Flash-Demo wäre noch ausführbar, aber aus Sicherheitsgründen nicht mehr. Tatsächlich könnte jeder Körper, der einen 3D-Shader einrichten würde, der x vertikale Ebenen entlang der Z-Achse zeigt und die Interaktion mit diesen Ebenen zeigt, sehr schnell berühmt werden. Die Ansicht könnte in einem Winkel gezeigt werden, wie eine Konzeptansicht gezeigt würde, so dass die Dissektion offensichtlich war. Mit anderen Worten, die Ansicht wäre ein Winkelquerschnitt dessen, was die Pipeline sieht und was der Betrachter sieht. In der Tat könnte dies dazu führen, dass jemand wirklich gut bezahlt wird, wenn dieser Shader als Shader-Kreation verwendet wird, bei der der Entwickler nur die erforderlichen Ebenen adhoc in die Z-Achse einfügt. Ein seitliches Sichtfenster würde die Renderergebnisse anzeigen. Ich mache Millionäre.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.