Grundlagen
Dieser Exkurs vermittelt die Grundlagen der Darstellung und Manipulation von Computergrafik mit dem Schwerpunkt auf dreidimensionale Grafik. Wenn Sie noch keinerlei Erfahrung mit dem Thema haben, sollten Sie zuerst diese Seite lesen.
Arten von Computergrafik
Man unterscheidet im Wesentlichen drei Arten von Computergrafik:
Rastergrafik
Die normale 2D-Computergrafik, auch Rastergrafik oder Bitmap genannt, besteht aus vielen einzelnen Punkten (engl. pixel, von picture element – „Bildelement“), die in einem Gitter aus Spalten und Zeilen angeordnet sind, deren Anzahl durch die Auflösung (Spalten x Zeilen) bestimmt wird. Ein Bildpunkt besteht wiederum aus den drei Grundfarben Rot, Grün und Blau. Für jeden Farbwert sind jeweils 8 Bit Speicherplatz vorgesehen, d.h. es gibt 256 (entspricht 2^8) verschiedene Intensitätsstufen (von 0 = schwarz bis 255 = weiß) je Farbe. Zusätzlich wird noch ein sogenannter Alphawert gespeichert, der den Grad der Transparenz (von 0 = komplett durchsichtig bis 255 undurchsichtig) festlegt. Das ist z.B. dann sinnvoll, wenn das Bild mehrere Ebenen aufweist. Insgesamt werden also 32 Bit (4 x 8 Bit) oder 4 Byte Speicherplatz pro Pixel benötigt.
Das RGB-Farbmodell wird verwendet, da es der Farbwahrnehmung des menschlichen Auges am besten entspricht. Auch das Auge besitzt drei Farbzapfen für Lichtwellen in den Spektralbereichen rot, grün und blau. Bei Bildschirmen besteht jedes Bildelement entsprechend aus drei Subpixeln in den Farben rot, grün und blau. Diese können unabhängig voneinander zum Leuchten gebracht werden. Betrachtet man ein Bildelement aus großer Entfernung, dann erzeugt bzw. „mischt“ das menschliche Auge automatisch die entsprechende Farbe.
Ein großer Vorteil von Rastergrafik ist, dass sie ohne großen technischen Aufwand direkt auf dem Bildschirm ausgegebenen werden kann.
Vektorgrafik
Vektorgrafik setzt sich aus Punkten, Linien und anderen einfachen, geometrischen Formen (Primitiven) zusammen. Die Position der Objekte wird durch die Koordinaten (x, y) der Eckpunkte (engl. vertices) bestimmt. Vektorbasierte Bilder haben gegenüber Rastergrafiken den Vorteil, dass Konturen selbst bei starker Vergrößerung noch scharf dargestellt werden. In diesem Kapitel steht aber ein anderer nützlicher Aspekt im Vordergrund: Vektorgrafik lässt sich mathematisch beschreiben, wodurch sie mittels 2D-Transformation manipuliert werden kann. So ist es z.B. möglich, Größe und Position eines Objekts zu verändern.
Dreidimensionale Grafik

