Grundlagen - Hardware-Zone

Direkt zum Seiteninhalt
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. verices) 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.

Beispiel 2D-Transformation


Gegeben seien drei Punkte A = 1 1 , B = 8 1 und C = 1 5 , die jeweils um einen Vektor T = t x t y = 4 3 verschoben werden sollen. Für jeden Punkt wird dazu die passende Transformationsmatrix ausgewählt und mit dem Vektor multipliziert : x ' y ' 1 = 1 0 t x 0 1 t y 0 0 1 x y 1 x ' y ' 1 = 1 0 4 0 1 3 0 0 1 1 1 1 x ' y ' 1 = 5 4 1 A ' = 5 4
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.

Beispiel 3-D-Transformation
Gegeben seien drei Punkte A = 1 1 1 , B = 8 1 1 und C = 1 5 1 , die jeweils um einen Vektor T = t x t y t z = 4 3 2 verschoben werden sollen. Für jeden Punkt wird dazu die passende Transformationsmatrix ausgewählt und mit dem Vektor multipliziert : x ' y ' z ' 1 = 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 x y z 1 x ' y ' z ' 1 = 1 0 0 4 0 1 0 3 0 0 1 2 0 0 0 1 1 1 1 1 x ' y ' z ' 1 = 5 4 2 1 A ' = 5 4 2
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 (Frage: Befindet sich ein Objekt vor oder hinter einem anderen Objekt?)
  • Anti-Aliasing (Umgang mit Darstellungsfehlern durch Rasterung)
  • Transparenz
  • Schatten
  • Reflexionen (Spiegelungen)
  • Refraktion (Lichtbrechung)

Reflexion und Refraktion

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

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 komplexe 3D-Objekte (Modelle)
  
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
Rasterung
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



Abb.: 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. Rasterung

Bei der Rasterung 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 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 Rasterung und Raytracing
Rendering-Verfahren
Rasterung
Raytracing
Allgemein
  • berücksichtigt nur die sichtbaren Objekte einer Szene
  • Farbwert wird durch Interpolation ermittelt
  • berücksichtigt die gesamte Szene
  • Farbwert wird für jeden Bildpunkt einzeln ermittelt
Speicherbedarf
geringhoch
Verdeckungsberechnung
Z-PufferPrimärstrahlen
Schatten
Shadow mapping (Tiefenwerte werden mit einer vorab berechneten Textur, die nur Tiefenwerte aus Sicht der Lichtquelle enthält, verglichen)
Schattenstrahlen
  • auch weiche und transparente Schatten
Reflexionen
Environment mapping (eine Textur, in der die unmittelbare Umgebung abgespeichert ist, wird auf das Objekt abgebildet)Reflexionsstrahlen
  • berücksichtigen auch Objekte außerhalb des Sichtfelds
Refraktionen (Lichtbrechungen)
kein Standardverfahren, oft Environment mapping mit BrechungsindexRefraktionsstrahlen
Globale Beleuchtung
neinja
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 bislang für folgenden Effekte zum Einsatz:
Effekt
Beispiel
Anwendung
Verbesserung der visuellen Darstellung
Rechenaufwand
Globale Beleuchtung
Metro: Exodushochhoch
Reflexionen
Battlefield Vmittelhoch
Schatten
Shadow of the Tomb Raidergeringgering
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 einem der folgenden Grafikchips besitzen:

  • Full-HD (1920x1080): GeForce RTX 2060
  • WQHD (2560x1440): GeForce RTX 2080
  • Ultra-HD (3840x2160): 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


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.

Analoges Signal (schwarz) und digitales Signal mit entsprechenden Näherungswerten (blau)
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.

Übersicht Anti-Aliasing-Verfahren
Verfahren
Qualität
Kantenglättung
Texturqualität
Bewegungs-
unschärfe
Leistung
CSAA/EQAA
gut
gut
befriedigend
MLAA/FXAA
befriedigend
befriedigend

sehr gut
MSAA
sehr gut (nur nicht-transparente Texturensehr gut

4x befriedigend, 8x ausreichend
SMAA
gut
sehr gut

gut
SSAA
sehr gut
sehr gut

4x ausreichend
TAA
sehr gut
ausreichend

befriedigend
CSAA - Coverage-Sampling Anti-Aliasing
MLAA - Morphological Anti-Aliasing
SMAA - Subpixel Morphological Anti-Aliasing
TAA - Temporal Anti-Aliasing
Quellen:  3dcenter.org, computerbase.de 02/2013, computerbase.de 2009
Super-Sample-Anti-Aliasing (SSAA)
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 2x2 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 (MSAA)
Beim Multi-Sample-Anti-Aliasing (MSAA) 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.
Weitere Verfahren
Morphological Anti-Aliasing (MLAA)

Beim Morphological Anti-Aliasing (bei NVidia FXAA - Fast approximate 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.





CSAA (Coverage-Sampling Anti-Aliasing oder EQAA (Extended Quality AA)

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.
Texturfilter
Eine weitere Möglichkeit, Bildstörungen (z.B. Flimmern) zu verringern, 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 (AF)

[image:image-7]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.

  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 nur selten eingesetzt.

Quellen:

Zurück zum Seiteninhalt