Was macht ein Pixelshader eigentlich?

8

Ich bin relativ neu in der Grafikprogrammierung, und ich habe gerade einige Bücher gelesen und durch Tutorials gescannt, also bitte verzeiht mir, wenn das eine dumme Frage ist.

Ich habe die Grundlagen von directx11 und jetzt möchte ich Spaß haben. also habe ich natürlich viel in die Shader-Pipeline gelesen und bin schon fasziniert. Die Idee, ein einfaches, winziges Stück Code zu schreiben, das effizient genug sein muss, um vielleicht Zehntausende Male alle 60 Sekunden zu laufen, ohne Ressourcen zu verschwenden, hat mich in Eile, das Konzept zu verstehen, bevor ich fortfahre und möglicherweise Unordnung mache von Sachen. Woran ich Probleme habe, ist zu begreifen, was der Pixel-Shader tatsächlich macht.

Vertex-Shader sind einfach zu verstehen, Sie organisieren die Scheitelpunkte eines Objekts in einheitlichen Datenstrukturen, die Informationen über ihn verknüpfen, wie Positions- und Texturkoordinaten, und dann jeden Scheitelpunkt in den Shader, um von 3d in 2d konvertiert zu werden von Transformationsmatrizen. Solange ich es verstehe, kann ich herausfinden, wie man es programmiert.

Aber ich bekomme keine Pixelshader. Was ich bekomme, ist, dass die Ausgabe des Vertex-Shaders die Eingabe des Pixel-Shaders ist. Würde das dem Pixel-Shader nicht einfach die 2D-Koordinaten der Eckpunkte des Polygons geben? Was ich verstanden habe, ist, dass der Pixelshader einzelne Pixel empfängt und Berechnungen an ihnen durchführt, um Dinge wie Farbe und Beleuchtung zu bestimmen. Aber wenn das stimmt, welche Pixel dann? der ganze Bildschirm oder nur die Pixel, die innerhalb des transformierten 2d Polygons liegen?

oder habe ich etwas völlig missverstanden?

    
FatalCatharsis 25.06.2012, 16:52
quelle

2 Antworten

10
  

Vertex-Shader sind einfach zu verstehen, Sie organisieren die Scheitelpunkte eines Objekts in einheitlichen Datenstrukturen, die Informationen über ihn verknüpfen, wie Positions- und Texturkoordinaten, und dann jeden Scheitelpunkt in den Shader, um von 3d in 2d konvertiert zu werden von Transformationsmatrizen.

Danach werden Grundelemente (Dreiecke oder Vielfache von Dreiecken) erzeugt und abgeschnitten (in Direct3D 11 ist es tatsächlich etwas komplizierter dank Transformationsfeedback, Geometrieshadern, Tesselation, Sie nennen es ... aber was auch immer es ist Am Ende hast du Dreiecke .

Nun werden Fragmente "generiert", dh ein einzelnes Dreieck wird in kleine Zellen mit einem regelmäßigen Gitter unterteilt, die Ausgabeattribute des Vertex-Shaders werden entsprechend der relativen Position jeder Gitterzelle zu den drei Ecken interpoliert und eine "Aufgabe" "ist für jede kleine Gitterzelle eingerichtet. Jede dieser Zellen ist ein "Fragment" (wenn Mehrfachabtastung verwendet wird, können mehrere Fragmente für ein Pixel vorhanden sein).

Schließlich wird ein kleines Programm über all diese "Aufgaben" ausgeführt, das ist der Pixel-Shader (oder Fragment-Shader).

Er nimmt die interpolierten Vertexattribute und liest optional einheitliche Werte oder Texturen und erzeugt eine Ausgabe (es kann optional auch mehrere Ausgaben erzeugen). Diese Ausgabe des Pixelshaders bezieht sich auf ein Fragment und wird dann entweder verworfen (beispielsweise aufgrund eines Tiefentests) oder mit dem Bildpuffer gemischt. In der Regel werden viele Instanzen desselben Pixel-Shaders gleichzeitig parallel ausgeführt. Dies liegt daran, dass es effizienter und effizienter ist, eine GPU so zu betreiben. Ein Pixel-Shader weiß nichts über die anderen, die gleichzeitig laufen.
Pixel-Shader werden häufig in einer Gruppe ausgeführt (auch "Warp" oder "Wavefront" genannt), und alle Pixel-Shader innerhalb einer Gruppe führen denselben Befehl zur gleichen Zeit aus (auf anderen Daten). Dies wiederum ermöglicht es, leistungsfähigere Chips zu bauen, die weniger Energie verbrauchen und billiger sind.



1 Beachten Sie, dass in diesem Fall der Fragment-Shader immer noch nur einmal für jede "Zelle" ausgeführt wird. Multisampling entscheidet nur, ob der berechnete Wert in einem der zusätzlichen "Slots" (Unterabtastungen) höherer Auflösung entsprechend dem (höheren Auflösung) Tiefentest gespeichert wird oder nicht. Für die meisten Pixel auf dem Bildschirm sind alle Unterstichproben identisch. An Kanten werden jedoch nur einige Unterabtastungen mit Nahaufnahmen gefüllt, während andere ihren Wert von einer weiter entfernten "Hintergrund" -Geometrie behalten. Wenn das Multisample-Bild aufgelöst wird (dh in ein "normales" Bild umgewandelt wird), erzeugt die Grafikkarte einen "Mix" (im einfachsten Fall einfach das arithmetische Mittel) dieser Subsamples, was dazu führt, dass alles außer den Kanten herauskommt das gleiche wie üblich und Kanten "geglättet".     
Damon 25.06.2012, 17:34
quelle
2

Ihr Verständnis von Pixelshadern ist korrekt, da es "einzelne Pixel empfängt und Berechnungen an ihnen durchführt, um Dinge wie Farbe und Beleuchtung zu bestimmen."

Die Pixel, die der Shader empfängt, sind die einzelnen, die während der Rasterung des transformierten 2D-Polygons (das Dreieck, um genau zu sein) berechnet wurden. Während also der Vertex-Shader die 3 Punkte des Dreiecks verarbeitet, verarbeitet der Pixel-Shader nacheinander die Pixel, die das Dreieck "ausfüllen".

    
OpenUserX03 25.06.2012 17:32
quelle

Tags und Links