Grafikpipeline - Graphics pipeline

In der Computergrafik ist eine Computergrafikpipeline , Renderingpipeline  oder einfach  Grafikpipeline ein konzeptionelles Modell, das beschreibt, welche Schritte ein Grafiksystem ausführen muss, um eine 3D-Szene auf einem 2D-Bildschirm zu  rendern . Sobald ein 3D-Modell erstellt wurde, zum Beispiel in einem Videospiel oder einer anderen 3D-Computeranimation, ist die Grafikpipeline der Prozess, dieses 3D-Modell in das zu verwandeln, was der Computer anzeigt. Da die für diesen Vorgang erforderlichen Schritte von der verwendeten Soft- und Hardware und den gewünschten Anzeigeeigenschaften abhängen, gibt es keine universelle Grafikpipeline, die für alle Fälle geeignet ist. Allerdings GrafikenAnwendungsprogrammierschnittstellen (APIs) wie Direct3D und OpenGL wurden erstellt, um ähnliche Schritte zu vereinheitlichen und die Grafikpipeline eines bestimmten Hardwarebeschleunigers zu steuern . Diese APIs abstrahieren die zugrunde liegende Hardware und halten den Programmierer davon ab, Code zu schreiben, um die Grafikhardwarebeschleuniger ( AMD / Intel / NVIDIA usw.) zu manipulieren .

Das Modell der Grafikpipeline wird normalerweise beim Echtzeit-Rendering verwendet. Häufig werden die meisten Pipeline-Schritte in Hardware implementiert, was spezielle Optimierungen ermöglicht . Der Begriff "Pipeline" wird in ähnlicher Weise wie die Pipeline bei Prozessoren verwendet: Die einzelnen Schritte der Pipeline laufen parallel, solange jeder Schritt das benötigte hat.

Konzept

Die 3D-Pipeline bezieht sich normalerweise auf die gebräuchlichste Form des Computer-3D-Renderings, genannt 3D-Polygon-Rendering , im Gegensatz zu Raytracing und Raycasting . Beim Raycasting entsteht ein Strahl an dem Punkt, an dem sich die Kamera befindet, und wenn dieser Strahl auf eine Oberfläche trifft, werden Farbe und Beleuchtung des Punktes auf der Oberfläche, auf den der Strahl trifft, berechnet. Beim 3D-Polygon-Rendering passiert das Umgekehrte – der Bereich im Blickfeld der Kamera wird berechnet, und dann werden Strahlen von jedem Teil jeder Oberfläche im Blickfeld der Kamera erzeugt und zur Kamera zurückverfolgt.

Struktur

Eine Grafikpipeline kann in drei Hauptteile unterteilt werden: Anwendung, Geometrie und Rasterung.

Grafikpipeline 2 en.svg

Anwendung

Der Anwendungsschritt wird von der Software auf dem Hauptprozessor ( CPU ) ausgeführt. Während des Anwendungsschritts werden bei Bedarf Änderungen an der Szene vorgenommen, beispielsweise durch Benutzerinteraktion mittels Eingabegeräten oder während einer Animation. Die neue Szene mit all ihren Primitiven , meist Dreiecken, Linien und Punkten, wird dann an den nächsten Schritt in der Pipeline übergeben.

In einer modernen Game Engine wie Unity beschäftigt sich der Programmierer fast ausschließlich mit dem Anwendungsschritt und verwendet im Gegensatz zu C oder C++ eine Hochsprache wie C# .

Beispiele für Aufgaben, die typischerweise im Anwendungsschritt ausgeführt werden, sind Kollisionserkennung , Animation, Morphing und Beschleunigungstechniken, die räumliche Unterteilungsschemata wie Quadtrees oder Octrees verwenden . Diese werden auch verwendet, um den zu einem bestimmten Zeitpunkt benötigten Hauptspeicher zu reduzieren. Die "Welt" eines modernen Computerspiels ist viel größer als das, was auf einmal in den Speicher passen könnte.

Geometrie

Der Geometrieschritt (mit Geometriepipeline ), der für den Großteil der Operationen mit Polygonen und deren Eckpunkten (mit Vertexpipeline ) verantwortlich ist, lässt sich in die folgenden fünf Aufgaben unterteilen. Es hängt von der jeweiligen Implementierung ab, wie diese Aufgaben als tatsächliche parallele Pipeline-Schritte organisiert sind.

