Moderne Grafikkarten und 3D

Transcription

Moderne Grafikkarten und 3D
Moderne Grafikkarten und 3D-Grafik
(Vortrag und Ausarbeitung von Kay Ackermann)
22.12.2005, 12:46 Uhr
1
Inhaltsverzeichnis:
1.
1.1
1.2
1.3
3D-Grafik und Grundlagen
Der Aufbau einer 3D-Szene
Szenenobjekte
Grundelemente für die Darstellung einer Szene
2.
2.1
2.2
2.3
3D-Hardware
Die Geschichte der 3D-Grafikkarten von 1996-2005
Technische Details und Statistiken im Überblick
Von der Software auf den Monitor
(Der 3D-Datenfluss bei der Echtzeitdarstellung)
2.4 Probleme und Lösungen bei der Bilddarstellung
von 3D-Inhalten
Seite
3
3
3
4
6
6
6
8
9
3.
3.1
3.2
3.3
3.4
Aktuelle Trends und Techniken
Displacement Mapping
Vertex Mapping
Normal Mapping
HDR
11
12
12
13
13
4.
Schlusswort
14
5.
Informationsquellen
14
6.
Anhang
15
2
1. 3D-Grafik und Grundlagen
1.1 Der Aufbau einer 3D-Szene
Für den Umgang mit 3D-Inhalten, Hardware und Techniken ist
es hilfreich etwas Grundwissen zu besitzen, das mit den nächsten
Zeilen vermittelt werden soll. Eine 3D-Szene kann man mit
einem Set bei Dreharbeiten vergleichen. Man braucht eine
Kamera, oftmals als POV (Point Of View bezeichnet), die
bestimmte Eigenschaften wie z.B. FOV (Field Of View) besitzt,
und wenn möglich auch ein Objekt oder eine ganze Szenerie, die
betrachtet werden soll. Hier im Bild stellt die Kamera (links am
Rand) den späteren POV und die von ihr ausgehende Pyramide das entsprechende FOV dar.
1.2 Szenenobjekte
Für die Erstellung und Präsentation eines Objektes gibt es softwaretechnisch verschiedene
Lösungen, wie zum Beispiel die Darstellung über geschlossene Kurven (Nurbs) welche
besonders gerne für die Modellierung von Figuren für computergenerierte Videos verwendet
wird. Allerdings ist diese Technik ziemlich rechenaufwendig und wird daher nicht direkt von
der Hardware unterstützt. 3D-Grafikkarten verwenden deswegen für die Darstellung
„Polygone“ (Vielecke). Hierbei wird meist ein Objekt als „Mesh“ (Netz) bezeichnet. Ein
Objekt entsteht beispielsweise, indem man Eckpunkte definiert und diese mit Linien
verbindet. Ein Eckpunkt („Vertex“, im Bild rechts unten als blaue Kugeln zu sehen) alleine
kann allerdings nicht dargestellt werden. In der Mathematik wird eine Fläche entweder durch
2 Vektoren und einen Aufpunkt, oder mindestens 3 Punkte im Raum beschrieben. Das
bedeutet, 3 dieser Punkte (Vertize) bilden zusammen eine darstellbare Fläche im Raum die
zusätzlich über ihre Normale noch eine Orientierung besitzt.
Betrachtet man einen Würfel, so braucht man für dessen Darstellung 8
Eckpunkte („Vertize“). Jede Fläche besteht somit aus 4 Eckpunkten,
wobei sich eine Fläche ihre Eckpunkte mit den anderen teilen kann,
d.h. dass ein Vertex zu mehreren (theoretisch beliebig vielen) Flächen
gehören kann. Für die Hardware ist dies insofern wichtig ist, als dass,
abhängig von der Situation, teils über 50% der für eine Fläche
benötigten, geometrischen Berechnungen, gespart werden können.
Auch wenn Objekte aus Polygonen (Vielecken) bestehen, so werden sie für die spätere
Berechnung in lauter kleinere Dreiecke unterteilt. Der Hauptgrund hierfür ist, dass 4 oder
mehr Punkte, die eine Fläche bilden sollen, nicht unbedingt in derselben Ebene liegen
müssen. Tritt dieser Fall ein, so wäre der Aufwand für die Berechnung des auf die
entsprechende Fläche fallenden Lichts deutlich komplexer. Die
Unterteilung in Triangles (Dreiecke) heißt allerdings auch, dass
runde Objekte wie Torbögen oder Kugeln nicht exakt
darzustellen sind. Diese müssen über eine extrem hohe Anzahl
von Vielecken simuliert werden. Ein Mesh in einem Programm
wie 3D-Studio Max oder Maya wird normalerweise über Dreiund Vierecke erzeugt Im Bild links sieht man die verstärkte
Unterteilung an „runden“ Stellen des Objektes.
3
1.3 Grundelemente für die Darstellung einer Szene
Will man nun diese nur im Modell vorhandene Szene in ein Bild umwandeln, so werden als
erstes die Geometriedaten gesammelt und berechnet; danach wird Pixel für Pixel das
eigentliche Bild aufgebaut.
In der Fachsprache bezeichnet man den ersten Vorgang als „Scene Set-Up“ („Transform and
Lightning“ oder „Vertex Set-Up“ bei Grafikkarten), den zweiten als „Rendering“
(Wiedergabe). Das „Rendering“ ist der rechen- und speicherintensivste Vorgang bei der
Erstellung des Bildes. Es gibt inzwischen eine Reihe komplizierter Verfahren den
Rechenaufwand zu verringern, was vor allem Echtzeitberechnungen bei Spielen zu Gute
kommt, wohl aber dem auch zu verdanken ist. Im späteren Verlauf werden diese Techniken
näher beschrieben.
Objekte und eine Kamera alleine ergeben allerdings noch kein lebendiges Bild. Man erhält
lediglich eine relativ monotone Darstellung einfarbiger Objekte. Um etwas mehr Leben in die
Szenerie zu bekommen, benötigt man noch Texturen, Lichter, die die Szene beleuchten, und
entsprechende Schatten, die von diesen Lichtern verursacht werden. Objekte werden im
Allgemeinen mit zwei Grundtexturen (oder Grundeigenschaften) versehen: zum Ersten gibt es
die „Diffuse Texture / Color“ welche die Grundfarbe oder eigentliche Textur des Objektes
bestimmt, und zweitens die „Specular Color / Lightning“, die den Grad der Lichtspiegelung
oder auch das sogenannte „Highlight“ (Glanzpunkt) des Objektes angibt. „Specular Color /
Lightning“ hat zusätzliche Attribute, die die Schärfe und Stärke der Reflektion bestimmen.
Das linke der beiden nachfolgenden Bilder besitzt keinerlei gerichtete Lichtquellen. Das
rechte Bild hingegen besitzt einen Richtscheinwerfer, der die Teekanne beleuchtet. Dabei ist
die helle, fast weiße Stelle auf der Teekanne das Resultat des „Specular Lightning“, der
Reflektion des gerichteten Lichtes durch das Objekt zur Kamera hin.
Szene ohne Texturen, keine gerichtete
Beleuchtung, kein Glanzeffekt
Szene ohne Texturen, dafür mit
gerichteter Beleuchtung und
Glanzeffekt.
Auch wenn das rechte Bild schon besser aussieht, so wirkt es noch extrem künstlich. In der
Realität gibt es nur wenige einfarbige und glatte Flächen. Den Objekten fehlt es noch an
Textur. Das Auftragen oder Einarbeiten von ein oder mehreren Texturen wird als „Mapping“
bezeichnet. Neben der normalen Grundtextur gibt es hierbei noch eine Reihe anderer
spezieller Texturen und Techniken, unter anderem „Bump & Normal Mapping“, auf die im
späteren Verlauf näher eingegangen wird. Beim (Texture) Mapping werden Punkte des
Objektes im 3D-Raum mit Punkten einer 2D-Textur verknüpft, die meist als Bild vorliegt.
4
Das Bild rechts sieht im Vergleich zu den vorhergehenden
Bildern schon deutlich lebhafter aus. Trotzdem wirkt es
immer noch ein wenig künstlich da die Oberflächen der
Objekte extrem glatt aussehen. Diese benötigen für einen
realistischeren Eindruck Tiefe, und um dieses zu
bewerkstelligen verwendet man „Bump Maps“, die über
ein Objekt gelegt werden und den Vektor der
Lichtreflektionen verändern. Wie das folgende Bild zeigt
wirken dadurch die Oberflächen der Objekte deutlich
griffiger und verleihen dem Bild deutlich mehr Flair.
„Bump Maps“ verändern lediglich die Richtung der
Oberflächennormale für die Lichtreflektion des
entsprechenden Bereiches, die Komplexität der Geometrie
des Objektes bleibt gleich. Dass nur der Vektor der
Lichtreflektion verändert wird heißt aber wiederum, dass
„Bump Maps“ auf entsprechend gerichtetes Licht
angewiesen sind, um ihre Wirkung zu erzielen.
Ohne „Bump Mapping“
Mit „Bump Mapping“
Ein Problem der dreidimensionalen Darstellung ist die tiefenunabhängige Schärfe. Das Bild
ist sowohl im Hintergrund als auch im Vordergrund scharf, obwohl aus der Physik allgemein
bekannt ist, dass jede Art von Linsensystemen nur um den Focusbereich herum scharf
erscheint. Hält man sich beispielsweise einen Finger in kurzem Abstand vor die Augen und
konzentriert sich auf ihn, so wird der Hintergrund unscharf. Konzentriert man sich auf den
Hintergrund, so wird der Finger im Vordergrund unscharf. Dieses Manko in der Darstellung
beseitigt die Technik „Depth of Field“ (Tiefenunschärfe). Sie sorgt dafür, dass das Bild nur
im Fokusbereich scharf erscheint und andere Bildelemente mit zunehmendem Abstand zu
diesem immer unschärfer werden.
Tiefenunschärfe ist relativ
neu und wird in
kommenden Spielen wohl
mehr und mehr verwendet
werden, um dem Spieler
während Schnittsequenzen
noch mehr das Gefühl zu
verleihen, „mitten drin statt
nur dabei“ zu sein.
Das Bild im Anhang (6.1.)
zeigt eine
Echtzeitimplementation
dieses Effektes.
5
2. 3D-Hardware
2.1 Die Geschichte der 3D-Grafikkarten von 1996-2005
Die Entwicklung von 3D-Hardwarebeschleunigern began in etwa 1996. Die erste, für
damalige Verhältnisse schnelle Karte, war die 3Dfx Interactive Voodoo1. Nach ihrer
Einführung brachte Nvidia den Riva128 Chip auf den Markt. Durch diesen Konkurrenzkampf
folgen jährlich neue Entwicklungen und mit der Zeit wurde das Marktsegment der 3DHardwarebeschleuniger zu einem, für heute, sehr wichtigen Bereich der Computerindustrie.
Die meisten der Hersteller für 3D-Beschleuniger konnten sich nicht gegen die heutigen
Marktführer Nvidia und ATI durchsetzen.
Boten die ersten 3D-Grafikkarten „nur“ Techniken wie die bilineare Filterung, „MIP
Mapping“ und „Alpha Blending“ (Transparenz), so ist die Liste der Features aktueller Karten
zu lang um sie hier aufzuführen. Im späteren Verlauf dieses Dokuments werden allerdings
einige der neuesten und Imposantesten Techniken noch genauer beschrieben.
Im Anhang (6.2) befindet sich eine Tabelle die die wichtigsten Technischen Spezifikationen
der Grafikkarten zwischen 1996 und 2005 beinhaltet.
Die aktuellste und schnellste Karte ist zur Zeit, Ende des Jahres 2005, die Nvidia GeForce
7800 GTX 512 (G70). Sie verarbeitet 24 Pixel parallel, während ATIs aktuellstes Modell, die
X1800XT, nur 16 Pixel in einem Takt verarbeiten kann. Die GeForce 7800 GTX 512 besitzt
in etwa 300 Millionen Transistoren, während die ATI X1800XT „nur“ 160 Millionen besitzt,
dafür aber etwas höher getaktet wird. Zum Vergleich: Ein Athlon64 X2 (3800+) mit zwei
Kernen besitzt, je nach Größe des internen Pufferspeichers, etwa 160-230 Millionen
Transistoren, ist aber im Grafikbereich bei weitem nicht so schnell wie eine Grafikkarte.
Diese erreichen in ihrem Anwendungsbereich eine Leistung von etwa 1-2 Teraflop, während
ein aktueller Prozessor mit zwei Kernen gerade mal auf etwa 26 Gigaflop im
Fließkommabereich kommt. Inzwischen gibt es einige Ansätze, die Rechenleistung der
Grafikkarten für Berechnungen zu verwenden, die bisher vom Hauptprozessor erledigt
wurden. Im Quellenverzeichnis am Ende dieses Dokumentes befindet sich ein Link zu einer
Meldung des Heise-Verlags, in der von einer Softwarefirma berichtet wird, die den Pixel
Shader in modernen Grafikkarten dazu verwenden will, aufwendige Soundeffekte in Echtzeit
zu berechnen.
2.2 Technische Details und Statistiken im Überblick
14000
60
Füllrate
12000
50
Speicherbandbreite
10000
40
30
6000
20
4000
10
2000
6
Geforce 7800
GTX 512
Geforce 6800
(Ultra)
Geforce FX 5900
(Ultra)
Geforce FX 5800
Nvidia GeForce 4
Nvidia GeForce 3
Nvidia Geforce 2
GTS
Nvidia GeForce
256
Nvidia Riva TNT2
0
Nvidia Riva TNT
0
GB/s
8000
Nvidia Riva 128
MTexels/s
Vergleicht man die Speicherbandbreite und Füllrate, welche
ausschlaggebend für die
Geschwindigkeit der Grafikkarte
sind, so sieht man, dass sich diese
von einer zur nächsten Generation
nahezu verdoppeln. Dies entspricht
übertragen ungefähr einer
Leistungsverdoppelung pro Jahr. In
der Grafik gut zu erkennen ist
Nvidias Speicherproblem der
GeForce 5800 Serie.
Wie schon bei der GeForce 5800 angesprochen, ist die
Wärmeentwicklung der Grafikchips und deren damit nötige
Kühlung eines der größten Probleme aktueller Karten. Meist wird
heute versucht, die warme Abluft direkt nach außen abzugeben,
um das Aufheizen des Rechnerinneren zu verhindern. Eine
Umsetzung dieser Lösung ist am Beispiel der GeForce 7800 GTX
512 (siehe rechts) gut zu erkennen.
600,00
550,00
Transistoren (in Millionen)
500,00
Fertigungstechnik (in nm)
Taktfrequenz (in MHz)
450,00
400,00
350,00
300,00
250,00
200,00
150,00
100,00
50,00
GTX 512
Geforce 7800
(Ultra)
Geforce 6800
Geforce FX 5900
Geforce FX 5800
GeForce 4
GeForce 3
Geforce 2 GTS
GeForce 256
Riva TNT2
Riva TNT
0,00
Riva 128
Die Leistungsaufnahme
eines Chips nimmt etwa
proportional zu seiner
Komplexität und Taktfrequenz zu. Um diese
zu verringern, versucht
man, die Strukturgröße
des Kerns und damit
auch seine Betriebsspannung immer weiter
zu verringern.
Allerdings stieg die Leistungsaufnahme der
Grafikkarten der letzten Jahre extrem an. Die
nachfolgende Grafik zeigt die Leistungsaufnahme
der Grafikkartengeneration des vergangenen
Jahres. Leider finden sich bisher keine Messungen
der aktuellsten Generation, es wird aber
behauptet, dass die diesjährige Generation nicht
mehr Leistung verbraucht, als die des Vorjahres.
Ähnlich wie es AMD im Prozessorbereich
geschafft hat, den Verbrauch seiner Prozessoren,
trotz Leistungssteigerung, zu reduzieren, scheint sich dieser Trend nun auch auf dem
Grafikkartenmarkt breit zu machen.
Technisch gesehen wird es kaum möglich sein, eine noch höhere Leistungsaufnahme der
Grafikkarten vernünftig zu kühlen, da dafür der Bereich, auf dem diese Leistung abgegeben
wird, zu klein ist. Deswegen versuchen Nvidia und ATI die Leistung der Grafikkarten durch
die Kombination mehrerer Karten und Chips zu erhöhen. So hat man mit der Einführung der
GeForce 6800 die Wiederauferstehung der 3Dfx SLI-Technik erleben dürfen, welche
inzwischen in einer ähnlichen Form unter dem Namen „Crossfire“ bei ATI Anwendung
findet. Es wird vermutet, dass die nächste Kartengeneration von Nvidia es erlaubt, 4 GPUs zu
kombinieren, indem auf einer Karte jeweils zwei Chips verbaut und jeweils zwei solcher
Karten über SLI verbindet. Angesichts der aktuellen Leistung der Grafikkarten, gerade im
SLI-Betrieb, kann man in etwa abschätzen, was 4 solcher Chips zusammen gebündelt an
Leistung liefern könnten. Allerdings hat diese Leistung auch ihren Preis: während die 3DGrafikkarten 1997-1998 noch etwa bei 150-220€ für die Spitzenmodelle lagen, kosten
aktuelle Modelle wie die GeForce 7800 GTX 512 alleine schon 650€, was deutlich mehr ist,
als jede Spielekonsole, die momentan auf dem Markt ist. Angesichts dieser Tatsachen stellt
sich die Frage, ob diese Preise wirklich noch gerechtfertig sind und wie die Zukunft für den
PC als Spieleplattform aussehen wird.
7
2.3 Von der Software auf den Monitor (Der 3D-Datenfluss
bei der Echtzeitdarstellung)
In diesem Abschnitt wird etwas näher auf den Ablauf bei der Darstellung von 3DEchtzeitgrafiken eingegangen. Hierbei soll gezeigt werden, wie aus einer Szene, die in einem
Spiel oder einer Anwendung vorliegt, das Bild auf dem Monitor entsteht und welche
Probleme es in den einzelnen Teilschritten gibt.
Bis das Bild auf dem Monitor zu sehen ist, durchläuft es mehrere Phasen. Die Erste befindet
sich in der reinen Software- und CPU-Ebene. Bei Spielen ist dies die sogenannte „Engine“
des jeweiligen Spiels. Diese ist für künstliche Intelligenz, Spielerinteraktion, Physik und
Daten- und Objektverwaltung zuständig. Sie platziert Objekte, Lichter und mögliche Kameras
in der Szene. Anschließend legt die Engine fest, welchen Sichtbereich (FOV) die
auszugebende Ansicht haben soll. Weiterhin berechnet sie, welche Objekte für den aktuell
darzustellenden Zeitpunkt in der Szene überhaupt sichtbar sind. Dies ist extrem wichtig und
oftmals auch die Schwerste einer solchen Engine. Ist hierbei der Rechenaufwand zu hoch, so
bleibt zu wenig Prozessorrechenleistung für die restlichen Elemente der Engine übrig. Ist der
Aufwand zu niedrig oder der Programmcode nicht optimal, so kann es zu unschönen
Bildfehlern kommen oder die Grafikkarte muss Objekte berechnen, die aber für den
Betrachter hinterher nicht sichtbar sind, was unnötig Rechenzeit verbrauchen würde.
Nachdem die Szene erstellt wurde, wird ihr aktueller Zustand an die Grafikkarte geschickt.
Das bedeutet, alle Objektdaten, Texturen, Lichtdaten, „Vertex“- und „Pixelshader
Funktionen“, die ausgeführt werden sollen, müssen der Karte übergeben werden. Die
nachfolgende Grafik zeigt was dort mit diesen Daten passiert und wie diese von der „3DPipeline“ einer Aktuellen Grafikkarte verarbeitet werden.
Die „3D-Pipeline“ (im deutschen am ehesten „Leitung oder Anschlusskanal“ genannt), ist
eigentlich eine Ansammlung vieler paralleler „Pipelines“, die in der Lage sind, unabhängig
voneinander die Geometrie und Texturdaten gleichzeitig zu verarbeiten. Heute werden, wie
zum Beispiel bei der GeForce 7800 GTX 512, bis zu 24 solcher „Pipelines“ verbaut. Einer
Schätzung zufolge soll die nächste Generation 32 bis 48 „Pipelines“ besitzen.
Der Arbeitsablauf (siehe Grafik im Anhang 6.3) in einer „Pipeline“ sieht in etwa wie folgt
aus:
Die Geometriedaten der Szene werden vom Vertex Shader verarbeitet. Dieser berechnet für
jeden Eckpunkt die evtl. nötige Translation (Verschiebung), sowie dessen Grundfarbe und
Helligkeit.
Für die Translationen können dabei kleine „Shader“-Programme geschrieben werden, welche
dann situationsbedingt die Geometrie eines Objektes verändern. Ein Beispiel hierfür wären
unterschiedliche Gesichtsausdrücke einer Figur in einem Spiel. Bevor die Vertize in
Polygonen zusammengefasst den Vertex Shader verlassen, berechnet dieser noch anhand der
Vertex-Daten den Farb- und Helligkeitsgradienten über je einzelnen Polygone. Dieser
Vorgang nennt sich „Shading“ (Schattierung).
Nach der Verarbeitung durch die Vertex Shader werden die Geometrieinformationen an die
Textur- und Pixelshader-Pipeline weiter gereicht. Diese versieht die einzelnen Polygone mit
Texturen.
Im letzten Schritt wird dann die gesamte Szene für den Monitor ausgewertet. Dabei wird für
jeden später auf dem Monitor sichtbaren Pixel der entsprechende Farb- und Tiefenwert (ZWert) in den Bildspeicher geschrieben. Transparente Pixel im Vordergrund werden dabei mit
den dahinter liegenden Pixeln gemischt („Alpha Blending“). Anschließend können die PixelDaten im Speicher nochmals mit Hilfe des „Pixelshader“ nachträglich verändert werden.
8
Ist dies geschehen, so wird das Bild in den „Front Buffer“ kopiert, dessen Inhalt regelmäßig
an den Monitor übertragen wird. Hierzu sei gesagt. dass es zwei Bildspeicher gibt, den sog.
„Front Buffer“ und den „Back Buffer“, zwischen denen im Normalfall einfach hin und her
geschaltet wird. Während das Bild aus dem „Front Buffer“ an den Monitor geschickt wird,
zeichnet die Grafikkarte ohne Unterbrechung die nächsten Bilder in den „Back Buffer“, der
bei jedem neuen Bild überschrieben wird.
2.4 Probleme und Lösungen bei der Bilddarstellung von
3D-Inhalten
Der nun folgende Abschnitt soll einen kleinen Überblick über die Probleme der 3DDarstellung geben. Die größten Probleme entstehen dabei bei der Darstellung der
Objekttexturen und Kanten.
Um eine korrekte Darstellung der Textur auf dem Objekt zu erhalten benötigt man diese in
verschiedenen Detailgraden. Diese werden als „MIP Maps“ („Multum Im Parvo“ - „vieles in
einem“) bezeichnet. So liegt beispielsweise eine Wandtextur in 512x512, 256x256,…,32x32
Pixel vor, und je nach Entfernung zur Kamera wird eine entsprechend aufgelöste Textur
verwendet. Dies ist nötig, da es bei einer fein detaillierten Textur mit zunehmendem Abstand
zur Kamera sonst zu Artefakten (Bildanomalien) kommt. Diese kommen daher, dass die
Auflösung des Monitors deutlich geringer ist, als die der Textur, womit die Textur nicht mehr
korrekt dargestellt werden kann. Hier gilt dasselbe Theorem von Nyquist, wie es auch im
Audiobereich bei der Digitalisierung analoger
Signale bekannt ist. Es besagt, dass für die korrekte
Aufzeichnung eines Signals (hier: der Textur) die
Aufzeichnungsfeinheit (Sample Rate) doppelt so
hoch sein muss, wie das aufzuzeichnende Signal
(mehr Informationen dazu findet man unter dem
Stichwort „Nyquist“ auf www.wikipedia.de). Für
die Bilddarstellung heißt dies also, dass Texturen
nicht mehr Details besitzen sollten, als später auf
dem Monitor ausgegeben werden kann. Das
nachfolgende Bild zeigt, was mit einer
Linienmustertextur passiert, die nur einen
Detailgrad besitzt.
Man sieht sehr schön, dass mit zunehmendem Abstand zur Kamera die Textur mehr und mehr
fehlerhaft dargestellt wird. Theoretisch müsste die Fläche nach hinten einen mittelhellen
Grauton annehmen, allerdings wird für die Farbausgabe ohne Filterung und MIP-Mapping
einfach der nächstliegende Farbwert der Textur genommen.
Dreht man den Fall jetzt um, sprich, besitzt die Textur deutlich weniger Auflösung, als sie für
die Darstellung bräuchte (zu vergleichen ist dies als würde man in einem Spiel sich direkt vor
die Wand stellen), dann würde diese ohne eine Art von Filterung extrem grob und verblockt
aussehen. Außerdem kommen bei der einfachen Vergrößerung ähnliche Präzisionsprobleme
zum Tragen, wie bei der starken Verkleinerung von Texturen. Die folgenden zwei Bilder
zeigen eine Teekanne mit einem Karomuster, allerdings wird im linken Bild die Textur nicht
gefiltert, während sie im rechten durch den Texturfilter geglättet wird.
9
Die wohl bekannteste Filterung ist die „bilineare“ Filterung, bei der für den zu zeichnenden
Bildpunkt die 4 nächstliegenden Pixelmittelpunkte und deren Farben verwendet werden. Die
endgültige Farbe des entsprechenden Bildpunktes entsteht dabei aus dem gewichteten
Mittelwert dieser vier umliegenden Punkte. Die Gewichtung erfolgt dabei über ihren
jeweiligen Abstand zu der Position des Bildpunktes auf dem Objekt. Dies sorgt für weiche
Übergänge beim Vergrößern der Textur und beugt, bis zu einem gewissen Grad, der
Entstehung von Anomalien bei der Verkleinerung vor. Der Nachteil hierbei ist, dass die
Texturen alle etwas unschärfer und verwaschener wirken.
Verwendet man „MIP Maps“, so kann man auf Flächen, die schräg in den Hintergrund laufen,
wie z.B. dem Boden oder den Wänden eines Raumes, Grenzen erkennen, bei denen die
Umstellung von einer detaillierten zu einer etwas weniger detaillierten Textur erfolgt.
Um diesen Effekt zu verringern wurde die trilineare Filterung entwickelt. Dabei wird zur
bilinearen Filterung noch die nächst größere und kleinere Texturvariante (MIP Map) mit
einbezogen. Zwar verschwinden durch diese Art der Filterung die unschönen Detailgrenzen,
allerdings werden entfernte Texturen zu stark verwaschen und das Bild verliert deutlich an
Schärfe. Außerdem kann es trotzdem noch zu Anomalien in weit entfernten Texturen
kommen. Die anisotrope Filterung, die etwa mit dem Erscheinen der Nvidia TNT verfügbar
war, beseitigt genau dieses letzte Problem. Diese hat dem Namen nach „nicht in alle
Richtungen hin die gleichen“ Eigenschaften. Sie beseitigt die Schwächen von bi- und
trilinearer Filterung, die auftreten, wenn der Betrachter nicht annähernd senkrecht auf das
Polygon schaut, was sich aus Gründen der Perspektive in einer 3D-Szene nicht vermeiden
lässt. Hierbei werden für die Filterung
deutlich mehr Texturdetailvarriationen
(Textursamples, kurz „taps“) verwendet,
als bei der bi- oder trilinearen Filterung
(maximal bis 128 pro Pixel).
Das folgende Bild demonstriert die
Unterschiede der verschiedenen
Filtermethoden und deren
Kombinationen.
Das letzte Problem, das hier erwähnt werden soll, ist die Stufenbildung an schräg
verlaufenden Kanten von Objekten. Diese Stufen entstehen dadurch, dass je ein Pixel des
ausgegebenen Bildes zu genau einem Objekt der Szene gehört. An der Grenze eines schräg
liegenden Objekts kommt es daher zu Bereichen, in denen die Zugehörigkeit eines Pixels zu
einem Objekt nur noch auf Rundungsfehler zurückzuführen ist. Für die Lösung dieses
Problems wurden im laufe der Jahre diverse Techniken entwickelt. Das Grundprinzip dabei
ist, das Bild in einer höheren Auflösung zu berechnen („Rendern“) als es später gebraucht
wird. So versteht man zum Beispiel unter einem 2-fach Anti-Aliasing, dass ein 640x480 Pixel
großes Bild mit 1280x960 Pixel berechnet und anschließend auf die gewünschte Anzahl Pixel
heruntergerechnet wird. Ein Bildpunkt des 640x480 Pixel großen Ausgabebildes besteht somit
aus dem gewichteten Mittelwert der vier Pixel des Bildes mit der Auflösung 1280x960. Dort,
wo früher noch eine harte Stufe zu sehen war, entsteht durch diese Technik eine Vielzahl von
Farbabstufungen an der eigentlichen Kante, wodurch sie nicht mehr so stark heraus sticht.
Heutige Grafikkarten beherrschen bis zu 16-fach Anti-Aliasing, was für ein schönes weiches
10
und an Kanten stufenfreies Bild sorgt. Ein weiterer Nebeneffekt dabei ist, dass dünne Linien,
die unter Umständen nicht mehr Korrekt auf dem Bildschirm dargestellt werden würden,
durch das Zeichnen in der höheren Auflösung noch erfasst werden und ihre Details in das
daraus resultierende herunter gerechnete Bild einfließen.
Es existieren diverse Variationen des Anti-Aliasing, die sich auch bezüglich ihrer Resultate in
der Bildqualität unterscheiden. Die bekanntesten Implementationen sind:
Edge Anti-Aliasing (3Dfx Voodoo2)
FSAA (Full Screen Anti-Aliasing, ab Nvidia TNT, ab ATI Radeon)
AAA (Adaptive Anti-Aliasing, GeForce 3-5, ATI X800 – X1800)
TAAA (Transparency Adaptive Anti-Aliasing, GeForce 5-7)
Das Edge-, oder auch kantenbasierte Anti-Aliasing, wurde erstmals von der Voodoo2
verwendet und kam etwas später durch Nvidia als „Adaptive Anti-Aliasing“ auf den Markt.
Es wird dabei versucht, nur Kanten und nicht Texturen zu glätten, um die Texturen nicht
unschärfer zu machen, als sie bisher schon sind (siehe bi- oder trilineare Filterung).
Das „Full Screen Anti-Aliasing“ hingegen berechnet das gesamte Bild in zwei-, vier-, achtoder heute sogar sechzehnfacher Größe, um es später, wie bereits beschrieben, auf die
eigentliche Ausgabegröße herunterzurechnen. In der Softwaretechnik wird dieses Verfahren
oftmals auch als „Super Sampling“ bezeichnet und hat den Nachteil, dass die allgemeine
Bildschärfe abnimmt und Details in Texturen verloren gehen.
„Transparency Adaptive Anti-Aliasing“, kurz TAAA, ist ein Zusatz für das „Adative AntiAliasing“. Da beim AAA bekanntlich nur Objektkanten geglättet werden, nicht aber Texturen,
gibt es Fälle, in denen auch Texturen geglättet werden müssen. Ein einfaches Beispiel wäre
hierfür ein Maschendrahtzaun. Da die Darstellung jedes einzelnen Drahtes als geometrisches
Objekt zu rechenintensiv wäre, verwendet man für solche Fälle teiltransparente Texturen, die
über eine Fläche gelegt werden. Allerdings stellt das Gitter somit keine geometrische Kante
dar, sondern ist eben lediglich eine transparente Textur und wird somit nicht vom „Adaptive
Anti-Aliasing“ behandelt, wodurch in diesen Bereichen es zu den bekannten Treppen oder
Stufenbildungen kommt. TAAA greift genau hier ein und glättet auch Kanten, die durch
Texturtransparenz verursacht werden. Allerdings scheinen aktuelle Nvidia Treiber noch
Probleme mit dieser Technik zu haben, so dass unter Umständen, anstatt der unschönen
Kanten, die gesamte Textur entfernt wird. Es ist aber davon auszugehen, dass diese Probleme
mit den kommenden Treibern behoben werden.
3. Aktuelle Trends und Techniken
Da die Software meist etwas bei der Implementierung der neusten Techniken hinterher hängt,
oder diese nicht umsetzen kann, da ein entsprechender Effekt zwar theoretisch möglich wäre,
die Performance der Karte aber nicht ausreicht, ist oftmals nur alle 2 Jahre ein größerer
Sprung in der Grafik von Spielen zu beobachten. Dies liegt teils auch daran, dass viele Spiele
auf der gleichen „Engine“ basieren, die von einem Hersteller regelmäßig weiter entwickelt
und vermarktet wird. Als Beispiel seien hier die Unreal oder Quake Engine genannt. Mit dem
Anfang des nächsten Jahres wird sich wieder solch ein Sprung stattfinden. Zu erwarten sind
realistischere Schattenwürfe, Lichtanimationen, Materialien welche Licht beugen, brechen
oder ausstrahlen, sowie echte Wolken, die nicht nur durch halbtransparente Texturwände
simuliert werden, sondern einen dreidimensionalen Körper besitzen. Die interessantesten
Techniken für die nächst Zeit dürften „Displacement Mapping“, „Vertex Mapping“,
„Normal Mapping“ und „HDR“ sein. Ihre Funktionsweise und Anwendungsbereiche in
neuen Spielen, werden in den kommenden Abschnitten etwas näher erläutert.
11
3.1 Displacement Mapping
Das „Displacement Mapping“ ist eine Technik die verwendet wird, auf einfache Art und
Weise das Geometriedetail der Szene zu erhöhen. Hierbei wird vom Designer eine
Höhentextur für ein Objekt erstellt, welche später verwendet wird um die Vertize eines
Objektes oder einer Fläche entlang ihres Normalenvektors zu versetzen. Bisher musste dabei
die entsprechende Fläche eines Objektes in viele kleine Flächen unterteilt werden, da sonst
nicht genug Vertize für die korrekte Darstellung vorhanden waren. Die kommende Unreal 3
„Engine“ ist in der Lage, Flächen nur dort zu unterteilen, wo auch eine Verschiebung der
Vertize stattfinden soll. Dies kommt der Geschwindigkeit zu Gute. Die Technik selbst, eignet
sich extrem, das Geometriedetail der Szene zu erhöhen, ohne viel Zeit in langwieriges
modellieren von Objekten zu stecken. Statt jeden Ziegel einer Mauer einzeln in die Szene zu
modellieren, wird einfach eine ebene Fläche mit einer „Displacement Map“ versehen, welche
sich relativ leicht aus der sowieso für die Wand nötigen Textur erstellen lässt.
Der Nachteil des „Displacement Mapping“ ist allerdings, dass es für die „Engine“ des Spieles
schwer ist, für Objekte, die von diesem Verfahren Gebrauch machen, Kollisionstests
durchzuführen, da so entstandene Auswölbungen an dem Objekt erst von der Grafikkarte
berechnet werden.
3.2 Vertex Mapping
Das „Vertex Mapping“ ist eine weitere Möglichkeit die Geometrie der Szene zu verändern.
Dies findet, wie beim „Displacement Mapping“, schon in der „Vertex Shader“ Einheit der
Grafikkarte statt. Das Verfahren ist dabei Analog zu dem des „Displacement Mapping“,
erlaubt dafür aber die Anwendung von animierten Texturen. Anwendungsbeispiele für diese
Technik finden sich z.B. in der Animation und Darstellung von Wasseroberflächen.
Die folgenden zwei Bilder stammen aus dem Spiel „Pacific Fighters“ und dienen als Beispiel
für „Displacement“ und „Vertex Mapping“.
ohne Vertex Mapping
mit Vertex Mapping
12
3.3 Normal Mapping
Mit die interessanteste Technik, die in den kommenden Spielen Anwendung findet, ist das
„Normal Mapping“. Versieht man ein Objekt mit einer solchen „Normal Map“, verändert sich
die Richtung des von einem Objekt reflektierten Lichts. Durch die draus entstehenden
Schattierungen gewinnt das Objekt, ähnlich wie beim „Bump Mapping“, an Tiefendetails. Für
die Erstellung einer “Normal Map“ werden 2 Versionen des Objektes erstellt (siehe Anhang
6.4). Eine mit sehr vielen und eine weitere mit vergleichsweise wenigen Geometriedetails.
Durch die Subtraktion der beiden Modelle entsteht dabei eine Textur mit der Höhendifferenz
der beiden Objekte, die als „Normal Map“ verwendet werden kann. Für Spiele bedeutet diese
Technik, dass es möglich ist Objekte zu erstellen, die extrem detailliert aussehen, in
Wirklichkeit allerdings nur aus wenigen Polygonen bestehen. Im Anhang befinden sich einige
Bilder aus der Unreal 3 „Engine“ welche ausgiebig gebrauch von dieser Technik macht.
3.4 HDR
Eine weitere, leistungsfähige Technik, die Bildqualität zu verbessern, ist „High Dynamic
Range“, kurz „HDR“. Hierbei versucht man, das grundsätzliche Darstellungsproblem
bezüglich des Farb- und Helligkeitsspektrums von Monitoren zu korrigieren. Der Hintergrund
liegt dabei in den begrenzten Fähigkeiten der Monitore, Kontraste darzustellen. Sie sind in
ihren Eigenschaften der Bildreproduktion zu beschränkt, um eine wirklich realitätsgetreue
Darstellung zu erlauben. Für einen Monitor ist es zum Beispiel nicht möglich, die helle
Überblendung, die entsteht, wenn man in eine extrem helle Lichtquelle wie die Sonne oder
einen Suchscheinwerfer sieht, wiederzugeben. Durch geschickte Manipulation der Kontrastund Farbkurven versucht „HDR“, dieses Problem zu umgehen. Das Bild bekommt dabei
meist sattere Farben und höhere Kontraste zwischen beleuchteten, hellen und dunklen
Bildbereichen. Auch erlaubt diese Technik, extrem helle Objekte oder Bildbereich mit einem
Glühen oder Überblenden zu versehen. Dabei wird über die eigentlichen Grenzen des hellen
Bildbereiches hinaus die Umgebung bis zu einem bestimmten Abstand hin zusätzlich
aufgehellt. Die dabei entstehenden Resultate sind nicht zu verachten. Bisher wird „HDR“ nur
in wenigen „Engines“ (Half Life 2, Far Cry, F.E.A.R.) verwendet, allerdings wird „HDR“
zweifellos ein Muss für kommende Spiele werden.
Unreal 3 & HDR
13
4. Schlusswort
Wie man also unschwer erkennen kann sind moderne Spiele nicht nur „spielereien“ sondern
der Motor für die Entwicklung eines ganzen Marktsegmentes. Die technischen Innovationen
und der Forschungsaufwand in diesem Bereich sind ohne Zweifel enorm. Gerade die
Entwicklung neuer Techniken für die Darstellung dreidimensionaler Bildinhalte ist extrem
komplex. Würde man versuchen, nur 50% der im laufe der Zeit entstandenen Techniken,
Effekte und deren mathematische Hintergründe zu erklären, könnte man damit inzwischen
mehrere Bücher füllen.
Sinn und Zweck dieses Dokumentes war es jedoch, „nur“ einen Überblick über moderne
Grafikkarten und 3D-Grafik zu vermitteln.
Im Anhang befinden sich noch ein paar Bilder, die Ausblicke auf aktuelle und kommende
Spiele Zeigen, sowie eine Liste an Internetadressen, deren Informationen für die Erstellung
dieses Dokumentes verwendet wurden.
5. Informationsquellen
3D-Lexikon:
3D-Pipeline:
ATI 3D-Demos:
Nvidia History:
Technik & Tests:
http://www.tecchannel.de/technologie/komponenten/401409/
http://www.extremetech.com/article2/0,1697,464440,00.asp
http://www.ati.com/developer/demos.html
http://www.gamergod.com/article.php?article_id=149
http://www.computerbase.de/
Seminar über GPUs / 3D-Effekte:
http://wwwisg.cs.uni-magdeburg.de/~spindler/wiki/ShaderSeminar2005/
Grafikkarten und Grafikchips im Überblick:
http://www.rojakpot.com/default.aspx?location=3&var1=88&var2=0
http://www.pc-erfahrung.de/Index.html?Menu/Menu_Grafikkarte.html
Heise News: Grafikchips berechnen Soundeffekte:
http://www.heise.de/newsticker/result.xhtml?url=/newsticker/meldung/50667
Ageia PhysX: Physikprozessoren sollen die CPU in Zukunft entlasten:
http://www.pcper.com/article.php?aid=140
http://www.golem.de/0509/40214.html
14
6. Anhang
6.1 Depth of Field
6.2 Übersicht über die Grafikchips von 1996-2005
Die Nachfolgende Tabelle gibt einen Überblick über den Werdegang der verschiedenen
Grafikchips von denen einige im vorherigen Abschnitt schon kurz erwähnt wurden.
Karte
ATI 3D Rage II
3Dfx Voodoo 1
Riva 128
3Dfx Voodoo 2
Riva TNT
ATI Rage 128
Riva TNT2
3Dfx Voodoo 3000
GeForce 256
Geforce 2 GTS
ATI Radeon
3Dfx Voodoo 5500
GeForce 3
ATI 8500
GeForce 4
ATI 9700
Geforce FX 5800
ATI 9800 PRO
Geforce FX 5900
Geforce 6800 (Ultra)
X800 XT
X1800XT
Geforce 7800 GTX 512
Chip
SST1
NV3
NV4
NV5
NV10
NV15
R100
VSA-100
NV20
R200
NV30
R300
NV30
R350/R360
NV35
NV40
R420
R520
G70
erschienen
Ende 96
Apr 97
Anfang 98
Mrz 98
Feb 99
Mai 99
Frühjahr 99
Aug 99
Apr 00
Apr 00
Mai 00
Feb 01
Aug 01
Feb 02
Jul 02
Jan 03
Mrz 03
Mai 03
Apr 04
Mai 04
Sep 05
Nov 05
Fertigung
500nm
500nm
350nm
350nm
350nm
250nm
250nm
250nm
220nm
180nm
180nm
220nm
150nm
150nm
150nm
150nm
130nm
150nm
130nm
130nm
130nm
90nm
110nm
15
Komplexität
3,5M
7M
8M
15M
23M
25M
23M
14M
57M
60M
63M
107M
125M
115M
135M
222M
160M
321M
302M
3D-API
Glide
DirectX
Glide
DirectX 6.0
DirectX 6.0
DirectX 6.0
Glide
DirectX 7.0
DirectX 7.0
DirectX 7.0
Glide
DirectX 8.0
DirectX 8.1
DirectX 8.0
DirectX 9.0
DirectX 9.0
DirectX 9.0
DirectX 9.0
DirectX 9.0c
DirectX 9.0
DirectX 9.0c
DirectX 9.0c
Schnittstelle
PCI
PCI
PCI/AGP
PCI
PCI/AGP
PCI/AGP
PCI/AGP
AGP
PCI/AGP
AGP
PCI/AGP
AGP
AGP
AGP
AGP
AGP
AGP
AGP
AGP
AGP/PCIe X16
AGP/PCIe X16
PCIe X16
PCIe X16
Karte
ATI 3D Rage II
3Dfx Voodoo 1
Nvidia Riva 128
3Dfx Voodoo 2
Nvidia Riva TNT
ATI Rage 128
Nvidia Riva TNT2
3Dfx Voodoo 3000
Nvidia GeForce 256
Nvidia Geforce 2 GTS
ATI Radeon
3Dfx Voodoo 5500
Nvidia GeForce 3
ATI 8500
Nvidia GeForce 4
ATI 9700
Geforce FX 5800
ATI 9800 PRO
Geforce FX 5900 (Ultra)
Geforce 6800 (Ultra)
X800 XT
X1800XT
Geforce 7800 GTX 512
VSU
VS
PP
TP
PS
=
=
=
=
=
VSU
1
1
1
1
1
1
1
1
1
2
2
4
3
4
3
6
6
8
8
VS
TnL
TnL
TnL
1.1
1.1
1.1
2.0
2.0+
2.0
2.0+
3.0
2.0
2.0
3.0
PP / TP
1x1
1x1
1x1
1x2
1x2
2x1
1x2
1x2
4x1
4x2
2x3
2x1x2
4x2
4x2
4x2
8x1
8x1
8x1
8x1
16x1
16x1
16x1
24x1
PS
1.0
1.4
1.3
2.0
2.0+
2.0
2.0+
3.0
2.0++
3.0
3.0
Prozessor (MHz) Füllrate (MTexels/s)
50
50
100
100
90
180
90
180
103
205
125
250
166
333
120
480
200
1600
183
1098
166
666
200
1600
275
2200
300
2400
275
2200
500
1700
380
3040
450
3600
400
6400
500
8000
625
10000
550
13200
Speicherbusbreite
64bit
128bit
64bit
128bit
128bit
128bit
128bit
128bit
128bit
128bit
128bit
128bit
128bit
128bit
256bit
128bit
256bit
256-bit (4x64bit)
256-bit (4x64bit)
256bit
256bit
256-bit (4x64bit)
Speicher (MHz)
83MHz SDR
50MHz EDO
100 MHz SDR
EDO
110Mhz SDR
103 MHz SDR
166MHz SDR
166MHz SDR
150MHz SDR / DDR
166MHz DDR
183MHZ DDR
166MHz SDR
230 MHz DDR
275MHz DDR
325 MHz DDR
270 MHz DDR
500 MHz DDR II
350MHz DDR II
425 MHz DDR
550 MHz GDDR III
500 MHz GDDR III
750MHz GDDR III
850MHz GDDR III
Vertex Shader Einheiten
Vertex Shader Version
Pixel Pipleines (Begriffserklärung folgt später)
Texture Pipelines
Pixel Shader Version
Anmerkung:
Wie man aus der oberen Tabelle erkennen kann, so wurden mit der Einführung des Pixel
Shaders die zusätzlichen „Texture Pipelines“ unnötig, wurden allerdings noch eine Zeit lang
weiter verbaut um die Kompatibilität bezüglich der Geschwindigkeit bei älteren Spielen zu
gewährleisten. Diese verwendeten oftmals eine zweite Textur um Lichteffekte zu simulieren
weswegen sich ohne die zweite Textureinheit die Leistung der Grafikkarte halbiert hätte.
6.3 Die 3D-„Pipeline“
Vertex Shader
(6 parallel)
Pixel Shader
(16 parallel)
Speicher
(Anbindung)
16
6.4. „Normal Mapping“
6.5. Bilder aus aktuellen Spielen
X3 – Reunion (Egosoft)
17
X3 – Reunion (Egosoft)
X3 – Reunion (Egosoft)
18
X3 – Reunion (Egosoft)
X3 – Reunion (Egosoft)
19
X3 – Reunion (Egosoft)
20
Unreal 3 (Epic Megagames)
Unreal 3 (Epic Megagames)
21
Unreal 3 (Epic Megagames)
Unreal 3 (Epic Megagames)
22
Unreal 3 (Epic Megagames)
Unreal 3 (Epic Megagames)
23
Unreal 3 (Epic Megagames)
24
Unreal 3 (Epic Megagames)
25
Unreal 3 (Epic Megagames)
26