Hallo Habr! Ich präsentiere Ihnen die Übersetzung des Artikels
„Dynamic Local Exposure“ von John Chapman.
In diesem Artikel werde ich einige Ideen zur dynamischen lokalen Belichtung beim HDR-Rendering vorstellen. Bart Wronsky hat bereits
einen ausgezeichneten Artikel zu diesem Thema und ich empfehle dringend, ihn sofort zu lesen, wenn Sie dies noch nicht getan haben. Die Ideen hier basieren in größerem Maße auf seinem Artikel. Am Ende habe ich einige andere großartige Links eingefügt.
Niedriger / hoher Dynamikbereich
In den guten alten Zeiten (1990er Jahre) wurden Spiele direkt im angezeigten
LDR- Format (Enge Dynamic Range) (Gammaraum, 8 Bit) gerendert. Es war einfach und billig, beeinträchtigte jedoch die Erstellung eines wirklich fotorealistischen Bildes erheblich.
Derzeit, insbesondere mit dem Aufkommen von
PBR (Physical-Based Rendering), werden Spiele mit gigantischem Dynamikbereich im linearen Raum mit höherer Genauigkeit gerendert. Bei dieser Bewegung kommt das eigentliche Problem zum Fotorealismus: Wie können wir ein
HDR- Bild in
LDR anzeigen?
Globale automatische Belichtung
Der Standardansatz für die automatische Belichtungssteuerung besteht darin, die durchschnittliche (oder durchschnittliche logarithmische) Helligkeit der Szene zu messen, optional mit einer
Gewichtsfunktion , die Werte nahe der Bildmitte bevorzugt. Dies kann sehr effizient durch parallele Reduktion oder durch wiederholtes
Downsampling in der
Mipmap des Luminanzpuffers erfolgen . Der letztere Ansatz hat einige Vorteile, die ich im nächsten Abschnitt diskutieren werde.
Die durchschnittliche Helligkeit wird anschließend in den Belichtungswert umgewandelt, indem beispielsweise der Kehrwert der maximal zulässigen Helligkeit der Szene berechnet wird:
float Lavg = exp(textureLod(txLuminance, uv, 99.0).x); float ev100 = log2(Lavg * 100.0 / 12.5); ev100 -= uExposureCompensation;
Erhalten aus der ISO-Norm zur Berechnung der Geschwindigkeit basierend auf der Sättigung; für eine vollständige Erklärung siehe (3)Da die potenzielle durchschnittliche Helligkeit unter dynamischen Bedingungen instabil ist, wird sie normalerweise mit der exponentiellen Hysteresefunktion
(2) über die Zeit geglättet:
Lavg = Lavg + (Lnew - Lavg) * (1.0 - exp(uDeltaTime * -uRate));
ÜbersetzerkommentarDiese Funktion muss in der Shader- Downsampling- Texturhelligkeit und nur während der Berechnung des letzten Mip- Pegels (1x1) angewendet werden. Weiter wird darüber geschrieben, aber meiner Meinung nach ist es leicht zu übersehen.
Aufgrund seiner globalen Natur leidet diese Methode unter starken Schattierungen oder Glanzlichtern von Bereichen des Bildes, in denen eine Abweichung von der durchschnittlichen Helligkeit vorliegt:

