Computer Graphics TU Braunschweig


Canyonshooter - 1 Grafik - 1.1 Grafik-Engine

Teamprojekt Canyonshooter

1.1 Grafik-Engine

Alle Objekte in der Welt der Computerspiele bestehen aus einer Menge von Dreiecken. Der Canyon wird zur Laufzeit generiert. Alle anderen Objekte werden aus sogenannten Model-Dateien geladen. Dafür stellt XNA eine Funktion zu Verfügung, mit der das FBX-Dateiformat von Autodesk gelesen werden kann. Um mehr Kontrolle über das Aussehen der Oberflächen zu erlangen, musste allerdings ein Teil der von XNA generierten Daten mit eigenen Daten überschrieben werden.

Die Oberflächen basieren hauptsächlich auf eigens für das Spiel angefertigten Programmen, die auf der Grafikkarte ausgeführt werden, sog. „Shader“. Die Shader sind im FX-Format geschrieben, weil dieses von XNA besonders gut unterstützt wird. Insgesamt gibt es drei Basistypen für Oberflächen: Farbe, Textur und Drahtgitter. Der aufwendige Teil der Programmierung ist aber die Beleuchtung dieser Oberflächentypen. Je nach Rechenleistung des PCs stehen unterschiedliche Detailstufen zur Verfügung:

Für die Berechnung der Lichtstärke wird das Blinn-Phong-Modell benutzt.

Mit diesem Modell kann man aber nur für jedes Objekt einzeln die Beleuchtung berechnen. Das Zusammenspiel der Objekte wird dabei nicht berücksichtigt, d. h. es gibt keinen Schattenwurf. Dafür gibt es zusätzliche Techniken, wie zum Beispiel das „Shadow Mapping“, welches wir für den CanyonShooter benutzen. Dabei wird die Szene aus der Sicht des Lichts in eine Textur gerendert. In der Textur werden dann aber nicht die Farbinformationen gespeichert, sondern die Tiefeninformationen. Das bedeutet, dass die Textur die Abstände bestimmter Pixel zur Lichtquelle enthält. Wenn die Szene nun aus der Sicht des Spielers gerendert wird, werden diese Informationen verwendet, um die Objekte zu schattieren.

Da die Beleuchtung maßgeblich von den Oberflächennormalen abhängt, verwenden wir für den Canyon das sogenannte „Normal-Mapping“. Darunter versteht man eine Technik bei der die Oberflächennormalen aus einer Textur geladen werden, anstatt sie durch das Kreuzprodukt zweier Kanten zu berechnen. Somit ist die Normale (und dadurch die Beleuchtung) innerhalb eines Dreieckes unterschiedlich und es ergibt sich eine scheinbar höhere Detailstufe der Geometrie.

Weil die Lichtberechnung vor allem wegen der Schattenberechnung sehr aufwendig ist, müssen in der Anzahl der Lichter Abstriche gemacht werden. Die Hauptlichtquelle des CanyonShooters ist die Sonne. Sie strahlt von oben in parallelen Strahlen herab und alle Objekte werfen in diesem Licht einen Schatten, der in Wirklichkeit aus zwei Schatten besteht. Aufgrund des verwendeten Shadow-Mapping ist es nicht möglich die Schatten der gesamten Welt auf einmal zu berechnen, weil die Auflösung der Shadow-Map nicht sehr groß sein darf. Darum gibt es in der Ferne eine Shadow-Map mit niedriger Auflösung und in der Nähe des Spielers eine mit hoher Auflösung. Zwischen diesen beiden Schatten wird an der Schnittkante interpoliert. Die Shadow-Maps fliegen mit dem Spieler durch den Canyon. Hinter dem Spieler wird kein Schatten berechnet, weil der Spieler diesen sowieso nicht sehen würde. Zusätzlich zum Sonnenlicht gibt es bis zu fünf Punktlichtquellen, die das Feuer der Raketen simulieren sollen. Diese Lichter strahlen in alle Richtungen bis zu einer bestimmten Distanz. Eine Schattenberechnung wäre für Punktlichtquellen viel aufwendiger, als für das Sonnenlicht. Der Effekt des Schattens wäre aber kaum spürbar, da die Lichter nicht sehr weit scheinen. Darum haben wir uns entschlossen, die Schattenberechnung auf das Sonnenlicht zu beschränken.

Der CanyonShooter verfügt über zwei Post-Processing Effekte. Zum Einen gibt es den sogenannten Bloom-Filter, durch den das Bild natürlicher erscheint. Starke Lichtquellen scheinen, wie in der Natur, über die Kanten der Objekte hinaus. Dieser Effekt stammt aus der Sammlung der XNA-Samples von Microsoft. Die Funktionsweise ist wie folgt: Von dem erstellten Bild der Spielwelt wird ein Schnappschuss erstellt und aus diesem die dunklen Teile entfernt. Die verbleibenden Teile werden durch einen Gaußschen Weichzeichnungsfilter „verwischt“ und auf das Ausgangsbild addiert. Ein zweiter Post-Processing Effekt wurde aus diesem XNA-Beispiel abgeleitet. Wenn man im Spiel den Booster aktiviert, verwischt das Bild zu den Kanten hin und die Sättigung verringert sich. Dafür wird zunächst, wie beim Bloom-Filter, eine verwischte Version der aktuellen Szene erstellt. Dies geschieht durch einen radialen Weichzeichner, der das Bild von der Mitte aus zu den Kanten hin verwischt. Im zweiten Schritt wird dieses verwischte Bild mit dem Ausgangsbild vermischt. In der Mitte wird das Ausgangsbild verwendet und am Bildrand das verwischte Bild. Dazwischen wird interpoliert.

Ein weiterer grafischer Effekt ist der Nebel. Er zeigt sich unterhalb einer bestimmten Ebene und in einer bestimmten Entfernung. Für die Berechnung des Nebels in der Entfernung wird die Distanz zwischen Canyon und Kamera betrachtet. Für den Nebel unterhalb einer bestimmten Ebene wird für jeden Pixel ein Strahl von der Kamera durch die Ebene auf den Canyon erstellt und die Distanz zwischen dem Schnittpunkt mit der Ebene und dem Schnittpunkt mit dem Canyon als Intensität des Nebels verwendet.

Der Himmel im Spiel wird durch eine Skybox realisiert. Dies ist eine einfache Box im Hintergrund, auf die eine Textur gelegt wird.

Für die Darstellung von vielen kleinen Objekten, die als Dekoration dienen, sowie für die Darstellung von Laser-Projektilen, wird das Instancing-Verfahren benutzt. Dabei wird für jeden Objekttyp nur ein Aufruf an die DirectX-API gemacht um eine große Anzahl an Objekten mit gleichem Aussehen und unterschiedlicher Position gleichzeitig anzuzeigen. Würde man eine so große Anzahl an Objekten mit jeweils einem DirectX-API-Aufruf darstellen, würde das Spiel weniger flüssig laufen.

Das aktuelle Kapitel




TU Braunschweig - Fakultät für Mathematik und Informatik - Computer Graphics - Teamprojekt Canyonshooter