Geometriepipeline en.svg

Definitionen

Ein Scheitelpunkt (Plural: Scheitelpunkte) ist ein Punkt in der Welt. Viele Punkte werden verwendet, um die Flächen zu verbinden. In Sonderfällen werden Punktwolken direkt gezeichnet, dies ist aber immer noch die Ausnahme.

Ein Dreieck ist das häufigste geometrische Grundelement der Computergrafik. Es wird durch seine drei Scheitelpunkte und einen Normalenvektor definiert - der Normalenvektor dient zur Angabe der Vorderseite des Dreiecks und ist ein Vektor, der senkrecht zur Oberfläche steht. Das Dreieck kann mit einer Farbe oder mit einer Textur versehen werden (Bild „aufgeklebt“). Dreiecke werden gegenüber Rechtecken bevorzugt, da die drei Punkte immer auf einer einzigen Ebene liegen .

Das Weltkoordinatensystem

Das Weltkoordinatensystem ist das Koordinatensystem, in dem die virtuelle Welt erstellt wird. Dies sollte einige Bedingungen erfüllen, damit die folgende Mathematik leicht anwendbar ist:

  • Es muss sich um ein rechtwinkliges kartesisches Koordinatensystem handeln, in dem alle Achsen gleich skaliert sind.

Wie die Einheit des Koordinatensystems definiert wird, bleibt dem Entwickler überlassen. Ob der Einheitsvektor des Systems also in Wirklichkeit einem Meter oder einem Ångström entsprechen soll, hängt von der Anwendung ab.

Beispiel: Wenn wir einen Flugsimulator entwickeln sollen, können wir das Weltkoordinatensystem so wählen, dass der Ursprung in der Erdmitte liegt und die Einheit auf einen Meter eingestellt ist. Um den Bezug zur Realität zu erleichtern, definieren wir außerdem, dass die X-Achse den Äquator auf dem Nullmeridian schneidet und die Z-Achse durch die Pole geht. Bei einem rechtshändigen System verläuft die Y-Achse durch den 90°-Ostmeridian (irgendwo im Indischen Ozean ). Jetzt haben wir ein Koordinatensystem, das jeden Punkt der Erde in dreidimensionalen kartesischen Koordinaten beschreibt . In diesem Koordinatensystem modellieren wir nun die Prinzipien unserer Welt, Berge, Täler und Ozeane.
Hinweis: Neben der Computergeometrie werden für die Erde geografische Koordinaten verwendet , dh Breiten- und Längengrad sowie Höhen über dem Meeresspiegel. Die ungefähre Umrechnung - wenn man nicht berücksichtigt, dass die Erde keine exakte Kugel ist - ist einfach:
mit R=Radius der Erde [6.378.137m], lat=Breite, lang=Länge, hasl=Höhe über dem Meeresspiegel.
Alle folgenden Beispiele gelten für ein rechtshändiges System. Bei einem linkshändigen System müssen die Schilder möglicherweise ausgetauscht werden.

Die in der Szene enthaltenen Objekte (Häuser, Bäume, Autos) werden aus Gründen der einfacheren Modellierung oft in einem eigenen Objektkoordinatensystem (auch Modellkoordinatensystem oder lokales Koordinatensystem genannt) entworfen. Um diesen Objekten Koordinaten im Weltkoordinatensystem bzw. Weltkoordinatensystem der gesamten Szene zuzuordnen, werden die Objektkoordinaten mittels Translation, Rotation oder Skalierung transformiert. Dies geschieht durch Multiplikation der entsprechenden Transformationsmatrizen . Außerdem können aus einem Objekt mehrere unterschiedlich transformierte Kopien gebildet werden, beispielsweise ein Wald aus einem Baum; Diese Technik wird Instanzierung genannt.

Um ein Modell eines Flugzeugs in der Welt zu platzieren, bestimmen wir zunächst vier Matrizen. Da wir im dreidimensionalen Raum arbeiten, benötigen wir für unsere Berechnungen vierdimensionale homogene Matrizen .

Zunächst benötigen wir drei Rotationsmatrizen , nämlich eine für jede der drei Flugzeugachsen (Hochachse, Querachse, Längsachse).

