Spielegrafik im Wandel: Die Shader-Revolution mit High Dynamic Rendering, Ambient Occlusion und Global Illumination (Teil 2)
Der zweite Teil unserer Serie Spielegrafik im Wandel ist hauptsächlich den Möglichkeiten gleitkommagenauer Rechenwerke und Pufferspeicher gewidmet. Außerdem werfen wir einen Blick auf die Bedeutung von Schatten. Außerdem geht es um realistische Beleuchtung, das "Problem realistischer Grafik" und wir geben einen Ausblick, was für Programmierer und Grafiker noch zu tun ist.
In diesem Artikel
Im ersten Teil unserer zuvor in der Printausgabe von PC Games Hardware veröffentlichten Reihe "Spielegrafik im Wandel" haben wir erfolgreich die Geburtswehen der 3D-Grafik überstanden und die Konsolidierung der zunächst arg zersplitterten Programmierschnittstellen miterlebt. Danach warfen wir einen Blick auf einfache Textureffekte. Stehen geblieben sind wir bei den ersten Shader-Effekten; dort nehmen wir nach einem kurzen Rückblick den Faden wieder auf.
Rückblick: Der Aufstieg von Direct X
Nachdem Microsoft nicht nur dem Multimedia-, sondern auch dem 3D-Trend hinterherhecheln musste, legten die Redmonder mit Direct X in schneller Folge Schnittstellenpakete (APIs) vor, mit denen Windows zukunftstauglich gemacht werden sollte - natürlich waren die ersten Versuche alles andere als perfekt, aber der Win-/DOS-Konzern lernte schnell und konnte im Gegensatz zum trägen Open-GL-Konsortium flexibel agieren, da man die alleinige Kontrolle über die Schnittstelle hatte. Spätestens in Version 6 war Direct X eine ernst zu nehmende Alternative zu Open GL und 3Dfx' Glide geworden, und mit Version 7 inklusive des erstmals im DX-Universum unterstützten Hardware-TnLs trat die Windows-API ihren Siegeszug an. Die logische Folge: Immer mehr Spiele nutzten Direct X und dank fortschrittlicher Entwicklerwerkzeuge stieg auch die optische Qualität. Von simplen Mehrschichttexturen, die zum Beispiel einen Lichtschein oder feine Details simulieren sollten, wurde schnell der Schritt zu weit effizienteren Techniken gemacht, die das Licht mit in die Oberflächendarstellung einbezogen. Die Rede ist vom Bump-Mapping und das erlebte in seinen verschiedenen Formen mit Direct X 8 einen wahren Boom.
Die ersten Shader, Teil 2
Unter dem Begriff Shader, ins Deutsche oft nur unzureichend als "Schattierer" übersetzt, versteht man einerseits die Rechenwerke im Grafikchip, andererseits aber auch die Programme, welche diese nun ausführen konnten. Richtig gelesen: Die Chips führen in einer Hochsprache geschriebene und zur Laufzeit in Maschinensprache übersetzte Programme aus und nähern sich dadurch einen ersten Schritt an den Hauptprozessor an. Shader gab es zunächst für Geometrie- und Pixeldaten als Vertex- und Pixelshader.
Mit Direct X hatte sich ein einheitlicher Programmierstandard etabliert und auch der Grafikkarten-Markt war in Sachen Anbieter stark geschrumpft. 2001 spielten für anspruchsvolle Grafik eigentlich nur noch Nvidia mit seiner Geforce und Ati mit der Radeon eine Rolle. Entwickler brauchten bei der Programmierung also nicht mehr auf Myriaden verschiedener Fähigkeiten Rücksicht zu nehmen, wenn sie denn überhaupt einen DX8-Pfad vorsahen. Für das "DX8 compliant"-Gütesiegel mussten einige vorgegebene Merkmale erfüllt werden, die sich größtenteils an Nvidias NV20-Chip in der Geforce 3 ausrichteten. Die etwas später erschienene Radeon 8500 konnte in Sachen Shader-Fähigkeiten noch einen drauflegen und beherrschte mit Pixelshader 1.4 die höchste Ausbaustufe der DX8-Hardware - Nvidias Karten kamen maximal auf PS1.3. In Spielen hatte das nur geringe Auswirkungen - zumeist konnte ein auf die Radeon angepasster Pfad etwas effizienter arbeiten, da ein Schreib-/Lesevorgang in einen Puffer entfallen ist. Echte optische Unterschiede wie im Screenshot-Vergleich im Anschluss waren allerdings die Ausnahme.
Die Anfänge der Pixelshader - nur größtenteils einheitlich: Schon in der ersten Shader-Generation DX8 gab es Unterschiede zwischen Radeon und Geforce. Meist beschränkten sich die Entwickler auf den kleinsten gemeinsamen Nenner oder nutzten PS1.4 dazu, weniger Rendering-Passes durchzuführen (Doom 3, 3D Mark 03). Spiele mit optischen Unterschieden wie Max Payne 2 (unten) blieben die Ausnahme.
Die Direct-X-9-Revolution
Mit Nvidias Geforce 3, der Ti-Version der Geforce 4 sowie Atis Radeon 8500 bis 9280 schufen die Hersteller eine breite Basis shader-bewehrter Grafikkarten, welche die Entwicklung entsprechend angepasster Titel ermöglichte. Per Pixelshader realisierte Effekte gehörten zum guten Ton und auch die speziell hardgecodeten Bump-Mapping-Varianten der Vergangenheit ließen sich problemlos über die recht freie Konfigurierbarkeit von Textur- und Pufferzugriffen lösen. Eine Eigenschaft jedoch fehlte: hohe Genauigkeit. Mit Direct X 8 und der zugehörigen Hardware liefen fast alle Berechnungen in einem Fixed-Point-Format ab und auch die Zwischenspeicher waren auf diese Datentypen ausgelegt. Mit Direct X 9 jedoch sollten die Shader-Einheiten deutlich mächtiger werden und neben zusätzlichen Instruktionen auch wesentlich längere Programmsequenzen verdauen können. Zwar wurden auch die Fähigkeiten erweitert, ohne häufiges Zwischenspeichern in den Grafik-RAM auszukommen, doch die kleinen, bisher noch durchaus tolerablen Rundungsfehler beim Verrechnen der Daten konnten sich in den langen Shaderprogrammen trotzdem schnell summieren.
Quelle: PC Games Hardware
Far Cry war eines der ersten Direct-X-9-Spiele, das alle Bildqualitätsregister zog und (nicht nur) damit zum Überraschungshit 2004 avancierte.
Folgerichtig bietet Direct X 9 die Möglichkeit, sowohl bei den Berechnungen als auch für Pufferspeicher ein Gleitkommaformat ("FP") zu nutzen - mindestens sind FP24 erforderlich, optional durften Entwickler FP16 anfordern. Dabei handelt es sich um Formate, bei denen für jeden der drei Farbanteile sowie den Transparenzkanal die volle Bitzahl zur Verfügung steht - anders als beim zuvor aktuellen 32-Bit-Rendering, wo lediglich 8 Bit pro Komponente vorhanden waren. Im Marketing wurden die Bittiefen natürlich allzu gern zu 64-, 96- oder gar 128-Bit-Rendering addiert.
Doch wozu ist das Ganze am Ende gut und wieso ist dieser Absatz mit "Revolution" überschrieben? Mit dem Schritt zur Gleitkommagenauigkeit wurde gleichzeitig der Weg zu all den Effekten geebnet, die heute in Spielen gang und gäbe sind. Zum Beispiel wurde das inzwischen sehr beliebte Bump-Mapping verfeinert. Daraus entstand zum Beispiel das Normal-Mapping, das nicht nur grobe, sondern auch sehr feine Strukturdetails auf geometrisch grobe Oberfläche zaubern kann. Das geschieht, indem die Detailinformationen aus einer Textur bezogen werden, welche der Entwickler aus dem Original-Modell erzeugt, bevor dieses für die Verwendung im Spiel unter Verlust der genauen Details heruntergerechnet wird.
HDR-Rendering: Age of Empires 3 trifft die Auswahl des HDR-Formates anhand der technischen Fähigkeiten des Chips. Im höherwertigen FP-Format ist der Lichtschein deutlich ausgeprägter. In TES 4 Oblivion konnte der Spieler frei zwischen simplem Überstrahleffekt ("Bloom") und echtem HDR-Rendering wählen - sofern die Grafikkarte das unterstützte.
Die Königsdisziplin klassischer Textureffekte ist jedoch das Parallax-(Occlusion-)Mapping. Diese Technik nutzt eine komplexe Pixelshader-Routine, um aus einer Konturentextur und der Richtung des Lichteinfalls zu berechnen, an welcher Stelle die (verzerrte) Oberfläche und der Lichtstrahl einander berühren. Dieser "Treffpunkt" kann dabei ober- wie unterhalb der eigentlichen Texturebene liegen. In Kombination mit dem oben beschriebenen Normal-Mapping sind so auch ohne exorbitant hohen geometrischen Aufwand überzeugende Oberflächendetails möglich. Die ersten Spiele, die diese Techniken unterstützten, kamen im Herbst 2005 heraus. Fear brachte bereits ab Werk Parallax Occlusion Mapping mit, kurz zuvor reichte Entwickler Crytek dieses per Patch 1.4 in Far Cry nach - die Coburger bestanden auf eine Shader-Model-3-Karte für POM, während es bei Fear auch mit älteren Radeon-Modellen funktionierte.
Textureffekte: Parallax-Mapping: Parallax Occlusion Mapping (POM) kann dank seiner aufwendigen Berechnung die Illusion von Oberflächenstruktur auch bei spitzen Betrachtungswinkeln erhalten.
Neben Texturen revolutionierten auch zwei weitere, teils externe, aber verbundene Entwicklungen die Computergrafik: Mehrkernprozessoren verdoppelten auf einen Schlag die CPU-Rechenleistung, sodass für Spiele nun wesentlich detailliertere Geometrie und Animationssequenzen verwendet werden konnten. Spiele wie Assassin's Creed oder Mirror's Edge, aber auch Multiplayer-Titel wie Unreal Tournament 3 profitieren zum Beispiel von den verbesserten, realistischeren Bewegungsabläufen. Thematisch eng hiermit verwandt ist die seit Microsofts Xbox zunehmende Portierung von Konsolenspielen. In Xbox 360 und Playstation 3 fanden ebenfalls Mehrkern-CPUs Verwendung, was sich natürlich in entsprechenden Optimierungen aufseiten der PC-Spiele niederschlug. Auch wenn Konsolenports heutzutage einen Bremsklotz darstellen, waren sie zunächst also durchaus nützlich.
Fiat Lux
Nein, kein besonders luxuriöses Italo-Mobil, sondern die Einführung von korrekter Licht- und damit auch Schattendarstellung in Spielen ist gemeint. Diese war besonders in den Anfangsjahren der Spiele eher rudimentär und auf eine oberflächliche optische Täuschung hin ausgerichtet. Von einer korrekten Interaktion mit Gegenständen, Spielwelt und -figuren war man meilenweit entfernt. Doch mit zunehmender Leistungsfähigkeit sowohl der CPU als auch der GPU trauten sich die Entwickler auch an tatsächlich funktionierende Beleuchtungssysteme heran.
Ein prominentes Beispiel, das die Interaktion aus Licht und Schatten nicht nur zum optischen Gewinn, sondern auch als Gameplay-Element einsetzt, ist Doom 3 mit seiner Stencil-Schatten-Technik, die in einer Prototypen-Form bereits in der id-Tech-3-Engine vorhanden war. Auch das bereits erwähnte Far Cry nutzt zum Teil diese Schattentechnik. Von der Sonne erzeugte Schatten in den weitläufigen Außenabschnitten nutzen das in umfangreichen Spielabschnitten weniger Fps-fressende Shadow-Mapping.
Entwicklung der Computergrafik
Der Schritt zu funktionalen Beleuchtungssystemen samt Schatten war getan; ebenso waren die Grundlagen für den späteren Einsatz von GPUs als Co-Prozessoren für allgemeine Berechnungen geschaffen. Die PC-Spielegrafik steht nun jedoch vor einem ganz neuen Problem: Die frühere optische Täuschung war einfach zu gelungen.
Quelle: PC Games Hardware
Alice unten ohne: Schatten von Fehlanzeige bis perspektivisch korrekt: Die Schattendarstellung wurde lange Zeit nur stiefmütterlich behandelt (links). Ein dunkler Klecks, der sogenannte Blob-Schatten (mitte), war bis zur Jahrtausendwende noch die verbreitetste Methode, den Bezug zwischen Charakteren/Objekten und der Spielwelt herzustellen. Erst später kamen Stencilschatten (rechts)und fortschrittlicheres Shadow-Mapping hinzu.

