Echtzeitgrafiken verwenden eine Vielzahl von Näherungswerten, um den Rechenaufwand für die Simulation der indirekten Beleuchtung zu bewältigen und den Kompromiss zwischen Laufzeitleistung und Beleuchtungstreue zu finden. Dies ist ein Bereich aktiver Forschung, in dem jedes Jahr neue Techniken auftauchen.
Umgebungsbeleuchtung
Am einfachsten Ende der Reichweite können Sie die Umgebungsbeleuchtung verwenden : eine globale, omnidirektionale Lichtquelle, die auf jedes Objekt in der Szene angewendet wird , unabhängig von den tatsächlichen Lichtquellen oder der lokalen Sichtbarkeit. Dies ist überhaupt nicht genau, aber extrem billig, für einen Künstler leicht zu ändern und kann je nach Szene und gewünschtem visuellen Stil in Ordnung aussehen.
Zu den üblichen Erweiterungen der Grundbeleuchtung gehören:
- Stellen Sie die Umgebungsfarbe in verschiedene Richtungen ein, z. B. mit Stellen sphärischen Harmonischen (SH) oder einer kleinen Cubemap , und suchen Sie die Farbe in einem Shader basierend auf dem Normalvektor jedes Scheitelpunkts oder Pixels. Dies ermöglicht eine visuelle Unterscheidung zwischen Oberflächen unterschiedlicher Ausrichtung, auch wenn kein direktes Licht auf sie trifft.
- Umgebungsokklusion anwenden (AO) Techniken , einschließlich vorberechneter Vertex-AO-, AO-Textur-Maps, AO-Felder und AO (Screen-Space-AO) . All dies funktioniert, indem versucht wird, Bereiche wie Löcher und Spalten zu erkennen, in die indirektes Licht mit geringerer Wahrscheinlichkeit einfällt, und das Umgebungslicht dort abgedunkelt wird.
- Hinzufügen eines Umgebungs-Cubemap hinzu , um eine spiegelnde Umgebungsreflexion bereitzustellen . Eine Cubemap mit einer anständigen Auflösung (128² oder 256² pro Fläche) kann für Spiegelbilder auf gekrümmten, glänzenden Oberflächen durchaus überzeugend sein.
Gebackene indirekte Beleuchtung
Die nächste "Ebene" der Techniken beinhaltet sozusagen Backen (Vorberechnen offline) einer Darstellung der indirekten Beleuchtung in einer Szene. Der Vorteil des Backens besteht darin, dass Sie bei geringem Rechenaufwand in Echtzeit ziemlich hochwertige Ergebnisse erzielen können, da alle harten Teile beim Backen erledigt werden. Die Nachteile sind, dass die für den Backprozess benötigte Zeit die Iterationsrate der Level-Designer beeinträchtigt. Zum Speichern der vorberechneten Daten sind mehr Arbeitsspeicher und Speicherplatz erforderlich. Die Möglichkeit, die Beleuchtung in Echtzeit zu ändern, ist sehr begrenzt. Während des Backvorgangs können nur Informationen aus der statischen Geometrie verwendet werden, sodass indirekte Lichteffekte von dynamischen Objekten wie Zeichen übersehen werden. Trotzdem wird gebackene Beleuchtung heutzutage in AAA-Spielen sehr häufig verwendet.
Der Bake - Schritt kann jeden gewünschten Rendering - Algorithmus verwenden, einschließlich Pfadverfolgung, Radiosity oder Verwendung der Spiel - Engine zum Rendern von Cubemaps (oder Hemicubes ) .
Die Ergebnisse können in Texturen ( Lightmaps ) gespeichert werden, die auf die statische Geometrie in der Ebene angewendet werden, und / oder sie können auch in SH konvertiert und in volumetrischen Datenstrukturen gespeichert werden, z. B. Bestrahlungsvolumina (Volumentexturen, in denen jedes Texel eine SH-Sonde speichert). oder tetraedrische Maschen . Sie können dann Shader verwenden, um Farben aus dieser Datenstruktur zu suchen und zu interpolieren und sie auf Ihre gerenderte Geometrie anzuwenden. Der volumetrische Ansatz ermöglicht es, gebrannte Beleuchtung auf dynamische Objekte sowie auf statische Geometrie anzuwenden.
Die räumliche Auflösung der Lichtkarten usw. wird durch den Speicher und andere praktische Einschränkungen begrenzt. Daher können Sie die gebrannte Beleuchtung durch einige AO-Techniken ergänzen, um hochfrequente Details hinzuzufügen, die die gebrannte Beleuchtung nicht liefern kann, und um auf dynamische Objekte zu reagieren (z. B. das indirekte Licht unter einem sich bewegenden Charakter oder Fahrzeug abdunkeln).
Es gibt auch eine Technik namens PRT (Precomputed Radiance Transfer) , die das Backen erweitert, um dynamischeren Lichtverhältnissen gerecht zu werden. In PRT wird nicht die indirekte Beleuchtung selbst gebacken, sondern die Übertragungsfunktion von einer Lichtquelle - normalerweise dem Himmel - auf die resultierende indirekte Beleuchtung in der Szene. Die Übertragungsfunktion wird als eine Matrix dargestellt, die an jedem Backabtastpunkt von Quell- zu Ziel-SH-Koeffizienten transformiert. Dadurch kann die Beleuchtungsumgebung geändert werden, und die indirekte Beleuchtung in der Szene reagiert plausibel. Far Cry 3 und 4 verwendeten diese Technik , um einen kontinuierlichen Tag-Nacht-Zyklus zu ermöglichen, bei dem die indirekte Beleuchtung zu jeder Tageszeit anhand der Himmelsfarben variiert.
Ein weiterer Punkt zum Backen: Es kann nützlich sein, separate Backdaten für diffuses und spiegelndes indirektes Licht zu haben. Cubemaps funktionieren bei Spiegeln viel besser als SH (da Cubemaps viel mehr eckige Details aufweisen können), beanspruchen jedoch auch viel mehr Speicher, sodass Sie es sich nicht leisten können, sie so dicht wie SH-Samples zu platzieren. Die Parallaxenkorrektur kann verwendet werden, um dies etwas auszugleichen, indem die Cubemap heuristisch verzogen wird, damit sich ihre Reflexionen mehr auf die Geometrie um sie herum geerdet anfühlen.
Voll Echtzeit-Techniken
Schließlich ist es möglich, eine vollständig dynamische indirekte Beleuchtung auf der GPU zu berechnen. Es kann in Echtzeit auf beliebige Änderungen der Beleuchtung oder Geometrie reagieren. Es gibt jedoch wieder einen Kompromiss zwischen Laufzeitleistung, Beleuchtungstreue und Szenengröße. Einige dieser Techniken benötigen eine leistungsfähige GPU, um überhaupt zu funktionieren, und sind möglicherweise nur für begrenzte Szenengrößen möglich. Sie unterstützen in der Regel auch nur einen einzigen indirekten Lichtstrahl.
- Eine dynamische Umgebungs-Cubemap, bei der die Flächen der Cubemap mit Hilfe von sechs Kameras, die um einen ausgewählten Punkt gruppiert sind, für jeden Frame neu gerendert werden, kann für ein einzelnes Objekt anständige Umgebungsreflexionen liefern. Dies wird zum Beispiel häufig für das Spielerauto in Rennspielen verwendet.
- Globale Beleuchtung des Bildschirmraums , eine Erweiterung von SSAO, die in einem Nachbearbeitungsdurchlauf das Licht von nahegelegenen Pixeln auf dem Bildschirm reflektiert.
- Raytraced-Reflexion im Rasterraum funktioniert, indem nach dem Durchlauf durch den Tiefenpuffer gestrahlt wird. Solange sich die reflektierten Objekte auf dem Bildschirm befinden, können sehr hochwertige Reflexionen erzielt werden.
- Instant Radiosity zeichnet mithilfe der CPU Strahlen in die Szene auf und platziert an jedem Strahlentreffpunkt ein Punktlicht, das ungefähr das von diesem Strahl ausgehende reflektierte Licht in alle Richtungen darstellt. Diese vielen Lichter, die als virtuelle Punktlichter (VPLs) bezeichnet werden, werden dann von der GPU auf die übliche Weise gerendert.
- Reflective Shadow Maps (RSMs) ähneln Instant Radiosity, die VPLs werden jedoch generiert, indem die Szene aus der Sicht des Lichts gerendert wird (wie eine Schattenkarte) und an jedem Pixel dieser Karte eine VPL platziert wird.
- Lichtausbreitungsvolumen bestehen aus 3D-Gittern von SH-Sonden, die in der gesamten Szene angeordnet sind. RSMs werden gerendert und verwendet, um reflektiertes Licht in die SH-Sonden zu "injizieren", die den reflektierenden Oberflächen am nächsten liegen. Dann breitet ein Flood-Fill-ähnlicher Prozess Licht von jeder SH-Sonde zu umgebenden Punkten im Raster aus, und das Ergebnis davon wird verwendet, um die Szene zu beleuchten. Diese Technik wurde auch auf die volumetrische Lichtstreuung ausgedehnt .
- Die Verfolgung des Voxelkegels funktioniert durch Voxelisieren der Szenengeometrie (wahrscheinlich unter Verwendung unterschiedlicher Voxelauflösungen, feiner in der Nähe der Kamera und gröber in der Entfernung) und anschließendes Einkoppeln von Licht aus RSMs in das Voxelgitter. Beim Rendern der Hauptszene führt der Pixel-Shader eine "Kegelspur" durch das Voxelgitter durch, um das einfallende Licht für diffuse oder spiegelnde Schattierungen zu sammeln.
Die meisten dieser Techniken werden heutzutage in Spielen aufgrund von Problemen beim Skalieren auf realistische Szenengrößen oder aufgrund anderer Einschränkungen nicht häufig verwendet. Die Ausnahme ist die sehr beliebte Reflexion des Bildschirmbereichs (obwohl sie normalerweise mit Cubemaps als Fallback für Regionen verwendet wird, in denen der Bildschirmbereich nicht funktioniert).
Wie Sie sehen, ist die indirekte Beleuchtung in Echtzeit ein großes Thema, und selbst diese (ziemlich lange!) Antwort kann nur einen Überblick und einen Kontext für die weitere Lektüre bieten. Welcher Ansatz für Sie am besten geeignet ist, hängt in hohem Maße von den Details Ihrer jeweiligen Anwendung ab, von den Einschränkungen, die Sie akzeptieren möchten, und von der Zeit, die Sie dafür aufwenden müssen.