Um die X-Achse (normalerweise als Längsachse im Objektkoordinatensystem definiert)

Um die Y-Achse (normalerweise als Querachse im Objektkoordinatensystem definiert)

Um die Z-Achse (normalerweise als vertikale Achse im Objektkoordinatensystem definiert)

Außerdem verwenden wir eine Übersetzungsmatrix, die das Flugzeug an den gewünschten Punkt in unserer Welt bewegt: .

Anmerkung : Die oben genannten Matrizen werden umgesetzt mit Bezug auf die , die in der Artikelrotationsmatrix . Eine Erklärung dafür finden Sie weiter unten.

Nun könnten wir die Position der Eckpunkte des Flugzeugs in Weltkoordinaten berechnen, indem wir jeden Punkt nacheinander mit diesen vier Matrizen multiplizieren. Da die Multiplikation einer Matrix mit einem Vektor recht aufwendig (zeitaufwendig) ist, geht man meist einen anderen Weg und multipliziert zunächst die vier Matrizen miteinander. Die Multiplikation zweier Matrizen ist noch aufwendiger, muss aber nur einmal für das gesamte Objekt ausgeführt werden. Die Multiplikationen und sind äquivalent. Danach könnte die resultierende Matrix auf die Eckpunkte angewendet werden. In der Praxis wird jedoch die Multiplikation mit den Eckpunkten noch nicht angewendet, sondern zunächst die Kameramatrizen - siehe unten - bestimmt.

Für unser Beispiel von oben muss die Translation allerdings etwas anders bestimmt werden, da die übliche Bedeutung von oben – außer am Nordpol – nicht mit unserer Definition der positiven Z-Achse übereinstimmt und daher das Modell auch gedreht werden muss um den Erdmittelpunkt: Der erste Schritt verschiebt den Ursprung des Modells auf die richtige Höhe über der Erdoberfläche, dann wird es um Breiten- und Längengrad gedreht.

Die Reihenfolge , in der die Matrizen angewandt werden , ist wichtig, weil die Matrixmultiplikation ist nicht kommutativ . Dies gilt auch für die drei Drehungen, wie an einem Beispiel demonstriert: Der Punkt (1, 0, 0) liegt auf der X-Achse, wenn man ihn erst um 90° um die X- und dann um die Y-Achse dreht , landet es auf der Z-Achse (die Drehung um die X-Achse hat keinen Einfluss auf einen Punkt, der sich auf der Achse befindet). Dreht man hingegen zuerst um die Y-Achse und dann um die X-Achse, liegt der resultierende Punkt auf der Y-Achse. Die Reihenfolge selbst ist beliebig, solange sie immer gleich ist. Die Reihenfolge mit x, dann y, dann z (Roll, Nick, Heading) ist oft am intuitivsten, weil die Drehung bewirkt, dass die Himmelsrichtung mit der Richtung der "Nase" übereinstimmt.

Es gibt auch zwei Konventionen, um diese Matrizen zu definieren, je nachdem, ob Sie mit Spaltenvektoren oder Zeilenvektoren arbeiten möchten. Unterschiedliche Grafikbibliotheken haben hier unterschiedliche Präferenzen. OpenGL bevorzugt Spaltenvektoren, DirectX- Zeilenvektoren. Die Entscheidung bestimmt, von welcher Seite die Punktvektoren mit den Transformationsmatrizen multipliziert werden sollen. Für Spaltenvektoren wird die Multiplikation von rechts durchgeführt, dh wobei v out und v in 4x1-Spaltenvektoren sind. Auch die Verkettung der Matrizen erfolgt von rechts nach links, also zB beim ersten Drehen und dann beim Verschieben.

Bei Zeilenvektoren funktioniert dies genau umgekehrt. Die Multiplikation erfolgt nun von links wie bei 1x4-Zeilenvektoren und die Verkettung erfolgt, wenn wir auch erst rotieren und dann verschieben. Die oben gezeigten Matrizen gelten für den zweiten Fall, während diejenigen für Spaltenvektoren transponiert sind. Es gilt die Regel , die bei der Multiplikation mit Vektoren bedeutet, dass Sie die Multiplikationsreihenfolge durch Transponieren der Matrix umschalten können.