3D-Grafik besteht ebenfalls aus Primitiven. Als Grundform für komplexere Objekte wird allerdings meistens das Dreieck verwendet. Das hat folgende Gründe:
- aus Dreiecken lässt sich nahezu jedes 3D-Objekt zusammenbauen, selbst eine Kugel
- Dreiecke lassen sich mit dem geringsten Rechenaufwand transformieren
- sie ermöglichen eine sehr effiziente Speicherung (für jedes weitere Dreieck wird nur ein Eckpunkt benötigt)
Die Position eines Dreiecks im Raum wird durch dessen drei Eckpunkte bestimmt. Jeder Eckpunkt hat eine x-, y- und z-Koordinate. Der z-Wert (Tiefenwert) bestimmt, wie weit ein Punkt vom Betrachter entfernt ist. Zusätzlich wird jedem Punkt auch ein Farb- und Alphawert (gibt den Grad der Durchsichtigkeit an) zugewiesen. Da Komplexität und Rechenaufwand mit jedem weiteren dargestellten Objekt steigen, sind nicht alle Details im 3D-Modell ausgearbeitet. Auf Flächen werden deshalb meist zweidimensionale Bilder gelegt (z.B. Mauerwerk), die als Texturen bezeichnet werden.
Dreidimensionale Grafik ermöglicht eine realistische, räumliche Darstellung, kann jedoch nicht direkt auf dem Bildschirm ausgegeben werden. Wie auch bei Vektorgrafiken können die Objekte mittels Transformation verändert werden.
Rendering
Die Darstellung von 3D-Grafik, auch als Rendering bezeichnet, ist ein sehr aufwändiger Prozess, bei dem viele Aspekte berücksichtigt werden müssen:
- Beleuchtung (Position/Art der Lichtquelle/Material)
- Perspektive (perspektivisch/orthogonal)
- Verdeckung (Befindet sich ein Objekt vor oder hinter einem anderen Objekt?)
- Anti-Aliasing (Umgang mit Darstellungsfehlern durch Rasterung)
- Transparenz
- Schatten
- Reflexionen (Spiegelungen)
- Refraktion (Lichtbrechung)
Die Rendering-Pipeline
Aus diesem Grund muss jeder einzelne Bildpunkt mehrere Verarbeitungsphasen durchlaufen, bevor die 3D-Szene auf dem Bildschirm ausgegebenen werden kann, Wie bei einer CPU werden Phasen parallel ausgeführt. Man bezeichnet diesen Prozess auch als Rendering-Pipeline. In der folgenden Grafik werden die Phasen im roten Bereich für jeden Eckpunkt (Vertex) und die Phasen im blauen Bereich für jeden Pixel ausgeführt. Mit Einführung der universellen Shader wurde diese Unterteilung hinfällig.
Die Rendering-Pipeline wird immer dann aufgerufen, wenn ein Objekt in der Szene durch die CPU (z.B. die künstliche Intelligenz) oder durch Interaktion des Benutzers (z.B. das Öffnen einer Tür) verändert wird. In diesem Fall werden die Koordinaten der einzelnen Eckunkte, deren zugewiesene Eigenschaften (Farbe, Transparenz etc.) und Texturen an den Grafikprozessor übertragen.
Geometrieberechnung
An dieser Stelle kommen 3D-Transformationen zum Einsatz, um Objekte zu manipulieren (z.B. Vergrößerung oder Verschiebung).
Beleuchtung
Die Beleuchtung eines Objekts wird entsprechend der Ausrichtung der Lichtquelle(n) ermittelt.
Projektion
Die dreidimensionalen Objekte werden durch Strahlen bzw. Geraden auf eine zweidimensionale Fläche abgebildet. Die wegfallende z-Achse (z = 0) vereinfacht die nächsten Schritte.
Clipping und Backface-Culling
Clipping und Culling sind Verfahren zur Erhöhung der Geschwindigkeit bei der Rasterung, indem sie Objekte, die vom Betrachter nicht sichtbar sind, bereits vorher aus der Szene entfernen. Beim Clipping oder Frustum-Culling werden Objekte gelöscht oder abgeschnitten, die sich außerhalb des Sichtfensters bzw. -volumen befinden. Das Backface-Culling geht noch weiter: Es sortiert zusätzlich die nicht sichtbaren Seiten eines Objekts aus (engl. cull = aussortieren).
Rasterung
Die 3D-Szene wird in eine Rastergrafik umgewandelt. Dabei werden alle Objekte in einzelne Punkte (Fragmente) zerlegt.
Fragment-Verarbeitung
Die Attribute eines einzelnen Bildpunktes (Farbe, Transparenz) können anschließend mit Pixel- bzw. Fragment-Shadern verändert werden, um Licht, Schatten oder besondere Oberflächeneigenschaften (z.B. Reflexionen auf Wasser) zu simulieren.
Texturierung (Texture-Mapping)
Beim Texture-Mapping werden zweidimensionale Grafiken auf die einzelnen Bildpunkte gelegt. Damit Texturen nicht verzerrt erschienen, muss eine Perspektivkorrektur durchgeführt werden. Dabei werden weiter vom Betrachter entfernte Strecken abhängig vom Entfernungswert (z) kürzer dargestellt. Ein weiteres Darstellungsproblem ergibt sich bei starker Vergrößerung der Textur, denn dann erkennt man die einzelnen Bildpunkte. Um das zu verhindern, werden verschiedene Filter eingesetzt.
Z-Test und Blending
Der Z-Test ist bei der Verdeckungsberechnung notwendig, um sicherzustellen, dass der Bildpunkt nur in den Framebuffer geschrieben wird, wenn er nicht durch einen anderen verdeckt wird.
Bei bestimmten Effekten wie Transparenz oder Nebel kommt das sogenannte Blending zum Einsatz. Dabei wird der Farbwert des Fragments mit dem Wert des entsprechenden Punktes im Speicher vermischt, wobei das „Mischverhätnis“ noch von einem weiteren Attribut abhängig ist (z.B. Alpha- oder z-Wert).
Ausgabe (Framebuffer)
Bei der Ausgabe wird das zweidimensionale Bild in den Framebuffer, einen Bereich im Speicher der Grafikkarte, geschrieben. Damit der Benutzer den Bildaufbau nicht zu sehen bekommt, ist der Framebuffer zweigeteilt: Der Frontbuffer enthält das fertig aufbereitete Bild, so wie man es auf dem Bildschirm zu sehen bekommt, und der Backbuffer das jeweils nächste, noch in der Bearbeitung befindliche Bild. Sobald der Bildschirm das Bild ausgegeben hat, werden die Adressen der Puffer vertauscht.
Geometrieberechnung
Im ersten Schritt der Render-Pipeline werden statische 3D-Szenen in Bewegung versetzt. Eine 3D-Szene besteht aus mehreren Objekten, die in einem rechtwinkligen, kartesischen Koordinatensystem angeordnet sind:
- virtuelle Kamera (auch Betrachter)
- Sichtvolumen (ein unsichtbarer Container, der nur die für die Kamera sichtbaren Objekte enthält)
- Lichtquellen (auch unsichtbar)
- verschiedene 3D-Objekte (Modelle)
Affine Transformationen
Objekte setzen sich aus einem oder mehreren (Eck-)punkten (vertices) und Dreiecken zusammen. Sie können deshalb durch Transformation der Punkte verändert werden. Die drei grundlegenden Transformationsarten sind Verschiebung (Translation), Drehung (Rotation) und Vergrößerung/Verkleinerung (Skalierung). Diese werden auch als affine Transformationen bezeichnet, da bei ihrer Anwendung sämtliche Proportionen (Abstands- und Längenverhältnisse) des Modells erhalten bleiben. Affine Transformationen werden mit Hilfe entsprechender Transformationsmatrizen durchgeführt.
Je nach Komplexität der Szene sind für jedes einzelne Bild mehrere tausend Transformationen notwendig. Moderne Grafikprozessoren sind auf parallele Befehlsverarbeitung ausgelegt und können in kurzer Zeit so viele Einzelbilder erzeugen, dass daraus fließende Bewegungen entstehen.
Transformationsmatrizen werden in der Regel auch bei folgenden Transformationen verwendet:
- Modell–Transformation: Um komplexe Objekte leichter verändern zu können, besitzen sie ein eigenes Koordinatensystem. In diesem Schritt wird das lokale Koordinatensystem in das Koordinatensystem der Szene transformiert.
- Kamera-Transformation: Für die Projektion wird das Koordinatensystem der Szene so transformiert, das sich die Kamera an der Position (0, 0, 0) befindet.
- Projektionstransformation: Legt Form, Lage und Größe des Sichtvolumen. Die Form legt die Art der Projektion fest (perspektivisch = Pyramidenstumpf, orthogonal = Rechteck)
- Transformation des Sichtbereichs (viewport): Passt die Größe des Sichtvolumen an die Größe des auf dem Bildschirm sichtbaren Bereichs an.
Rendering-Verfahren
Rasterisierung
Ein Bildschirm kann nur Bilder ausgeben, die in einem zweidimensionalen Gitter oder Raster dargestellt werden können. CPU oder Grafikprozessor führen geometrische Berechnungen hingegen auf Basis dreidimensionaler Objekte durch. Deshalb muss die 3D-Szene vor der Ausgabe in eine Rastergrafik umgewandelt werden. Dieser Vorgang besteht aus zwei Schritten:
1. Projektion
Zuerst muss die 3D-Szene in eine zweidimensionale Entsprechung umgesetzt werden. Dieser Schritt wird als Projektion bezeichnet. Dabei wird jeder von der Kamera sichtbare Eckpunkt eines dreidimensionalen Objekts mit Hilfe von Geraden („Strahlen“) auf eine zweidimensionale Ebene übertragen. Das Ergebnis ist eine Vektorgrafik.
Es gibt zwei Arten der Projektion: Die perspektivische und die orthogonale Projektion.
- Die perspektivische Projektion liefert eine realitätsgetreue, räumliche 2D-Darstellung, so wie sie das menschliche Gehirn erzeugt. Dabei erscheinen etwa weiter entfernte Strecken kürzer als nähere Strecken, obwohl sie gleich lang sind. Bei Computerspielen, die in der Ich-Perspektive dargestellt werden, wird meistens diese Art der Projektion eingesetzt.
- Bei der orthogonalen Projektion steht dagegen eine rein formal-technische Darstellung, die z.B. für Designer oder Architekten wichtig ist, im Vordergrund. Strecken werden unabhängig von ihrer Entfernung immer in ihrer tatsächlichen Länge dargestellt, also isometrisch. Diese Ansicht wird bei CAD-Anwendungen (Computer Aided Design) benötigt. Auch Spiele, die das Geschehen schräg von oben zeigen, nutzen diese Art der Projektion. Klassisches Beispiel: SimCity
Die Art der Projektion wird durch die Form des Sichtbereichs bestimmt. Ein Pyramidenstumpf (engl. Frustum) wird bei perspektivischer, ein Quadrat oder Rechteck bei orthogonaler Projektion verwendet.
2. Rasterisierung
Bei der Rasterisierung ung wird jedes Objekt zeilenweise abgetastet und dabei in einzelne Punkte, sogenannte Fragmente, zerlegt. Dabei werden die Attribute der Eckpunkte (Position, Texturkoordinaten, Farbe und Transparenz) interpoliert und die ermittelten Werte den einzelnen Fragmenten zugewiesen.
Zunächst einmal werden alle Dreiecke der 3D-Szene gerastert, die nicht bereits beim Frustum- und Backface-Culling entfernt wurden. Auf dem Bildschirm sollen aber letztendlich nur Fragmente von Objekten angezeigt werden, die nicht von anderen verdeckt werden. Deshalb wird bei der Rasterung für jeden Abtastpunkt ein Tiefenwert z, der die Entfernung eines Objektes vom Betrachter bestimmt, ermittelt (s. Verdeckungsberechnung). Dieser Wert wird auch für Nebeleffeke und MIP-Mapping benötigt.
Ein großer Nachteil ist die Treppchenbildung an den Kanten bei zu geringer Auflösung des Rasters. Dieser Aspekt wird im nächsten Abschnitt ausführlicher behandelt.
Raytracing
Als Raytracing bezeichnet man ein bereits Ende der 1960er Jahre entwickeltes Verfahren zur Umwandlung von 3D- in 2D-Grafik. Dazu wird für jeden einzelnen Bildpunkt ein Strahl erzeugt, der vom Betrachter (Augpunkt) aus durch ein Raster (den „virtuellen“ Bildschirm) auf die 3D-Szene projiziert wird. Sobald der Strahl auf ein Objekt trifft, wird der Schnittpunkt berechnet und der Farbwert auf den entsprechenden Bildpunkt übertragen. Anfangs diente Raytracing nur der Verdeckungsberechnung, weshalb pro Bildpunkt nur ein Strahl notwendig war. Später kamen weitere Strahlen (sog. Sekundärstrahlen) hinzu, so dass auch Licht und Schatten simuliert werden konnten.
Raytracing ermöglicht deshalb eine realitätsgetreue Darstellung von Beleuchtungseffekten (vor allem Reflexionen), allerdings ist die Berechnung der Schnittpunkte ein sehr rechenaufwändiger Vorgang. Es wird deshalb hauptsächlich dort eingesetzt, wo es auf fotorealistische Darstellung ankommt und die komplette Szene vorab berechnet werden kann, z.B. bei Spezialeffekten in Spielfilmen. Aktuelle PC-Grafikkarten sind für eine flüssige Darstellung von pixelgenauem Raytracing in Echtzeit (noch) zu langsam. Deshalb wird bei Computerspielena nur für bestimmte Effekte die Strahlenverfolgung eingesetzt.
Funktionsweise
Ein wesentlicher Bestandteil des Raytracing-Algorithmus ist der Schnittpunkttest, der die Stelle ermittelt, an welcher der Strahl auf ein Dreieck trifft. Dieser wird für jedes einzelne Dreieck der Szene ausgeführt, und zwar solange, bis das entsprechende Dreieck gefunden wurde. Um die zeitaufwändige Suche zu beschleunigen, werden unterschiedliche Verfahren eingesetzt. Ein gängiges Verfahren ist der BVH-Algorithmus (Bounding Volume Hierarchy), der eine Hierarchie der kleinsten umgebenden Rechtecke abbildet. Dabei werden die Dreicke mit Hilfe von rechteckigen Hüllkörpern, den sogenannten Bounding Boxes, zu Gruppen zusammengefasst, die wiederum in Untergruppen unterteilt werden können und somit einen Suchbaum bilden (eine sehr einfache Erklärung finder man hier). Ein Schnittpunkttest muss dann nur noch mit den umgebenden Hüllkörpern durchgeführt werden, und nicht mehr mit jedem einzelnen Objekt.
Unterschiede zwischen Rasterisierung und Raytracing
Verfahren | Rasterisierung | Raytracing |
---|---|---|
Allgemein |
|
|
Speicherbedarf | gering | hoch |
Verdeckungsberechnung | Z-Puffer | Primärstrahlen |
Schatten | Shadow mapping: Tiefenwerte werden mit einer vorab berechneten Textur, die nur Tiefenwerte aus Sicht der Lichtquelle enthält, verglichen | Schattenstrahlen |
Reflexionen | Environment mapping: eine Textur der unmittelbaren Umgebung wird auf das Objekt abgebildet | Reflexionsstrahlen |
Refraktionen (Lichtbrechungen) | kein Standardverfahren, oft Environment mapping mit Brechungsindex | Refraktionsstrahlen |
Beleuchtung | Ambient Occlusion (Umgebungsverdeckung): Für jeden Bildpunkt wird anhand der Tiefenwerte (z) der umgebenden Pixel ein Verdeckungsgrad ermittelt. Er bestimmt, wie viel Umgebungslicht letztendlich auf den entsprechenden Bildpunkt fällt. | Lichtstrahlen |
Hybrid-Rendering
Da eine vollständige Darstellung der 3D-Szene mittels Raytracing selbst die aktuelle Generation von Grafikprozessoren überfordern würde, nutzt man Strahlen nur für bestimmte Effekte, während ein Großteil der Szene wie bisher gerastert wird. Dieser Ansatz wird als Hybrid-Rendering bezeichnet. Dabei kommt die Strahlenverfolgung z.B. für folgenden Effekte zum Einsatz:
Effekt | Beispielbild | Spiel | Verbesserung der visuellen Darstellung | Rechenaufwand |
---|---|---|---|---|
Globale Beleuchtung | ![]() | Metro: Exodus | hoch | hoch |
Reflexionen | ![]() | Battlefield V | mittel | hoch |
Schatten | ![]() | Shadow Of The Tomb Raider | gering | gering |
Schatten und Reflexionen | ![]() | Cyberpunk 2077 | hoch | hoch |
Systemvoraussetzungen
Um überhaupt Raytracing nutzen zu können, benötigt man das Windows-10-Update 1809, das die entsprechende Erweiterung für DirectX 12 (DXR) enthät. Daneben ist mindestens eine Grafikkarte mit einer GeForce-1060-GTX-GPU und 6 GB Grafikspeicher erforderlich. Leistungstests offenbaren allerdings deutlich, dass die Grafikprozessoren der GeForce-10/16-Serie für die Strahlenverfolgung schlicht zu langsam sind. Das liegt daran, weil die entsprechenden Raytracing-Recheneinheiten fehlen, über die nur die GPUs der Geforce-20-Serie verfügen. Wer eine halbwegs flüssige Darstellung der Raytracing-Effekte erwartet, der sollte eine Grafikkarte mit min einem der folgenden Grafikchips besitzen:
- Full-HD (1920×1080): GeForce RTX 2060
- WQHD (2560×1440): GeForce RTX 2080
- Ultra-HD (3840×2160): GeForce RTX 2080 Ti
Anti-Aliasing
Die möglichst realitätsgetreue Wiedergabe von Bild und Ton ist seit Einführung der ersten multimediatauglichen Personal Computern eine große Herausforderung. Der Grund hierfür liegt in einer durch Prozessorleistung, Auflösung und Speicherkapazität begrenzten Übertragbarkeit von analogen Signalen (Licht- und Schallwellen) in computerlesbare Signale. Verdeutlicht wird dies, wenn man sich die Funktionsweise eines A/D-Wandlers, den man z.B. in Webcams, Scannern oder Smartphones findet, genauer ansieht.
A/D-Wandler
Ein Analog-Digital-Umsetzer (ADC) wandelt elektrische Signale (von einem Aufnahmegerät) in maschinenlesbare Signale um. Dabei tastet er regelmäßig das analoge Signal ab und speichert die gemessenen Abtastwerte. Diese entsprechen nur annäherungsweise dem ursprünglichen Signal, da sie wert- und zeitdiskret sind, d.h.:
- der erfasste Wertebereich, die sogenannte Auflösung, umfasst nicht den unendlichen Wertebereich des analogen Signals
- es gibt nur eine begrenzte Anzahl an Abtastwerten (Abtastrate) innerhalb eines bestimmten Zeitraumes
Analoges Signal (schwarz) und digitales Signal mit entsprechenden Näherungswerten (blau)
Problem Unterabtastung
Bei Tonsignalen ist kein Unterschied zwischen den analogen und digitalen Signalen zu hören, solange Abtastrate und Auflösung angemessen hoch sind (mehr dazu: Abtasttheorem). Die beschränkte Anzahl an Abtastwerten wirkt sich besonders negativ auf die Qualität von (digitalen) Bildern aus: Es entstehen Darstellungsprobleme, für die das sogenannte Aliasing (Unterabtastung) verantwortlich ist. Aliasing sorgt für sichtbare Treppeneffekte an schrägen Linien sowie ungenügende Bildschärfe vor allem bei steigender Entfernung zum Objekt.
Genau dieser Effekt entsteht auch bei der Rasterung: Da die Pixelpositionen von einem Raster abhängig sind, kann ein Farbwert des ursprünglichen Bildes auch irgendwo zwischen zwei Pixeln liegen. In diesem Fall wird der Farbwert dem am nächsten liegenden Pixel zugewiesen. Das Problem hierbei: Die Position der Farbe wird leicht „verschoben“, wodurch die Treppeneffekte entstehen. Der Begriff für Verfahren zur Verringerung von Darstellungsfehlern durch Unterabtastung lautet Anti-Aliasing, auch oft einfach als Kantenglättung bezeichnet. Diese Aufgabe übernimmt der Grafikprozessor.
Der Oberbegriff für alle Methoden zur Verringerung von Darstellungsfehlern durch Unterabtastung lautet Anti-Aliasing, auch oft einfach als Kantenglättung bezeichnet. Diese Aufgabe übernimmt u.a. der Grafikprozessor.
Anti-Aliasing-Verfahren
Übersicht
Verfahren | Qualität | Texturqualität | Bewegungsunschärfe | Leistung |
---|---|---|---|---|
CSAA (Coverage-Sampling Anti-Aliasing) | gut | gut | nein | befriedigend |
DLAA (Deep Learning Anti-Aliasing) | sehr gut (2.0) | gut | nein | sehr gut |
FSR (FidelityFX Super Resolution) | gut | befriedigend | nein | sehr gut |
MLAA (Morphological Anti-Aliasing) | befriedigend | befriedigend | nein | gut |
MSAA (Multi-Sample Anti-Aliasing) | sehr gut (nur nicht-transparente Texturen) | sehr gut | nein | befriedigend (4x), ausreichend (8x) |
SMAA (Subpixel Morphological Anti-Aliasing) | gut | sehr gut | ja | gut |
SSAA (Super-Sample Anti-Aliasing) | sehr gut | sehr gut | nein | ausreichend (4x) |
TAA (Temporal Anti-Aliasing) | sehr gut | ausreichend | ja | befriedigend |
Quellen:
http://www.3dcenter.org/news/nvidias-txaa-gute-kantenglaettung-und-bildruhe-aber-doch-wieder-ein-starker-weichzeichner
http://www.computerbase.de/news/2013-02/crysis-3-welches-anti-aliasing-ist-das-beste/
http://www.computerbase.de/artikel/grafikkarten/2009/bericht-anti-aliasing-bei-ati-und-nvidia/18/
Super-Sample Anti-Aliasing
Multi-Sample Anti-Aliasing
Coverage-Sampling Anti-Aliasing
Morphological Anti-Aliasing (NVidia FXAA – Fast approximate Anti-Aliasing)
Deep Learning Anti-Aliasing (DLAA)
Deep Learning ist eine fortgeschrittene Form des maschinellen Lernens, bei der künstliche neuronale Netze mit mehreren Abstraktionsschichten oder -ebenen, auch Deep Neural Network (DNN) genannt, zum Einsatz kommen. Dabei wird ein zu lösendes Problem schrittweise in einfachere Teilkonzepte aufgeteilt. Auf diese Weise können nach einem längeren Lernprozess, bei dem sehr viele Eingabewerte gesammelt und ausgewertet werden, etwa Objekte klassifiziert oder bestimmte Muster erkannt werden. Beim DLAA oder DLSS (Deep Learning Super Sampling) wird ein tiefes neuronales Netz dazu verwendet, die Qualität der Kantenglättung zu verbessern. Es wertet kontinuierlich die Bilddaten aus und versucht, Übereinstimmungen mit einem Referenzbild, das einer 64-fachen Kantenglättung unterzogen wurde, zu finden. Dadurch „lernt“ das DNN den Algorithmus für das optimale Bild. Dieser Prozess wird auf einem Supercomputer durchgeführt. Der KI-Algorithmus wird dann von den Tensor-Recheneinheiten in der GPU verwendet, um die Katenglättung durchzuführen. DLAA soll eine vergleichbare Bildqualität wie das TAA-Verfahren mit wesentlich geringeren Leistungseinbußen liefern. Allerdings funktioniert die Technik nur in Verbindung mit aktiviertem Raytracing.
DLAA/DLSS 2.0
Da der Einsatz von DLSS 1.x vermehrt zu Flimmern und unscharfen Texturen führte, wurden in DLSS 2.0 einige Änderungen vorgenommen:
- Wahrend bei der ersten Version das zugrundeliegende neuronale Netzwerk für jedes Spiel einzeln antrainiert werden musste, kann es nun auf jedes beliebiges Spiel angewendet werden. Dadurch soll die Anzahl unterstützter Spieletitel erhöht werden.
- Berechnungen werden nicht mehr auf den Shader-Einheiten ausgeführt, sondern wie vorgesehen auf den spezialisierten Tensor-Kernen.
- Bislang waren die verfügbaren Auflösungen vom Modell des Grafikchips abhängig. Stattdessen kann jetzt in allen unterstützten Spielen zwischen drei Qualitätsstufen („Quality“, „Balanced“ oder „Performance“) gewählt werden. Die etwa im FullHD-Modus (1920 x 1080) tatsächlich berechnete (gerenderte) Auflösung variiert dann je nach eingestellter Stufe zwischen 1280 x 720 (Quality), 1113 x 626 (Balanced) und 960 x 540 (Performance).
Unter den meisten Titeln liefert DLSS 2.0 nun tatsächlich ein schärferes und detailreicheres Bild. Grafikfehler treten aber gelegentlich immer noch auf.
Qualitätsstufen
Ausgabe-Auflösung | 1920x1080 (FullHD) | 2560x1440 (WQHD) | 3440x1440 | 3840x2160 (UHD) | 5120x2880 (5K) | 7680x4320 (8K) |
---|---|---|---|---|---|---|
Ultra Performance | 640x360 | 853x480 | 1147x480 | 1280x720 (720p) | 1707x960 | 2560x1440 (WQHD) |
Performance | 960x540 | 1280x720 (720p) | 1720x720 | 1920x1080 (FullHD) | 2560x1440 (WQHD) | 3840x2160 (UHD) |
Balanced | 1114x626 | 1484x835 | 1995x835 | 2227x1252 | 2970x1670 | 4454x2506 |
Quality | 1280x720 (720p) | 1706x960 | 2293x960 | 2560x1440 (WQHD) | 3413x1920 | 5120x2880 (5K) |
AMD FSR (FidelityFX Super Resolution)
Im Gegensatz zu DLSS ist FSR ein quelloffener Standard, bei dem das aktuelle Bild mit Hilfe eines herkömmlichen softwareseitigen Algorithmus hochskaliert bzw. vergrößert wird. Der Vorteil dieses Ansatzes ist, dass keine spezielle Hardware vonnöten ist und damit sowohl aktuelle als auch ältere Grafikchips wie Radeon RX 480/470/460 oder Geforce 10xx unterstützt werden. Während DLSS auch die vorangegangenen Bilder einbezieht, berücksichtigt FSR nur das aktuell dargestellte Bild. Deshalb ist die Bildqualität schlechter als bei DLSS. Auch hier gibt es verschiedene Qualitätsstufen.
Qualitätsstufen
Ausgabe-Auflösung | 2560x1440 (WQHD) | 3840x2140 (UHD) |
---|---|---|
Performance | 1280x720 | 1920x1080 (FullHD) |
Balanced | 1506x847 | 2259x1270 |
Quality | 1706x960 | 2560x1440 (WQHD) |
Ultra Quality | 1970x1108 | 2954x1662 |
Quelle: AMD
FSR 2.0
In Version 2.0 wird eine bessere Bildqualität durch Nutzung einer breiteren Datenbasis erzielt: Es werden nicht nur die Pixelfarbwerte der gerade sichtbaren Szene berücksichtigt, sondern auch die der davor und danach dargestellten Bilder (Frames), die zusätzlich noch minimal zueinander versetzt gezeichnet werden. Dieses als Jittering bezeichnete Verfahren ist nicht neu; es wurde bereits vor mehr als 20 Jahren von 3dfx (Jittered Grid Super-Sampling) eingeführt. Dazu fließen noch die Inhalte des Z-Puffers sowie eines weiteren Zwischenspeichers für Bewegungsvektoren in das Ergebnis mit ein. So werden näher an der Kamera liegende Pixel bei der Hochskalierung höher gewichtet und damit weniger geglättet als weiter entfernte Bildpunkte. Die Bewegungsvektoren geben an, wie sich Objekte zwischen zwei Frames bewegen und sollen ein Verwischen von bewegten Objekten verhindern.
Texturfilter
Eine weitere Möglichkeit, Bildstörungen (z.B. Flimmern) zu verringern bzw. die Bildqualität zu verbessern, ist der Einsatz von Texturfiltern.
Bilineare Filterung
Bei diesem zweistufigen Interpolationsverfahren werden aus je 4 benachbarten Farbwerten (Samples) Mittelwerte erzeugt und dann ausgegeben. Dadurch entsteht zwar ein weicherer Farbverlauf, aber das Bild wird unscharf. Bei den ersten Grafikkarten mit 3D-Beschleunigung war der bilineare Filter oft die einzige verfügbare Bildverbesserung, da deren Leistung für die anderen Verfahren einfach zu begrenzt war.
Trilineare Filterung
Dieses Verfahren setzt voraus, dass das Bild bzw. die Textur in mehreren Größen (Detailstufen) vorliegt (MIP-Mapping). Benutzt man dieses Bild als Kachel und legt entsprechend der Entfernung zum Betrachter unterschiedliche Größenversionen des Bildes aneinander, sieht man an den Übergängen unschöne Sprünge. Um fließende Übergänge zu erreichen, wird trilineare Filterung eingesetzt: Zuerst werden die entsprechenden Farbwerte (Samples) der beiden benachbarten Bilder bilinear gefiltert bzw. interpoliert, danach wird Ergebnis nochmals linear interpoliert. Es werden also 8 statt 4 Samples benötigt.
Anisotrope Filterung
Sowohl bi- als auch trilineare Filter haben den Nachteil, dass sie die perspektivische Korrektur einer Textur nicht berücksichtigen. Dadurch gehen vor allem bei schrägen Betrachtungswinkeln auf das Objekt Details verloren. Im Gegensatz zu den anderen Filtern wählt der anisotrope Filter als Farbwerte für die Interpolation (Samples) nicht nur die 4 umgebenden Bildpunkte, sondern nimmt abhängig vom aktuellen Neigungswinkel noch weitere mit in die Auswahl. Die Anzahl der Samples wird durch einen Faktor bestimmt: 4x AF bedeutet, dass viermal so viele Farbwerte abgetastet werden wie bei einer trilinearen Filterung (8 Texel), also 32 (4 x 8 = 32). Anisotropische Filterung bietet zwar die beste optische Qualität (verbesserte Tiefenschärfe), verursacht durch die hohe Anzahl von abgetasteten Farbwerten aber auch den größten Rechenaufwand für die Textur-Einheit.
MIP-Mapping
MIP-Mapping (MIP steht für lat. Multum In Parvum* – „Vieles auf kleinem Platz“): Bei diesem Verfahren wird ein Bild in Abhängigkeit von der Entfernung zum Betrachter (z-Wert) in mehreren Auflösungen bzw. Detailstufen erzeugt. Dabei werden jedes Mal die Seitenlängen des Bildes halbiert. Nähert man sich dem 3D-Objekt mit dieser Textur, dann wird immer die Detailstufe des Bildes angezeigt, bei der ein Texel (texturierter Bildpunkt) mindestens so groß ist wie ein Bildpunkt. So wird verhindert, dass man bei geringer Entfernung jeden Bildpunkt erkennt oder bei zu großer Entfernung ein Flimmern wahrnimmt.
*Die Bezeichnung rührt daher, dass man sehr viele Bilder auf nur geringem Platz unterbringen kann. Alle nächstkleineren Detailstufen eines Bildes benötigen zusammen nur noch die Hälfte des Platzes.
Eine MIP-Map enthält für jede Detailstufe eine eigene Textur
Verdeckungsberechnung
Damit auf dem Bildschirm nur die Objekte angezeigt werden, die für den Betrachter tatsächlich sichtbar sind, wird vor der Ausgabe eine Verdeckungsberechnung durchgeführt.
Ein Standardverfahren ist der von E. Catmull entwickelte Z-Puffer-Algorithmus, der aus drei Schritten besteht.
- Bei der Rasterung wird zu jedem Pixel bzw. Fragment ein Tiefenwert z berechnet, der angibt, wie weit der Punkt vom Betrachter entfernt ist. Die Tiefenwerte werden in einem eigenen Bereich im Speicher der Grafikkarte, dem Z-Puffer, abgelegt.
- Z-Test: Der Tiefenwert z‘ des Fragments an Position (x,y) wird vor der Ausgabe mit dem entsprechenden Wert im Z-Puffer verglichen: Wenn der Tiefenwert z'(x,y) kleiner als z(x,y) ist, dann liegt der aktuelle Punkt vor dem alten Punkt und z wird überschrieben. Ansonsten ist der alte Punkt näher am Betrachter und der Wert bleibt erhalten. Anschließend wird das nächste Fragment überprüft.
- Die Farbwerte der Fragmente an den im Z-Buffer gespeicherten Koordinaten (x, y, z) werden in den sichtbaren Bereich des Grafikspeichers, den Framebuffer, übertragen.
Ein wichtiges Leistungsmerkmal ist die Tiefe oder Auflösung des Z-Puffers, die in Bit (16, 24 oder 32) angegeben wird. Sie gibt die Anzahl der pro Bildpunkt verfügbaren Tiefenebenen an. Je tiefer der Z-Puffer ist, desto besser ist die Darstellungsqualität von weiter entfernten Texturen und Effekten wie Nebel. Außerdem kommt es seltener zu einem Flackern von Objekten, die sehr eng zusammen liegen.
HyperZ (Nvidia: Lightspeed Memory Architecture)
ATi führte mit der ersten Generation seiner Radeon-Grafikchips einige Verbesserungen ein, die Zugriffe auf den Z-Puffer minimieren sollten. Zum einen wurde eine neue Methode zum schnellen Löschen des Z-Puffers („Fast Z Clear“) eingeführt, bei der ganze Z-Blöcke gelöscht werden können. Zuvor musste jede Speichstelle einzeln gelöscht werden. Zum anderen wurde mit „Hierarchical Z“ ein Culling-Verfahren (Culling = Ausschneiden) entwickelt, bei dem nicht sichtbare Objekte bereits vor der Rasterung aus der Szene entfernt werden können. Außerdem werden Datenpakete bei jedem Zugriff komprimiert, so dass das die zwischen Grafikchip und Z-Puffer zu übertragende Datenmenge verringert wird.
Raytracing
Ein alternatives Verfahren zur Verdeckungsberechnung ist Raytracing. Dabei wird vom Betrachter für jeden Bildpunkt ein Strahl auf die 3D-Szene ausgesendet. Sobald der Strahl auf ein Objekt trifft, wird ein Schnittpunkt berechnet. Das Objekt, auf das der Strahl zuerst trifft, befindet sich vor allen anderen Objekten. Da Raytracing sehr rechenaufwendig ist, wird es dafür nur selten eingesetzt.
Quellen:
http://www-vs.informatik.uni-ulm.de/teach/ws04/vp/VPS_WS0405_07_3Dgrafik.pdf