Raytracing in Spielen V: Neues aus der Strahlenwelt
3/5Post-Processing Special Effects
Mit dem Schritt von einer auf acht Karten in einer einzelnen Maschine konnten wir nun ein High(est)-End Gaming-Szenario ermöglichen. Die Auflösung wurde von 720p auf 1080p erhöht. Zusätzlich ermöglichte uns die geballte Rechen-Power Post-Processing-Effekte und eine clevere Art des Anti-Aliasings.
Ben Segovia, Forscher bei Intel Labs, hat Post-Processing-Effekte in Wolfenstein: Ray Traced integriert. Zur Klarstellung: Diese sind nicht „ray-tracing spezifisch“ und wurden auch schon in anderen Spielen verwendet. Die Effekte arbeiten auf den Pixeln des gerenderten Bildes, nicht direkt auf der 3D-Szene. In unserem Fall laufen alle Berechnungen direkt und damit sehr effizient auf den „Knights Ferry“-Karten. Die Effekte können die Qualität der gerenderten Szene dramatisch beeinflussen.
Tiefenunschärfe
Der Effekt ist sicherlich jedem Fotograf bekannt. Möchte man den Betrachter auf einen gewissen Bereich eines Bildes fokussieren lassen, dann kann man die weniger wichtigen Teile des Bildes absichtlich unscharf machen. Das wichtige Objekt bleibt scharf und zieht damit die Aufmerksamkeit auf sich.
Mit Tiefenunschärfe sank die Leistung um drei Prozent gegenüber der Darstellung ohne diesen Effekt.
HDR-Effekte
Geht man in der realen Welt von einem dunklen Raum in einen von der Sonne bestrahlten Außenbereich, so dauert es einige Sekunden, bis sich das menschliche Auge an die Helligkeit angepasst hat. Den Effekt kann man auch mit (digitalen) Videokameras beobachten, die das Helligkeitssprektrum über einen gewissen Zeitraum an ein angenehm anzusehendes Bild anpassen. Mit Hilfe von „High Dynamic Range“ (HDR) haben wir diese Effekt in unsere Version von Wolfenstein mit einfließen lassen.
Mit HDR sank die Leistung um zwei Prozent gegenüber der Darstellung ohne diesen Effekt.
Während dies bei Kameras passiert kann es zu einem sogenannten „Bloom“-Effekt kommen, der in andere Objekte hinein strahlt. Auch diesen Effekt haben wir nachgebildet.
Lens Flare
Obwohl Kamerahersteller schwer daran arbeiten, mögliche Blendenflecke (Lens Flares) zu vermeiden, so werden diese oft in Computerspielen oder Filmen als künstlerisches Stilelement hinzugefügt. In unserer Implementierung werden verschiedene kleinere Versionen des Bildes in ein anderes Farbspektrum (z.B. Grün, Blau oder Orange) transferiert und dann wieder in das originale Bild hineingemischt.
Mit unserem Lens-Flare-Effekt sank die Leistung um lediglich 0,1 Prozent gegenüber der Darstellung ohne diesen Effekt.
Smart Anti-Aliasing
Eine weitere Neuigkeit, die wir im letzten Jahr hinzugefügt haben, ist ein „smarter Algorithmus“, um Anti-Aliasing bei Ray Tracing zu ermöglichen – entwickelt von Ingo Wald und Ben Segovia. Grundsätzlich gibt es viele verschiedene Möglichkeiten, wie man Anti-Aliasing durchführen kann. Die meisten Ansätze verfolgen dabei eine „brute-force“-Methode, womit auch Berechnungen in Bereichen vollzogen werden, wo sie jedoch nicht bemerkbar wären.
Unsere Implementierung wird nach der Berechnung des Bildes vorgenommen. Nachdem man beim Ray Tracing die Möglichkeit hat, hocheffizient ein paar einzelne Strahlen zur Verfeinerung zu schießen, analysieren wir jeden Pixel bezüglich zwei Faktoren und entscheiden dann, ob dieser Anti-Aliasing benötigt:
- Die Mesh-ID des Objekts, das getroffen wurde
- Die Ausrichtung des Polygons, das getroffen wurde
Im Detail: In Spielen ist die Geometrie normalerweise in verschiedenen „Meshes“ angeordnet. Gelegentlich unterscheiden sich diese durch einen zugewiesenen Shader oder allgemeiner durch das Objekt an sich. So könnte es beispielsweise ein Mesh für eine Säule, eines für einen Zaun, eines für einen Baum und so weiter geben. In unserem Ray Tracer bekommt jedes Mesh eine eigene ID zugewiesen. Zur Veranschaulichung haben wir diese IDs in dem folgenden Bild farbkodiert.
Das zweite Kriterium ist wie erwähnt die Ausrichtung des Polygons, das getroffen wurde. Diese wird durch die sogenannte Normale gegeben. Farbkodiert im Rot, Grün- und Blaukanal sieht das dann so aus:
Der Algorithmus funktioniert nun so, dass er von dem zu betrachtendem Pixel aus die Nachbarpixel ansieht. Gibt es einen größeren Unterschied in der Normale (z.B. wenn man von einem nach vorne gerichteten Dach zu einem nach links gerichteten Dach übergeht), oder wurde eine andere Mesh ID gefunden, so werden 16 weitere Strahlen („Supersampling“) für diesen einen Pixel geschossen und die daraus resultierenden Farbwerte werden gemittelt.
Mit Anti-Aliasing sank die Leistung in dieser Ansicht um 59 Prozent gegenüber der Darstellung ohne diesen Effekt.
Mit Anti-Aliasing sank die Leistung in dieser Ansicht um 32 Prozent gegenüber der Darstellung ohne diesen Effekt.
Für zukünftige Implementierungen könnte man sich auch überlegen, die Farbe des zu analysierenden Pixels mit zu berücksichtigen. Ist dieser beispielsweise wegen mangelnder Beleuchtung nahezu schwarz, so ist dort Aliasing weniger bemerkbar. Auch der Farbunterschied zwischen zwei Pixeln (z.B. von sehr hell auf sehr dunkel) könnte als Kriterium berücksichtigt werden. Bevor man diesen Farbvergleich angehen würde, könnte man auch erst bildbasierte Anti-Aliasing-Techniken wie MLAA, ursprünglich erforscht von Alexander Reshetov (Intel Labs) in 2009, benutzen. Danach müsste man weniger Pixel durch das Schießen zusätzlicher Strahlen verfeinern. Des Weiteren könnte man ggf. einen besseren Trade-off zwischen Geschwindigkeit und Qualität bekommen, wenn man mit 4 oder 8 statt 16 Strahlen zur Verfeinerung experimentiert. Und, und, und...