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