Hardware-Zone Schriftzug

Neueste Artikel

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.

island 3169709

Dreidimensionale Grafik

Giraffe als 3D-Drahtgittermodell

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.

Rendering-Pipeline

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.

Quelle

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.

Quelle

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

 

Projektionsarten

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.

Rasterisierung

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

VerfahrenRasterisierungRaytracing
Allgemein

  • berücksichtigt nur die sichtbaren Bereiche einer Szene

  • Farbwert wird durch Interpolation ermittelt


  • berücksichtigt die gesamte Szene

  • Farbwert wird jeden Bildpunkt einzeln berechnet

Speicherbedarfgeringhoch
VerdeckungsberechnungZ-PufferPrimä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:

EffektBeispielbildSpielVerbesserung der visuellen DarstellungRechenaufwand
Globale BeleuchtungMetro Exodus RT OnMetro: Exodushochhoch
ReflexionenBattlefield 5 RTX OnBattlefield Vmittelhoch
SchattenSotTR RTX OnShadow Of The Tomb Raidergeringgering
Schatten und ReflexionenCyberpunk2077 RTX OnCyberpunk 2077hochhoch

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
Analog-/Digital-Signal

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

VerfahrenQualitätTexturqualitätBewegungsunschärfeLeistung
CSAA (Coverage-Sampling Anti-Aliasing)gutgutneinbefriedigend
DLAA (Deep Learning Anti-Aliasing)sehr gut (2.0)gutneinsehr gut
FSR (FidelityFX Super Resolution)gutbefriedigendneinsehr gut
MLAA (Morphological Anti-Aliasing) befriedigendbefriedigendneingut
MSAA (Multi-Sample Anti-Aliasing)sehr gut (nur nicht-transparente Texturen)sehr gutneinbefriedigend (4x), ausreichend (8x)
SMAA (Subpixel Morphological Anti-Aliasing)gutsehr gutjagut
SSAA (Super-Sample Anti-Aliasing)sehr gutsehr gutneinausreichend (4x)
TAA (Temporal Anti-Aliasing)sehr gutausreichendjabefriedigend

Super-Sample Anti-Aliasing

Super-Sample Anti-Aliasing
Beim Super-Sample-Anti-Aliasing (SSAA) werden für jeden einzelnen Bildpunkt einfach zusätzliche Abtastwerte, sogenannte Sub-Samples, erzeugt Die Position dieser Sub-Samples innerhalb eines Pixels wird durch das zum Einsatz kommende Verfahren bestimmt. Meistens wird die Grafik oder 3D-Szene zuerst um den Faktor zwei (oder höher) vergrößert, indem alle Bildschirmkoordinaten mit zwei multipliziert werden (Upsampling). Dadurch wird sichergestellt, dass die Anzahl der Abtastwerte angemessen hoch ist für ein hinreichendes Anti-Aliasing. Die vergrößerte 3D-Szene wird im Back-Buffer abgelegt, so dass sie nicht auf dem Bildschirm zu sehen ist. Sobald die gesamte Szene fertig berechnet ist, muss sie wieder verkleinert werden (Downsampling). Während des Downsampling werden jeweils vier Pixel in einem Raster von 2×2 Pixeln angeordnet und deren Farbmittelwert ermittelt. Diese vier Pixel dienen als Sub-Samples, die wiederum für einen Pixel in der fertigen 3D-Szene stehen.

Multi-Sample Anti-Aliasing

Bei diesem Verfahren wird im Gegensatz zum SSAA nicht für jeden Sub-Sample ein Pixel-Shader (Funktionseinheit, in der z.B. Farbe, Schatten oder Beleuchtung berechnet wird) aufgerufen. Pixel-Shader werden nur verwendet, wenn mindestens ein Abtastwert pro Bildpunkt von dem 3D-Objekt auch überlagert wird. MSAA ist nicht so rechenaufwändig wie SSAA, liefert aber dennoch eine vergleichbare Qualität.
Multi-Sample Anti-Aliasing

Coverage-Sampling Anti-Aliasing

Coverage-Sampling Anti-Aliasing
Der Unterschied zum MSAA-Verfahren liegt in der Erfassung des Coverage-Attributs, ein Binärwert, der angibt, ob der Abtastwert von einem anderen Dreieck überlagert wird oder nicht. Je mehr Coverage-Werte pro Bildpunkt erfasst werden können, desto genauer kann dessen Farbwert berechnet werden. Das Coverage-Attribut wird bei der Erzeugung eines Abtastwerts zusammen mit den anderen Attributen (Farb- und Z-Wert) gespeichert, mit der Folge, dass der benötigte Grafikspeicher bei jedem zusätzlich erfassten Coverage-Wert um ein Vielfaches ansteigen würde. Beim CSAA-Verfahren werden die Coverage-Werte deshalb getrennt mit einer eigenen, höher auflösenden Abtastmaske erzeugt.

Morphological Anti-Aliasing (NVidia FXAA – Fast approximate Anti-Aliasing)

Beim Morphological Anti-Aliasing werden nur die Kanten bzw. Kontrastgrenzen weichgezeichnet, indem die Farbwerte in der näheren Umgebung mit dem Farbwert entlang einer berechneten Linie vermischt werden. Anders als beim SSAA- oder MSAA-Verfahren werden keine zusätzlichen Abtastwerte erzeugt. Es ist deshalb ein sehr schnelles Verfahren, das allerdings kein Flimmern verringert. Außerdem funktioniert die Kantenerkennung nicht immer zuverlässig.
Morpholigical 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.

Quelle

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ösung1920x1080 (FullHD)2560x1440 (WQHD)3440x14403840x2160 (UHD)5120x2880 (5K)7680x4320 (8K)
Ultra Performance640x360853x4801147x4801280x720 (720p)1707x9602560x1440 (WQHD)
Performance960x5401280x720 (720p)1720x7201920x1080 (FullHD)2560x1440 (WQHD)3840x2160 (UHD)
Balanced1114x6261484x8351995x8352227x12522970x16704454x2506
Quality1280x720 (720p)1706x9602293x9602560x1440 (WQHD)3413x19205120x2880 (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ösung2560x1440 (WQHD)3840x2140 (UHD)
Performance1280x7201920x1080 (FullHD)
Balanced1506x8472259x1270
Quality1706x9602560x1440 (WQHD)
Ultra Quality1970x11082954x1662

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

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.

Trilineare Filterung

Anisotrope Filterung

4-fache anisotropische 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.

Quelle

MIP-Mapping

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.

  1. 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.
  2. 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.
  3. 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

https://www.scratchapixel.com/index.php