Das Interessante an dieser Matrixverkettung ist, dass durch jede solche Transformation ein neues Koordinatensystem definiert wird. Dieser kann beliebig erweitert werden. Beispielsweise kann der Propeller des Flugzeugs ein separates Modell sein, das dann durch Translation an der Flugzeugnase platziert wird. Diese Translation muss lediglich die Verschiebung vom Modellkoordinatensystem zum Propellerkoordinatensystem beschreiben. Um das gesamte Flugzeug zu zeichnen, wird zunächst die Transformationsmatrix für das Flugzeug bestimmt, die Punkte transformiert und dann die Propellermodellmatrix mit der Matrix des Flugzeugs multipliziert und anschließend die Propellerpunkte transformiert.

Die so berechnete Matrix wird auch Weltmatrix genannt . Es muss für jedes Objekt in der Welt vor dem Rendern bestimmt werden. Die Anwendung kann hier Änderungen vornehmen, beispielsweise die Position des Flugzeugs entsprechend der Geschwindigkeit nach jedem Frame ändern.

Kamera-Transformation

Links: Position und Richtung des virtuellen Betrachters (Kamera), wie vom Benutzer definiert. Rechts: Positionierung der Objekte nach der Kameratransformation. Der hellgraue Bereich ist das sichtbare Volumen.

Zusätzlich zu den Objekten definiert die Szene auch eine virtuelle Kamera oder einen virtuellen Betrachter, der die Position und Blickrichtung relativ zu der die Szene gerendert wird, angibt. Die Szene wird so transformiert, dass sich die Kamera im Ursprung befindet und entlang der Z-Achse betrachtet wird. Das resultierende Koordinatensystem wird als Kamerakoordinatensystem bezeichnet und die Transformation wird als Kameratransformation oder Ansichtstransformation bezeichnet .

Die Ansichtsmatrix wird normalerweise aus der Kameraposition, dem Zielpunkt (wo die Kamera schaut) und einem "Aufwärtsvektor" ("aufwärts" vom Blickpunkt des Betrachters) bestimmt. Die ersten drei Hilfsvektoren werden benötigt:
Zaxis = normal(cameraPosition - cameraTarget)
Xaxis = normal(cross(cameraUpVector, Zaxis))
Yaxis = cross(Zaxis, Xaxis )
Mit normal(v) = Normalisierung des Vektors v;
cross(v1, v2) = Kreuzprodukt von v1 und v2.
Zum Schluss die Matrix:
mit dot(v1, v2) = Skalarprodukt von v1 und v2.

Projektion

Der 3D-Projektionsschritt transformiert das Ansichtsvolumen in einen Würfel mit den Eckpunktkoordinaten (-1, -1, 0) und (1, 1, 1); Gelegentlich werden auch andere Zielvolumes verwendet. Dieser Schritt wird Projektion genannt , obwohl er ein Volumen in ein anderes Volumen transformiert, da die resultierenden Z-Koordinaten nicht im Bild gespeichert werden, sondern nur beim Z-Puffern im späteren Rasterungsschritt verwendet werden. In einer perspektivischen Darstellung wird eine Zentralprojektion verwendet. Um die Anzahl der angezeigten Objekte zu begrenzen, werden zwei zusätzliche Clipping-Ebenen verwendet; Das Sehvolumen ist daher ein Pyramidenstumpf ( Frustum ). Die Parallel- oder Orthogonalprojektion wird beispielsweise für technische Darstellungen verwendet, da sie den Vorteil hat, dass alle Parallelen im Objektraum auch im Bildraum parallel sind und die Flächen und Volumina unabhängig vom Abstand zum Betrachter gleich groß sind . Karten verwenden zum Beispiel eine orthogonale Projektion (sog. Orthophoto ), aber Schrägbilder einer Landschaft lassen sich auf diese Weise nicht verwenden - obwohl sie technisch gerendert werden können, wirken sie so verzerrt, dass wir sie nicht verwenden können. Die Formel zur Berechnung einer Perspektiven-Mapping-Matrix lautet:

Mit h = Kinderbett (fieldOfView / 2.0) (Öffnungswinkel der Kamera); w = h / Seitenverhältnis (Seitenverhältnis des Zielbildes); near = Kleinste sichtbare Entfernung; far = Die längste sichtbare Entfernung.

