Physikalische Beschattung - Umgebungsbeleuchtung / indirekte Beleuchtung


15

Nach dem Studium der PBRT von M. Pharr und G. Humphreys habe ich einen physisch basierten Path Tracer implementiert. Jetzt versuche ich, mithilfe von OpenGL ES (in einer iPhone-Anwendung) physisch basiertes Rendering auf Echtzeitgrafiken anzuwenden.

Ich möchte Oren-Nayar und Cook-Torrance als diffuses und spiegelndes BRDF verwenden, habe aber ein Problem: Wie modelliere ich indirekte Beleuchtung?

In einem Pfadverfolger (wie dem in pbrt enthaltenen) wird das indirekte / Umgebungslicht "automatisch" vom Pfadverfolgungsalgorithmus angegeben, da es dem Pfad der Lichtstrahlen unter Berücksichtigung der direkten und indirekten Beleuchtung folgt.

Wie modelliere ich die indirekte Beleuchtung in einem physisch basierten Rendering, das in OpenGL ES geschrieben wurde, also unter Verwendung von Echtzeit-Computergrafiken?

Antworten:


39

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.


Hallo @ Nathan, danke für deine ausführliche Antwort. Ich weiß, dass dies ein großes Thema ist (und ein großes Studienfach). Das größte Problem ist, dass die Online-Dokumentation fragmentiert ist und es schwierig ist, einen guten Ansatz zu finden. Mein Projekt ist goo.gl/Fgo21x : Ein BRDF-Viewer (inspiriert vom WDAS-Viewer), der die gängigsten empirischen und physikalisch basierten BRDF-Modelle zeigt und die Farbberechnung mit Spektraldaten unterstützt - Tristimulus-Werte. Dies ist ein Bildungsprojekt zum Studium von OpenGL.
Fabrizio Duroni

Ich denke, dass ein guter erster Ansatz darin bestehen könnte, die von Ihnen erwähnte allgemeine Erweiterung zu verwenden: SH oder kleine Cubemap + Umgebungs-Cube-Map (für Reflexion und Brechung). Was denkst du darüber? (Ich entwickle diese Anwendung nach der Arbeit während meiner schlaflosen Nächte :)). Nochmals vielen Dank für die Sammlung von Quellen, die Sie oben verlinkt haben (ich habe jetzt viel Material zu studieren).
Fabrizio Duroni

@FabrizioDuroni Ja! Für einen BRDF-Viewer sollte eine einfache direktionale Umgebung und eine Umgebungs-Cubemap großartig sein.
Nathan Reed

Vielleicht fällt dies in eine Ihrer Kategorien, aber ist altmodisches Rendering für alle Flächen einer Cubemap technisch gesehen keine Echtzeit-Technik? Ist es nicht auch möglich, die Basisumgebung mit einer Umgebungs-Cubemap für diffuse Reflexionen zu erweitern?

@racarate Sorry, ich habe eine Weile gebraucht, um zu antworten, aber ja, du hast recht! Ich glaube, ich wollte das erwähnen, habe es aber vergessen. :) Wie auch immer, ich habe es hinzugefügt. (Ich erwähnte die Verwendung einer Cubemap für diffuse, bis in den ersten Aufzählungspunkt.)
Nathan Reed

5

Dies ist das Hauptproblem, das bei Echtzeit-CG noch besteht, und es wird noch viel nachgeforscht, um dieses Problem zu lösen.

Die größte Hürde besteht darin, dass in Rastergrafiken jede Komponente der Szene im Vakuum gerendert wird - jedes Dreieck wird ohne Bezug zu anderen Dreiecken in der Szene gerendert, und dasselbe gilt für Pixel im Gegensatz zu Raytracing-Ansätzen Dabei hat jeder Strahl Zugriff auf die gesamte Szene im Speicher. Echtzeit-Programmierer müssen also hackige Tricks anwenden, um Dinge wie Reflexionen und Schatten zu tun, und das Gleiche gilt für die globale Beleuchtung.

Eine kostengünstige Laufzeitmethode ist die Verwendung von gebackenen Light-Maps, bei denen Sie zuerst etwas Langsames, aber Fantastisches wie Radiosity oder Pfadverfolgung offline ausführen und dann die Beleuchtungsinformationen zusammen mit Ihren regulären Vertexdaten speichern. Dies ist ideal für statische Geometrie, wird jedoch problematisch, sobald Sie sich bewegende Objekte hinzufügen. Michal Iwanicki hat eine gute Präsentation darüber gemacht, wie sie dies für 'The Last of Us' gelöst haben.

Sphärische Harmonische werden häufig in Game-Engines verwendet, um indirektes Licht darzustellen. Es handelt sich im Grunde genommen um eine Fourier-Transformation über die Oberfläche einer Kugel. Durch das Verwerfen von Hochfrequenzkomponenten erhalten Sie eine optisch ansprechende, meist genaue Umgebungsbeleuchtung mit nur 9 Koeffizienten pro Farbe. Unity verwendet beispielsweise SH, um "Lichtsonden" an verschiedenen Punkten in der Szene zu backen. Bewegliche Objekte können dann zwischen benachbarten Sonden interpolieren, um eine Annäherung an das indirekte Licht an ihrer Position zu erhalten. Robin Green's Artikel ist im Grunde die Bibel zu dieser Technik, aber es ist ziemlich schwer.

Die derzeit heißeste Technik scheint das Voxel-Cone-Tracing zu sein, bei dem kein Schritt vor dem Backen erforderlich ist. Ich bin damit selbst nicht allzu vertraut, aber ich verstehe, dass es darum geht, Ihre Szene in eine Welt im Minecraft-Stil zu verwandeln, die Voxel in eine schnell überquerbare räumliche Struktur wie ein Octree zu bringen und dann ein paar zu werfen Strahlen (Kegel) von jedem Punkt und prüfen, auf welche Voxel sie treffen, um reflektiertes Licht zu sammeln. NVidia treibt dies im Moment ziemlich stark voran, und es gibt hier und hier Zeitungen darüber .

Ich hoffe, das hilft :)


0

Die Pfadverfolgung ist ein sehr rechenintensiver Algorithmus und nicht für Echtzeit geeignet. Die Architektur von PBRT ist auch nicht für Echtzeit geeignet. Das Hauptziel von PBRT besteht darin, die Rendering-Gleichung unter Verwendung einer unverzerrten Monte-Carlo-Integration zu lösen. Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/Unbiased_rendering .

Ich bezweifle, dass Sie ohne viele Optimierungen und Einschränkungen auf einem mobilen Gerät eine anständige Leistung erzielen können.

In jedem Fall kann die Pfadverfolgung in OpenGL implementiert werden Compute-Shader zu untersuchen, die sehr leistungsfähig sind. OpenGL ES 3.1 unterstützt im Gegensatz zu Desktop GL Compute-Shader mit einigen geringfügigen Einschränkungen.

Lesen Sie diese Seite durch, um weitere Informationen zu erhalten: https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-(Part-I)

Viel Glück!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.