Próbuję wdrożyć mapowanie tonów wraz z adaptacją oka i HDR. Właściwie już to zaimplementowałem, ale nie jestem zadowolony z rezultatu i myślę, że popełniłem błąd.
Moje ostateczne zdjęcie (przed postprocessingiem) przechowuję w półpłytkowej teksturze. Mam również 2 tekstury pomocnicze. Pierwszy przechowuje logarytm logu i jego średni, minimalny i maksymalny kolor na ostatniej mapie mip. Drugi przechowuje wartość dostosowania, która jest obliczana jako:
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
gdzie prevLum jest poprzednią wartością adaptacji (rozmiar tej tekstury to 1x1). Log luminancji ma format R8B8G8, a drugi to R8. W tutorialach widziałem, że używane są tekstury półpłynne, ale w moim przypadku mam zbyt jasne obrazy (prawie białe).
W końcowym module cieniującym postprocess używam wszystkich wartości, aby uzyskać adaptację oka i mapowanie tonów za pomocą tego kodu:
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);
A oto moje wyniki:
- włączona adaptacja oka i mapowanie tonów
- tylko adaptacja oka
- tylko mapowanie tonów
- wszystko wyłączone
Jak widać, gdy mapowanie tonów jest włączone, kolor króliczka jest jaśniejszy. Po włączeniu adaptacji oka ostateczny obraz jest znacznie ciemniejszy. Czy ktoś mógłby mi wyjaśnić, co może to powodować, ponieważ uważam, że coś tu jest nie tak. Może to coś z przestrzeniami kolorów, których nie rozumiem dobrze? Lub z rozkwitem, który jest stosowany przed mapowaniem tonów i adaptacją oka?
Mam też inne dziwne zachowanie z adaptacją oka. Kiedy patrzę na ciemne obszary, tło (niebo) staje się jaśniejsze. Jest ok, ale zdarza się to zawsze, gdy środek kamery znajduje się na czarnym obszarze (bez względu na odległość kamery od tego obszaru).
Opieram się na wdrożeniach zawartych w projektach na tych stronach: John Chapman , Nutty Software