Die Gründe, warum hier der kleinste und der größte Abstand angegeben werden müssen, sind zum einen, dass dieser Abstand geteilt wird, um die Skalierung der Szene zu erreichen (entfernte Objekte sind in einem perspektivischen Bild kleiner als nahe Objekte) , und andererseits die Z-Werte auf den Bereich 0..1 zu skalieren, um den Z-Puffer zu füllen . Dieser Puffer hat oft nur eine Auflösung von 16 Bit, weshalb die Nah- und Fernwerte mit Bedacht gewählt werden sollten. Eine zu große Differenz zwischen dem Nah- und Fernwert führt wegen der geringen Auflösung des Z-Puffers zum sogenannten Z-Fighting . Aus der Formel ist auch ersichtlich, dass der Nahwert nicht 0 sein kann, da dieser Punkt der Fokuspunkt der Projektion ist. An dieser Stelle gibt es kein Bild.

Der Vollständigkeit halber die Formel für die Parallelprojektion (Orthogonalprojektion):

mit w = Breite des Zielwürfels (Maß in Einheiten des Weltkoordinatensystems); H = w / Seitenverhältnis (Seitenverhältnis des Zielbildes); near = Kleinste sichtbare Entfernung; far = Die längste sichtbare Entfernung.

Aus Effizienzgründen werden Kamera und Projektionsmatrix üblicherweise zu einer Transformationsmatrix zusammengefasst, so dass das Kamerakoordinatensystem wegfällt. Die resultierende Matrix ist normalerweise für ein einzelnes Bild gleich, während die Weltmatrix für jedes Objekt anders aussieht. In der Praxis werden daher Ansicht und Projektion vorberechnet, so dass bei der Darstellung lediglich die Weltmatrix angepasst werden muss. Komplexere Transformationen wie Vertex-Blending sind jedoch möglich. Auch frei programmierbare Geometrie-Shader , die die Geometrie verändern, können ausgeführt werden.

Im eigentlichen Rendering-Schritt wird die Weltmatrix * Kameramatrix * Projektionsmatrix berechnet und anschließend auf jeden einzelnen Punkt angewendet. Somit werden die Punkte aller Objekte direkt in das Bildschirmkoordinatensystem übertragen (zumindest fast ist der Wertebereich der Achsen noch -1..1 für den sichtbaren Bereich, siehe Abschnitt "Fenster-Ansichtsfenster-Transformation").

Beleuchtung

Häufig enthält eine Szene Lichtquellen, die an verschiedenen Positionen platziert sind, um die Beleuchtung der Objekte realistischer erscheinen zu lassen. In diesem Fall wird für jeden Scheitelpunkt basierend auf den Lichtquellen und den Materialeigenschaften, die dem entsprechenden Dreieck zugeordnet sind, ein Verstärkungsfaktor für die Textur berechnet. Im späteren Rasterisierungsschritt werden die Scheitelwerte eines Dreiecks über seine Oberfläche interpoliert. Auf alle Flächen wird eine Allgemeinbeleuchtung (Ambientelicht) aufgebracht. Es ist die diffuse und damit richtungsunabhängige Helligkeit der Szene. Die Sonne ist eine gerichtete Lichtquelle, von der angenommen werden kann, dass sie unendlich weit entfernt ist. Die von der Sonne bewirkte Beleuchtung einer Fläche wird durch Bildung des Skalarprodukts des Richtungsvektors aus der Sonne und dem Normalenvektor der Fläche bestimmt. Bei einem negativen Wert ist die Oberfläche der Sonne zugewandt.

Ausschnitt

Abschneiden von Primitiven gegen den Würfel. Das blaue Dreieck wird verworfen, während das orange Dreieck abgeschnitten wird, wodurch zwei neue Scheitelpunkte entstehen
Frustum

