Meine Werkzeuge
Namensräume
Varianten

Grafikpipeline

Aus indiedev
Wechseln zu: Navigation, Suche
Hinweis Dieser Artikel wird gerade geschrieben bzw. bearbeitet und erfüllt noch nicht die Qualitätsstandards von indiedev.
Bitte bearbeite diesen Artikel nur, wenn du kleine Fehler korrigieren möchtest oder der Autor bist.


Text wurde mit Genehmigung des Authors übernommen. Quelle: danielmargreiter.com, Artikel "Die Grafikpipeline".

Die zugrunde liegende Grafikpipeline auf der Grafikkarte wird über Grafik-API's wie DirectX oder OpenGL abstrahiert und vom Programmierer genutzt. Bestimmte Stationen der Grafikpipeline wurden als Hardware implementiert, um so mehr Performance zu erlangen. Dabei steht eine bestimmte Shader Version für die Funktionen die zur Verfügung stehen bzw. die sogar programmierbar sind.

Inhaltsverzeichnis

Warum eine Pipeline

Man Teilt ein System in mehrere Schritte einer Pipeline, damit man mehr Performance bekommt. Eine Pipeline ist aber immer nur so schnell, wie das langsamste Glied. In einer Station kann so lange nichts nachgefüllt werden, bis die nachfolgende Station ihre Aufgabe abgeschlossen hat und damit frei wird. Erst zu diesem Zeitpunkt kann die Aufgabe der ersten Station an die nächste übergeben werden. Die erste Station ist nach dieser Übergabe bereits für die nächste Aufgabe frei. Prinzipiell erhält man aber bei einer Pipeline mit n Schritten eine Geschwindigkeitsbeschleunigung vom Faktor n, denn es können mehrere Schritte parallel abgearbeitet werden.

Das Ganze kann man mit einem Fließband, wo Autos produziert werden, vergleichen. Nehmen wir an, dass jede Station ca. eine Minute dauert, bis auf die Autotürmontage, die dauert ca. zwei Minuten. Es kann also nur alle zwei Minuten ein fertiges Auto entstehen, das heißt, die anderen Stationen müssen immer eine Minute ruhen.

Aufbau

Die Grafikpipeline gliedert sich in drei Überbegriffe:

Schema der Grafikpipeline.
Grün: programmierbar
Rot: konfigurierbar

Grafikpipeline.jpg

Die Application Stage

In der Application Stage werden Berechnungen gemacht wie die Kollisionserkennung, Steering Behaviours und AI, die dann ein neurendern zufolge haben. Alle Operationen die auf der CPU laufen, gehören zur Application Stage.

Die Geometry Stage

Die Geometry Stage kann man noch einmal in Subkategorien aufteilen. Folgende Stationen gibt es:

GeometryStage.jpg

Model & View Transformation

In diesem Bereich wird vom Model Space in den World Space umgerechnet und vom World Space in den View Space. Der Model Space ist das Koordinatensystem des Models. Dieses Model muss in Weltkoordinaten umgerechnet werden. Das Ganze rechnet man mittels Matrizen um. Wenn man alles in den World Space übersetzt hat, wird nun alles in den View Space konvertiert. Der View Space hat den Ursprung bei der Kamera.

Vertex Shading (programmierbar)

Hier laufen die selbst programmierten Vertex Shader. Vertex Shader werden auf die einzelnen Vertices eines Meshes angewandt. Ein Beispiel wo der Vertex Shader verwendet wird, wären sogenannte Clothes (Kleidung von Charakteren).

Hull Shading und Domain Shading (programmierbar)

Hull - und Domain Shader werden für Tessellation verwendet. Tessellation und Displacement Mappping machen dann aus Low Poly Objekten „High Poly“ Objekte.

Geometry Shading (programmierbar)

Hier laufen die selbst programmierten Geometry Shader. Hier können neue Primitives (Punkte, Linien oder Dreiecke) hinzugefügt werden. Beispiel wäre hier Parallax Occlusion Mapping POM.

Stream Out (programmierbar)

Der Stream Out ist dazu da, dass man die restlichen Stationen umgehen kann und so an Overhead spart, da man nicht durch die ganzen Pixeloperationen gehen muss, die man eventuell nicht benötigt.

Projection (konfigurierbar)

Es wird bestimmt ob es ein perspektives oder ein paralleles (zb. Orthographisches) Verfahren sein soll. Das perspektive Verfahren sieht so aus, je weiter entfernt ein Objekt ist, desto kleiner wird es. Beim orthographischen Verfahren, ist das Objekt immer gleich groß. Alle Koordinaten werden vom Viewvolume und den darauf angewandten Shadern neu berechnet. Es entsteht ein Unit Cube von -1 bis +1.

Clipping Beispiel mit einem Traingle

Clipping (konfigurierbar)

Hier werden alle Vertices die über den Projectionrand stehen abgeschnitten und es werden am Schnitt neue Vertices gesetzt.

Screen Mapping (nicht beeinflussbar)

Hier wird das Bild an das Ausgabefenster angepasst. Direct3D 9 und die Vorgänger hatten immer [0,0] im Screenmittelpunkt. Seit Direct3D 10 ist die linke obere Ecke [0,0]. Bei OpenGL ist es die linke untere Ecke. XNA basiert auf Direct3D 9. Die Koordinaten gehen von x1 bis x2 und y1 bis y2, wobei x1<x2 und y1<y2.

Rasterize Stage

Auch die Rasterizer Stage hat mehrere Stationen, die wie folgt lauten:

RasterizerStage.jpg

Triangle Setup (nicht beeinflussbar)

Hier werden die Daten für die Dreiecksoberflächen berechnet. Alle Daten kommen von den vorhergehenden Stationen.

Triangle Traversal / Scan Conversion (nicht beeinflussbar)

Traversal Beispiel anhand einer Linie auf einem Pixelraster

Hier wird jeder Pixel, der über die Hälfte von einem Dreieck überdeckt ist, diesem Dreieck zugewiesen. Dabei könnte man einfach alle Pixel durchlaufen und schauen, ob diese im Dreieck liegen, dass würde aber zu viel Zeit kosten. Deshalb zieht man eine Bounding Box, ein theoretisches Viereck, um das Dreieck und prüft nur die Pixel innerhalb des Vierecks, ob sie im Dreieck liegen. Beispiele für Algorithmen zur Findung von Pixeln für eine Linie wäre der midpoint algorithm oder der Bresenham's line algorithm [1].

Pixel Shader (programmierbar)

Hier läuft der selbst programmierte Pixel Shader. Ein Pixel Shader wird auf einzelne Pixel, wie der Name schon sagt, angewandt. Ein Beispiel für einen Pixel Shader wäre Bloom oder Depth of Field.

Merger (konfigurierbar)

Hier werden, wie uns Merger schon sagt, bestimmte Sachen zusammengeführt. Die verschiedenen Farben aus den Shadern und den Buffern werden hier zusammengebracht. Buffer wie der Depth/Z –Buffer, Stencil Buffer oder der Frame/Accumulation Buffer.

Fixed Function Pipeline

Wenn man gar nichts programmieren oder konfigurieren kann, nennt man das eine fixed function pipeline. Es gibt auch heute noch eine Konsole die eine fixed function pipeline besitzt und zwar die Wii.

Weiterführende Links

1. Bresenham's line algorithm in der englischen Wikipedia

Navigation
Tutorials und Artikel
Community Project
Werkzeuge