Frage zur Grafik-Pipeline
-
Hoi!
Ich muss morgen eine Vortrag über GPU-Computing halten und gehe davor auch auf die Grafik-Pipeline ein.
Früher war es ja Standard dass die Grafik-Pipeline fixed implementiert war.
Aber wie sieht es jetzt aus? Ist es 100% richtig, dass die Grafikpipeline heutzutage komplett frei über einen Pool an GPU-Kernel/Shadern implementiert ist und und sich jeder Teil der Grafikkarte auch für grafikfremde Berechnungen nutzen lässt?
Oder ist der Ablauf der Grafikpipeline immer noch teilweise fest eingelötet und die Freiheit des Programmieres beschränkt sich auf Vertex-/Pixel/Geometrieshader?
Danke und Grüße,
Ethon
-
Der Weg zum fertigen Bild ist immer noch der gleiche: erst Geometrie, dann Rasterisierung. Welche Shadereinheiten dafuer benutzt werden, ist fuer den Programmierer transparent.
Vertex-/Pixel/Geometrieshader
Welche anderen Shader willst du denn haben?
-
Naja, es geht mir einfach nur darum ob heutzutage noch Teile der Grafikpipeline fest verdrahtet sind oder ob sich wirklich alles für sonstige Berechnungen nutzen lässt.
-
Ist es 100% richtig, dass die Grafikpipeline heutzutage komplett frei über einen Pool an GPU-Kernel/Shadern implementiert ist
Nein!
Die Verrasterung ist nicht frei programmierbar.Genausowenig wie die perspektivische Projektion an sich. Allerdings läßt sich hierbei die Projektionsmatrix die diese definiert frei selbst im Vertexshader programmieren.
Früher bei der festen Grafikpipeline sah es so aus:
Grafikelemente-> Transformation-> (feste)Beleuchtung die über pararmeter beeinflußt werden konnte->Clipping und Projektion -> verrasterung und Sichtbarkeitsberechnung
Heute etwa so: http://wiki.delphigl.com/index.php/Shader
Hier sind die mit einem roten Kasten versehenen Elemente programmierbar.
(Wobei ich mir beim TransformFeedback unsicher bin, in wieweit das in dem Geometrieshader programmiert werden kann)Außerdem gibt es ganz neu zusätzlich den programmierbaren Tesselation Shader.
Edit: Auch die Window-Viewport-Transformation ist nicht frei programmierbar.
(Nicht zu verwechseln mit der Modell- und Projektionsmatrix die frei programmierbar sind)Edit2:
Auch das Clipping ist nicht frei programmierbar.Wie das aber intern gelößt ist weiß ich nicht. Es könnte sein, dass die nicht frei programmierbaren Teile ebenfals nur als Software vorliegen die von GPU Kernen abgearbeitet werden. Womit die "Rechenkraft" dieser Teile dann doch für General Purpose GPU Programming genutzt werden könnte.
Versucht man aber sonstige Berechnungen mit der aktuellen Grafikpipeline zu machen (verwendet also z.B OpenGL oder DirektX) und keine General Purpose GPU Programming (OpenCL) kommt man an die genannten Teile der Grafikpipeline nicht ran.Die größte Freiheit bietet aber General Purpose GPU Programming (z.B. OpenCL).
Bei der als Ergebnis der Berechnung keine Bilder entstehen und die Grafikpipeline einfach nicht mehr vorhanden ist.
(Hiermit könnte man theoretisch alles nachbauen auch die Verrasterung, clipping, Window-Viewport-Transformation oder die Steuerung einer Waschmaschine usw.)
-
Folie 53 von http://http.download.nvidia.com/developer/cuda/seminar/TDCI_Arch.pdf ist eine gute Übersicht, auch wenn es wegen der fehlenden Tesslation nicht mehr ganz up to date ist. Und zumindest zu der Texturverarbeitung hatte ich mal gelesen, dass auch die aktuellen NVidia Grafikkarten da noch spezialisierte, nicht programmierbare Einheiten für haben. Ich denke aber da wird noch einiges mehr in spezialisierten Einheiten gemacht.
-
ein paar pipeline zeichnungen
http://msdn.microsoft.com/en-us/library/windows/hardware/ff569022(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ff476340(v=vs.85).aspxfest verdrahtet ist
- input assembly
- triangle-setup/culling
- rasterizer
- texture units/sampler
- tessellator
- output merger/ropprogrammierbar ist
-vertexshader
-hullshader
-domainshader
-geometryshader
-pixelshader(computeshader, was aber eine alternative 'pipeline' ist)
-
Vielen Dank für die Antworten!