Nur die Primitive, die sich innerhalb des visuellen Volumens befinden, müssen tatsächlich gerastert (gezeichnet) werden. Dieses visuelle Volumen wird als das Innere eines Kegelstumpfes definiert , einer Form in Form einer Pyramide mit einer abgeschnittenen Spitze. Primitive, die vollständig außerhalb des visuellen Volumens liegen, werden verworfen; Dies wird als Frustum-Culling bezeichnet . Weitere Culling-Verfahren wie Backface Culling, die die Anzahl der zu berücksichtigenden Primitive reduzieren, können theoretisch in jedem Schritt der Grafikpipeline ausgeführt werden. Primitives , die nur teilweise innerhalb des Würfels sind müssen abgeschnitten gegen den Würfel. Der Vorteil des vorherigen Projektionsschritts besteht darin, dass das Clipping immer gegen den gleichen Würfel erfolgt. Nur die - möglicherweise beschnittenen - Primitive, die sich innerhalb des visuellen Volumens befinden, werden an den letzten Schritt weitergeleitet.

Fenster-Ansichtsfenster-Transformation

Fenster-Ansichtsfenster-Transformation

Um das Bild in einen beliebigen Zielbereich (Viewport) des Bildschirms auszugeben , muss eine weitere Transformation, die Window-Viewport-Transformation , angewendet werden. Dies ist eine Verschiebung, gefolgt von einer Skalierung. Die resultierenden Koordinaten sind die Gerätekoordinaten des Ausgabegeräts. Das Viewport enthält 6 Werte: Höhe und Breite des Fensters in Pixel, die obere linke Ecke des Fensters in Fensterkoordinaten (normalerweise 0, 0) und die minimalen und maximalen Werte für Z (normalerweise 0 und 1).

Formal:
Mit vp=Ansichtsfenster; v=Punkt nach Projektion

Auf moderner Hardware werden die meisten Geometrieberechnungsschritte im Vertex-Shader ausgeführt . Dieser ist im Prinzip frei programmierbar, übernimmt aber in der Regel zumindest die Transformation der Punkte und die Beleuchtungsberechnung. Für die DirectX-Programmierschnittstelle ist ab Version 10 die Verwendung eines benutzerdefinierten Vertex-Shaders notwendig, während ältere Versionen noch über einen Standard-Shader verfügen.

Rasterung

Der Rasterisierungsschritt ist der letzte Schritt vor der Fragment-Shader-Pipeline, mit der alle Grundelemente gerastert werden. Im Rasterisierungsschritt werden diskrete Fragmente aus kontinuierlichen Primitiven erzeugt.

In dieser Phase der Grafikpipeline werden die Gitterpunkte zur besseren Unterscheidung auch als Fragmente bezeichnet. Jedes Fragment entspricht einem Pixel im Bildspeicher und dies entspricht einem Pixel des Bildschirms. Diese können farbig (und ggf. beleuchtet) sein. Weiterhin ist es notwendig, bei überlappenden Polygonen das sichtbare, näher am Betrachter liegende Fragment zu bestimmen. Für diese sogenannte Hidden-Surface-Bestimmung wird üblicherweise ein Z-Puffer verwendet . Die Farbe eines Fragments hängt von der Beleuchtung, Textur und anderen Materialeigenschaften des sichtbaren Grundelements ab und wird häufig unter Verwendung der Dreiecks-Scheitelpunkteigenschaften interpoliert. Sofern verfügbar, wird im Rasterungsschritt für jedes Fragment des Objekts ein Fragment-Shader (auch Pixel-Shader genannt ) ausgeführt. Wenn ein Fragment sichtbar ist, kann es jetzt mit bereits vorhandenen Farbwerten im Bild gemischt werden, wenn Transparenz oder Multisampling verwendet wird. In diesem Schritt werden ein oder mehrere Fragmente zu einem Pixel.

Um zu verhindern, dass der Benutzer die allmähliche Rasterung der Primitive sieht, findet eine doppelte Pufferung statt. Die Rasterung erfolgt in einem speziellen Speicherbereich. Nachdem das Bild vollständig gerastert wurde, wird es in den sichtbaren Bereich des Bildspeichers kopiert.

Invers

Alle verwendeten Matrizen sind nicht singulär und somit invertierbar. Da die Multiplikation zweier nicht singulärer Matrizen eine weitere nicht singuläre Matrix erzeugt, ist auch die gesamte Transformationsmatrix invertierbar. Die Umkehrung ist erforderlich, um Weltkoordinaten aus Bildschirmkoordinaten neu zu berechnen - beispielsweise um aus der Mauszeigerposition das angeklickte Objekt zu bestimmen. Da der Bildschirm und die Maus jedoch nur zwei Dimensionen haben, ist die dritte unbekannt. Dazu wird ein Strahl an der Cursorposition in die Welt projiziert und dann der Schnittpunkt dieses Strahls mit den Polygonen in der Welt bestimmt.

