Raytracing in Spielen II: Das Reich der Strahlen macht Fortschritte

 5/8
Daniel Pohl
117 Kommentare

Special Effects

Bei der Produktion von Kinofilmen wird Raytracing oft aufgrund der einzigartigen Fähigkeiten Special Effects zu liefern, die bei anderen Algorithmen nicht möglich wären, oder nur unzuverlässige Ergebnisse liefern würden, verwendet. Der folgende Abschnitt zeigt zwei Special Effects, die für Computerspiele relevant sind und den Spaßfaktor um Einiges erhöhen können: Kameraportale und Reflexionen.

Kameraportale

Ein mittlerweile bekanntes Feature in 3D-Shootern ist das Kameraportal. Es ermöglicht dem Spieler in einen Bereich der Szene (Spielwelt) zu sehen, in dem er sich physikalisch nicht befindet.

Kameraportal in Quake 3: Arena (1999)
Kameraportal in Quake 3: Arena (1999)

Es ist sehr interessant zu sehen, wie einfach und effizient dieser Effekt mittels Raytracing realisiert werden kann. Hier die Aufstellung der Szene:

Portal in Quake 3
Portal in Quake 3

Der Spieler befindet sich auf der unteren Ebene. Vor ihm steht ein Kameraportal, durch das er hindurch sieht. Auf der oberen Ebene befindet sich ein Gegner. Was wir wollen, ist, dass das Portal uns (bzw. unser Sichtfeld) auf magische Art und Weise in die obere Ebene befördert. Für Raytracing bedeutet dies einfach nur, dass man für den Primärstrahl einen Offset (vom Auftreffpunkt auf dem Kameraportal aus zu einem neuen Ursprung) benötigt, um so den Strahl weiter zu verfolgen. Dies ist hier bildlich dargestellt:

Portal in Quake 3 mittels Raytracing
Portal in Quake 3 mittels Raytracing

In Programmiersprache sieht dies wie folgt aus:

// Herausfinden des Auftreffpunkts des Strahls im Shader-Programm.

Vector3D hitPosition = getHitPositionOfRay(ray);

// Addieren eines 3D-Offsets zur Auftreffposition.

hitPositon += cameraPortalOffset;

// Schießen eines neuen Strahls von der Auftreffposition mit dem
// darauf addierten Offset in die gleiche Richtung.

finalColor = traceNewRay(hitPosition, getDirectionOfRay(ray));

Voilà, mit nur drei Zeilen Code hat man sein Kameraportal. Nachfolgend angewendet in Quake 3: Raytraced:

Kameraportal in Quake 3: Raytraced (2004)
Kameraportal in Quake 3: Raytraced (2004)

Im Oktober 2007 hatte Valve ein Spiel namens „Portal“ veröffentlicht. Es beinhaltete ein innovatives, neues Spielkonzept: Durch geschicktes platzieren von Portalen innerhalb der Spielwelt war der Spieler in der Lage, wie von Geisterhand zu verschiedenen Orten in der Spielwelt zu gelangen und kleine Rätsel zu lösen. Aus technischer Sichtweise ist es sehr interessant zu sehen, wie dabei der Kameraportal-in-Kameraportal-Effekt implementiert wurde.

Das Spiel „Portal” von Valve (2007)
Das Spiel „Portal” von Valve (2007)

Die Implementierung ist ziemlich robust. Das Spiel ist so ausgelegt, dass man dem Portal-in-Portal-Effekt niemals zu nahe kommt, um die Rekursionstiefe nicht zu stark zu erhöhen. Dennoch, nach einigem Experimentieren und Austesten kann man die Limitierung des Ansatzes im folgenden Screenshot, bei dem die Rekursionstiefe die vordefinierte Grenze überschritten hat, erkennen. Ersichtlich ist dies in der Mitte des Portals, in der sich die Kiste bei korrekter Darstellung öfters hätte wiederholen müssen.

Die Darstellung der Kiste wiederholt sich nur bis zu einer gewissen Anzahl in der Mitte des Portals
Die Darstellung der Kiste wiederholt sich nur bis zu einer gewissen Anzahl in der Mitte des Portals

Es ist sehr interessant anzumerken, wie der Programmcode für den Effekt in Raytracing geändert werden muss, um Kameraportale in Kamerportalen zu unterstützen: Gar nicht! Es läuft immer noch mit genau demselben Code! Einzig geändert werden muss der Offset-Parameter, so dass dieser auf einen Platz vor dem Kameraportal zeigt. Dies ist hier bildlich dargestellt:

Portal-in-Portal-Effekt mittels Raytracing
Portal-in-Portal-Effekt mittels Raytracing

Um so einen Effekt hingegen bei der Rasterisierung zu erzeugen, wird das Bild erst einmal mit einem „leeren“ Kameraportal in eine Textur gerendert. Anschließend muss man einen Teil dieser Textur auf den leeren Fleck kleben. Danach wiederholt man das Ganze noch einmal mit einer kleineren Version in der Mitte des Bereichs des leeren Flecks usw. usf. ...

Beim Rendern mit den nur drei Zeilen Programmcode bei Raytracing sieht das dann so aus:

Szene aus Quake 4: Raytraced. In der Mitte ist die Anzahl der Portale in Portalen bei 130.
Szene aus Quake 4: Raytraced. In der Mitte ist die Anzahl der Portale in Portalen bei 130.

Wie bei den Reflexionen ist der Portal-Effekt sehr effizient, da man bei der Berechnung nur für so viele zusätzliche Strahlen „zahlt“, wie man sie auch wirklich sieht. Auch der Effekt, dass die Anzahl an zusätzlichen Strahlen mit jedem weiteren Schritt stark abnimmt, trifft hier zu. Daher hat nur ein sehr geringer Anteil an Strahlen eine richtig hohe Rekursionstiefe und damit hohe Kosten.

Es wird mit Raytracing möglich sein, richtig beeindruckende Szenen wie z.B. zwei Kameraportale nebeneinander und diese wieder auf sich selbst projeziert zu generieren. Wie der Programmode dafür aussieht? Er bleibt derselbe!

Q4RT: Zwei Kameraportale in Kameraportalen
Q4RT: Zwei Kameraportale in Kameraportalen