Obwohl dies der Fähigkeit des Auges entspricht, sich an Änderungen der Lichtverhältnisse anzupassen, ist der Gesamteffekt ziemlich weit von dem entfernt, was wir in der realen Welt wirklich wahrnehmen.
Lokale AE
Wenn wir mit
Downsampling eine mittlere Helligkeit erzeugen, haben wir Zugriff auf niedrigere Mip-Pegel des
Luminanzpuffers (4) , um die lokale durchschnittliche Helligkeit zu erhalten.
float Lavg = exp(textureLod(txLuminance, uv, uLuminanceLod).x;
Bitte beachten Sie, dass die Hysterese nur im letzten Schritt (bei der Aufnahme eines 1x1-Mip-Pegels) angewendet werden sollte, damit dies funktioniert. Andernfalls treten Artefakte auf.Theoretisch ist dies eine großartige Idee: Jeder Bereich des Bildes kann eine gute Belichtung aufweisen, während er sich von benachbarten Bereichen abhebt. In der Praxis wird jedoch ein widerliches Ergebnis erzielt:

Am unangenehmsten sind Blockhalos, die in kontrastreichen Bereichen zu finden sind:

Sie können jedoch entweder durch Vorfilterung des
Luminanzpuffers oder einfach durch bikubische Abtastung geglättet werden:

Es sieht immer noch ekelhaft aus, aber schon besser.
Durch Abtasten verschiedener Ebenen der Mipmap in der
Luminanz wird der Radius des Halos geändert. Dieser Parameter ist nützlich, um das gesamte „Erscheinungsbild“ des Ergebnisses zu steuern und um den Halo-Effekt zu minimieren, obwohl dies auf eine allgemeine Abnahme des Kontrasts (es wird ein Randfilter) oder einen Verlust der Lokalität der Belichtungskontrolle zurückzuführen ist:

Das Glätten von Geisterbildern reicht jedoch nicht aus. Das Ergebnis ist überhaupt nicht natürlich; sieht aus wie ein extremer „HDR-Foto“ -Stil, anders als das, was eine Person sieht. Wenn wir jedoch globale und lokale Werte mischen, können wir das Beste aus beiden Welten herausholen:
float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x; float L = mix(Lglobal, Llocal, uLocalExposureRatio);

Durch Ändern des Mischungsfaktors können Sie die lokale Belichtung so anpassen, dass Artefakte minimiert und der wahrgenommene Realismus maximiert werden:

Auto Mix Ratio
Das manuelle Einstellen
des Mischungsverhältnisses ist in Situationen normal, in denen wir die Kameraposition, die Beleuchtung usw. absolut kontrollieren können. In vielen Fällen (z. B. bei Spielen im Freien mit einem dynamischen Wechsel von Tag und Nacht) ist diese Kontrollebene einfach nicht möglich. In diesem Fall wäre es schön,
den Mischungsfaktor automatisch zu generieren.
Im Bild unten haben wir einen weiten Dynamikbereich; meist mittlere bis niedrige Helligkeitswerte und mehrere Bereiche mit hoher Intensität (Himmel in den Fenstern):

Ohne lokale Belichtung geht die Farbe des Himmels verloren. In diesem Fall möchte ich ein großes
Mischungsverhältnis :

Betrachten Sie nun das folgende Bild, das einen kleinen Dynamikbereich hat, hauptsächlich mit einem hohen Helligkeitswert:

In diesem Fall wird durch die lokale Belichtung die Helligkeit der „hellen“ Bereiche zu stark reduziert:

Beobachtungsdaten deuten auf eine einfache Methode zum Mischen
lokaler und
globaler Werte hin: Wenn der Unterschied zwischen der durchschnittlichen und der maximalen Helligkeit der Szene größer ist, sollte der Mischungskoeffizient der lokalen Belichtung größer sein. Die Erzeugung der
maximalen Helligkeit der Szene kann trivial während der Berechnung der Helligkeit erfolgen, wobei die Hysterese verwendet wird, um das Ergebnis auf die gleiche Weise wie für den Durchschnittswert zu glätten. Daher können wir das vorherige Codefragment wie folgt erweitern:
float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x;
Bitte beachten Sie, dass uLocalExposureMax auf unserer Eingabe angezeigt wurde , um den absoluten maximalen Einflussgrad der lokalen Exposition zu steuern. Ich habe ein gutes Ergebnis uLocalExposureMax <0.3 .Endgültiger Code float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x;
Fazit
Der oben beschriebene Ansatz legt einige Einschränkungen fest, wann die Helligkeit einer Szene gemessen werden muss. Normalerweise wird die Messung unmittelbar nach dem Durchgang der Beleuchtung durchgeführt, um eine Anpassung der
Partikeleffekte , der
Blüte usw. zu vermeiden. Wenn jedoch die lokale Helligkeit verwendet wird, ist es wichtig, dass der tatsächliche Wert, der an der Belichtung teilnimmt, in der
Luminanzkarte dargestellt wird . Dies bedeutet, dass unmittelbar vor der Belichtung eine Helligkeitsmessung durchgeführt werden muss. Wenn dies nicht akzeptabel ist, besteht die Lösung darin, die lokale Helligkeit getrennt von den Durchschnitts- und Maximalwerten zu erzeugen.
Obwohl ich denke, dass die gemeinsame Verwendung der lokalen und globalen Helligkeit der Szene der „richtige“ Ansatz ist, um ein ausgewogenes, natürlich aussehendes Bild zu erstellen, ist die Qualität des Ergebnisses offensichtlich subjektiv. Ob eine solche Methode für ein bestimmtes Spiel geeignet ist, hängt ganz vom Inhalt und dem gewünschten visuellen Stil ab. Es würde mich interessieren, andere Ideen in dieser Hinsicht zu hören.
Referenzen
- Lokalisiertes Tonemapping (Bart Wronski)
- Implementierung einer physikalisch basierten Kamera (Padraic Hennessy)
- Erfrierung von Erfrierungen zu Züchterrechten (Sébastien Lagarde et al.)
- Ein genauerer Blick auf Tonemapping (Matt Pettineo)
- Die Wichtigkeit, linear zu sein (Larry Gritz et al.)
- Fortgeschrittene Techniken und Optimierung von HDR / VDR-Farbpipelines (Timothy Lottes)
HDR-Bilder aus dem sIBL-Archiv .