Shader

Es gibt 11 Phasen, jede hier aufgezählt.  Vertex-Shader und 3D-Code sind der Input für Animation und Transformation.  Die zweite Phase ist der Hüllen-Shader, die Tesselation und der Domänen-Shader.  Die dritte Phase ist der Geometrie-Shader.  Die vierte Phase ist die Perspektiventransformation.  Die fünfte Phase ist das Clipping und Backface Culling.  Die sechste Phase ist die Dreiecksrasterung, die Texturkoordinaten ausgibt.  Die siebte Phase, Texturcache, startet separat und nimmt Texturen als Eingabe.  Die siebte Phase und die Texturkoordinaten gehen in die 8. Phase, die Texturfilterung.  Von der 6. Phase und der Ausgabe der 8. Phase, Texel, geht die 9. Phase, frühes Z und Pixelschattierung, die auch einen Pixelshader als Eingabe benötigt.  Die 10. Phase ist Z-Test, Alpha-Blending und Anti-Aliasing.  Dann ist die 11. Phase die Nachbearbeitung, die zurück in den Backpuffer ausgibt.

Klassische Grafikkarten sind noch relativ nah an der Grafikpipeline. Mit steigenden Anforderungen an die GPU wurden nach und nach Einschränkungen aufgehoben, um mehr Flexibilität zu schaffen. Moderne Grafikkarten verwenden eine frei programmierbare, Shader-gesteuerte Pipeline, die einen direkten Zugriff auf einzelne Verarbeitungsschritte ermöglicht. Um den Hauptprozessor zu entlasten, wurden zusätzliche Verarbeitungsschritte in die Pipeline und die GPU verlagert.

Die wichtigsten Shader-Einheiten sind Vertex-Shader , Geometrie-Shader und Pixel-Shader .

Der Unified Shader wurde eingeführt, um alle Einheiten voll auszunutzen. Dadurch erhalten Sie einen einzigen großen Pool von Shader-Einheiten. Je nach Bedarf wird der Pool in verschiedene Gruppen von Shadern unterteilt. Eine strikte Trennung zwischen den Shader-Typen ist daher nicht mehr sinnvoll.

Es ist auch möglich, einen sogenannten Compute-Shader zu verwenden, um Berechnungen außerhalb der Anzeige einer Grafik auf der GPU durchzuführen. Der Vorteil ist, dass sie sehr parallel laufen, aber es gibt Einschränkungen. Diese universellen Berechnungen werden auch General Purpose Computing on Graphics Processing Units oder kurz GPGPU genannt .

Siehe auch

Quellen

  • Tomas Akenine-Möller, Eric Haines: Echtzeit-Rendering. AK Peters, Natick, Mass. 2002, ISBN  1-56881-182-9 .
  • Michael Bender, Manfred Brill: Computergrafik: ein anwendungsorientiertes Lehrbuch. Hanser, München 2006, ISBN  3-446-40434-1 .
  • Fischer, Martin (2011-07-04). Pixel-Fabrik. Wie Grafikchips Spielewelten auf den Schirm zaubern . c't Magazin für Computertechnik. Heise Zeitschriften Verlag. P. 180. ISSN  0724-8679 .

Verweise

  1. ^ "Grafik-Pipeline" . Microsoft . 30. Mai 2018 . Abgerufen am 15. Juni 2015 .
  2. ^ "Vortrag: Grafikpipeline und Animation" . Archiviert vom Original am 7. Dezember 2017 . Abgerufen am 15. Juni 2015 .
  3. ^ Lawrence, Jason (22. Oktober 2012). "3D-Polygon-Rendering-Pipeline" ( PDF ) . web.archive.org . Archiviert (PDF) vom Original am 29. Dezember 2016 . Abgerufen 2019-09-19 .
  4. ^ Tomas Akenine-Möller, Eric Haines: Echtzeit-Rendering , S. 11. ( PDF )
  5. ^ K. Nipp, D. Stoffer; Lineare Algebra ; v/d/f Hochschulverlag der ETH Zürich; Zürich 1998, ISBN  3-7281-2649-7 .

Externe Links