web-dev-qa-db-de.com

Vertex Shader gegen Fragment Shader

Ich habe einige Tutorials zu Cg gelesen, aber eines ist mir nicht ganz klar. Was genau ist der Unterschied zwischen Vertex- und Fragment-Shadern? Und für welche Situationen ist eine besser geeignet als die andere?

101
adivasile

Ein Fragment-Shader entspricht dem Pixel-Shader.

Ein Hauptunterschied besteht darin, dass ein Vertex-Shader die Attribute von Vertices manipulieren kann. Welches sind die Eckpunkte Ihrer Polygone?.

Der Fragment-Shader dagegen sorgt dafür, wie die Pixel zwischen den Eckpunkten aussehen. Sie werden nach bestimmten Regeln zwischen den definierten Eckpunkten interpoliert.

Beispiel: Wenn Ihr Polygon vollständig rot sein soll, definieren Sie alle Scheitelpunkte rot. Wenn Sie bestimmte Effekte wie einen Farbverlauf zwischen den Scheitelpunkten erzielen möchten, müssen Sie dies im Fragment-Shader tun.

Anders ausgedrückt:

Der Vertex-Shader ist Teil der frühen Schritte in der Grafik-Pipeline, irgendwo zwischen Modellkoordinatentransformation und Polygon-Clipping, denke ich. Zu diesem Zeitpunkt ist noch nichts wirklich getan.

Der Fragment/Pixel-Shader ist jedoch Teil des Rasterschritts, bei dem das Bild berechnet und die Pixel zwischen den Scheitelpunkten ausgefüllt oder "eingefärbt" werden.

Lesen Sie hier über die Grafikpipeline und alles wird sich zeigen: http://en.wikipedia.org/wiki/Graphics_pipeline

174
The Surrican

Der Vertex-Shader wird für jeden Vertex ausgeführt, während der Fragment-Shader für jedes Pixel ausgeführt wird. Der Fragment-Shader wird nach dem Vertex-Shader angewendet. Weitere Informationen zur GPU-Pipeline des Shaders Linktext

28
BЈовић

Nvidia Cg Tutorial :

Die Vertex-Transformation ist die erste Verarbeitungsstufe in der Grafikhardware-Pipeline. Die Scheitelpunkttransformation führt eine Folge von mathematischen Operationen für jeden Scheitelpunkt aus. Diese Operationen umfassen das Transformieren der Scheitelpunktposition in eine Bildschirmposition zur Verwendung durch den Rasterizer, das Erzeugen von Texturkoordinaten zur Texturierung und das Beleuchten des Scheitelpunkts zur Bestimmung seiner Farbe.

Das Ergebnis der Rasterisierung sind eine Reihe von Pixelpositionen sowie eine Reihe von Fragmenten. Es gibt keine Beziehung zwischen der Anzahl der Eckpunkte eines Grundelements und der Anzahl der Fragmente, die beim Rastern generiert werden. Zum Beispiel könnte ein Dreieck aus nur drei Eckpunkten den gesamten Bildschirm einnehmen und so Millionen von Fragmenten erzeugen!

Zuvor haben wir Sie gebeten, sich ein Fragment als Pixel vorzustellen, wenn Sie nicht genau wussten, was ein Fragment ist. An diesem Punkt wird jedoch die Unterscheidung zwischen einem Fragment und einem Pixel wichtig. Der Begriff Pixel steht für "Bildelement". Ein Pixel repräsentiert den Inhalt des Einzelbildpuffers an einem bestimmten Ort, z. B. die Farbe, Tiefe und alle anderen Werte, die diesem Ort zugeordnet sind. Ein Fragment ist der Status, der möglicherweise zum Aktualisieren eines bestimmten Pixels erforderlich ist.

Der Begriff "Fragment" wird verwendet, weil die Rasterisierung jedes geometrische Grundelement, beispielsweise ein Dreieck, in pixelgroße Fragmente für jedes Pixel aufteilt, das das Grundelement abdeckt. Ein Fragment verfügt über eine zugeordnete Pixelposition, einen Tiefenwert und einen Satz interpolierter Parameter, z. B. eine Farbe, eine sekundäre (spiegelnde) Farbe und einen oder mehrere Texturkoordinatensätze. Diese verschiedenen interpolierten Parameter werden von den transformierten Scheitelpunkten abgeleitet, die das bestimmte geometrische Grundelement bilden, das zum Erzeugen der Fragmente verwendet wird. Sie können sich ein Fragment als "potenzielles Pixel" vorstellen. Wenn ein Fragment die verschiedenen Rasterisierungstests besteht (in der Phase der Rasteroperationen, die kurz beschrieben wird), aktualisiert das Fragment ein Pixel im Einzelbildpuffer.

20
user242564

Vertex-Shader und Fragment-Shader sind beide Features der 3D-Implementierung, bei denen kein Rendering mit fester Pipeline verwendet wird. In jedem 3D-Rendering werden Vertex-Shader vor Fragment-/Pixel-Shader angewendet.

Der Scheitelpunkt-Shader wird für jeden Scheitelpunkt ausgeführt. Wenn Sie ein festes Polygonnetz haben und es in einem Shader deformieren möchten, müssen Sie es in einem Vertex-Shader implementieren. Das heißt Jede physikalische Änderung der Vertex-Darstellung kann in Vertex-Shadern vorgenommen werden.

Der Fragment-Shader übernimmt die Ausgabe des Scheitelpunkt-Shaders und ordnet Farben, Tiefenwerte eines Pixels usw. zu. Nach diesen Vorgängen wird das Fragment zur Anzeige auf dem Bildschirm an den Framebuffer gesendet.

Einige Operationen, wie zum Beispiel die Beleuchtungsberechnung, können sowohl im Vertex-Shader als auch im Fragment-Shader ausgeführt werden. Der Fragment-Shader liefert jedoch bessere Ergebnisse als der Vertex-Shader.

5
user2439483

Beim Rendern von Bildern über 3D-Hardware verfügen Sie normalerweise über ein Netz (Punkte, Polygone, Linien), das durch Scheitelpunkte definiert wird. Mit Vertex-Shadern können Sie Scheitelpunkte individuell für Bewegungen in einem Modell oder Wellen in einem Ozean bearbeiten. Diesen Scheitelpunkten kann eine statische Farbe oder eine durch Texturen zugewiesene Farbe zugewiesen werden, um die Scheitelpunktfarben mithilfe von Fragment-Shadern zu bearbeiten. Am Ende der Pipeline, wenn die Ansicht zum Bildschirm wechselt, können Sie auch Fragment-Shader verwenden.

3
whatnick