Zudem kommt hinzu, dass GPUs heute immer breiter aufgestellt sind und auch Speicher für Dinge wie allgemeine Berechnungen (Physik, Shader-Berechnungen, etc.) in der Hinterhand frei bleiben muss, um einen reibungslosen Betrieb zu ermöglichen.
Was den Geometriegrad betrifft - das ist ja mittlerweile mit Tesellation ziemlich gut gelöst. Da wird nur das hoch aufgelöst, was man auch als solches erkennen kann - zumindest im Idealfall.
Was mich allerdings wundert: warum nutzen Spielehersteller so wenige prozedurale Texturen? Die brauchen kaum Speicher und "zufällige Muster" wie Holzmaserungen oder Gesteinsoberflächen lassen sich damit pixelgenau und speicherschonend darstellen. Es muss doch nicht immer eine Texturtapete sein?
gRU?; cAPS
Damit sollten sich jetzt alle auf Dx11 konzentrien können für neuere Spiele.
Also los macht den Konsolen-rotz (PS4 | X720) endlich verfügbar.
Die Lichteffekte sind seit SM3.x bereits sehr gut, auch HDR-Rendering hat viel zur Qualität beigetragen.
Ich hoffe auf effizientere Tesselation und Ambient Occlusion Implementierung. Dafür gibt es doch die Grafikkarten mit 2GB GRAM und mehr