Ich versuche, Tone Mapping zusammen mit Augenanpassung und HDR zu implementieren. Eigentlich habe ich das schon implementiert, aber ich bin mit dem Ergebnis nicht zufrieden und ich denke, dass ich etwas falsch gemacht habe.
Mein endgültiges Bild (vor der Nachbearbeitung) speichere ich in halber Float-Textur. Ich habe auch 2 Hilfstexturen. Die erste speichert die logarithmische Luminanz und die durchschnittliche, minimale und maximale Farbe in der letzten Mip-Map. Der zweite speichert den Anpassungswert, der wie folgt berechnet wird:
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
Dabei ist prevLum der vorherige Anpassungswert (Größe dieser Textur ist 1x1). Die Protokollluminanztextur ist im R8B8G8-Format und die zweite ist R8. In Tutorials habe ich gesehen, dass Half Float-Texturen verwendet werden, aber in meinem Fall habe ich zu helle Bilder (fast weiß).
Im letzten Postprozess-Shader verwende ich alle diese Werte, um mithilfe dieses Codes eine Augenanpassung und Tonzuordnung zu erhalten:
float autokey(in float lum) {
return 1.03 - 2.0 / (2.0 + log10(lum + 1.0));
}
float hejl(in float color) {
float x = max(0.0, color - 0.004);
return (x * (A * x + B)) / (x * (A * x + C) + D);
}
float adaptedLum = texture(adaptedLuminance, vec2(0.5)).r;
float exp = exposure * autokey(adaptedLum) / adaptedLum;
result *= exp;
result.xyz=RGB2xyY(result.xyz); // conversion to CIE xyY
result.z = hejl(result.z);
result.xyz=xyY2RGB(result.xyz);
Und hier sind meine Ergebnisse:
- Augenanpassung und Tonzuordnung aktiviert
- nur Augenanpassung
- Nur Tonzuordnung
- alles aus
Wie Sie sehen können, wenn die Tonzuordnung aktiviert ist, ist die Hasenfarbe blasser. Und wenn die Augenanpassung aktiviert ist, ist das endgültige Bild viel dunkler. Könnte mir jemand erklären, was das verursachen könnte, weil ich denke, dass hier etwas nicht stimmt. Vielleicht ist es etwas mit Farbräumen, die ich nicht gut verstehe? Oder mit Blüte, die vor der Tonabbildung und Augenanpassung angewendet wird?
Ich habe auch ein anderes seltsames Verhalten mit Augenanpassung. Wenn ich auf dunkle Bereiche schaue, wird der Hintergrund (Himmel) heller. Es ist in Ordnung, aber es passiert immer, wenn sich die Mitte der Kamera im schwarzen Bereich befindet (egal wie weit die Kamera von diesem Bereich entfernt ist).
Ich stütze mich auf die Implementierung in Projekten auf diesen Seiten: John Chapman , Nutty Software