Я пытаюсь реализовать тональное отображение наряду с адаптацией глаз и HDR. На самом деле я уже реализовал это, но я не удовлетворен результатом и думаю, что сделал что-то не так.
Мое окончательное изображение (до постобработки) я сохраняю в виде поплавка. У меня также есть 2 вспомогательные текстуры. Первый хранит журнал яркости и среднего, минимального и максимального цветов в последней мип-карте. Второй хранит значение адаптации, которое вычисляется как:
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
где prevLum - предыдущее значение адаптации (размер этой текстуры 1x1). Логарифмическая текстура яркости имеет формат R8B8G8, а вторая - R8. В уроках я видел, что используются текстуры с половиной поплавка, но в моем случае у меня получаются слишком яркие изображения (почти белые).
В последнем шейдере постпроцесса я использую все эти значения, чтобы получить адаптацию глаза и тональное отображение, используя этот код:
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);
И вот мои результаты:
- включена адаптация глаза и отображение тона
- только адаптация глаза
- только тональное отображение
- все выключено
Как вы можете видеть, когда включено отображение тонов, цвет кролика становится бледнее. А когда включена адаптация глаза, конечное изображение становится намного темнее. Может ли кто-нибудь объяснить мне, что может вызвать это, потому что я думаю, что здесь что-то не так. Может быть, это что-то с цветовыми пространствами, которые я не очень хорошо понимаю? Или с цветением, которое наносится перед тональным отображением и адаптацией глаз?
У меня также другое странное поведение с адаптацией глаз. Когда я смотрю на темные участки, фон (небо) становится ярче. Это нормально, но это происходит всегда, когда центр камеры находится в черной области (независимо от того, как далеко камера находится от этой области).
Я опираюсь на реализацию, включенную в проекты на этих страницах: Джон Чепмен , Nutty Software