Я намагаюся реалізувати відображення тону разом із адаптацією очей та HDR. Насправді я це вже реалізував, але результатом я не задоволений, і думаю, що я зробив щось не так.
Моє остаточне зображення (перед післяобробкою) я зберігаю в напівфалійній текстурі. У мене є також 2 допоміжні текстури. Перший зберігає яскравість журналу та середню, мінімальну та максимальну кольори в останній mip-карті. У другому зберігається значення адаптації, яке обчислюється як:
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
де prevLum - попереднє значення адаптації (розмір цієї текстури - 1х1). Текстура яскравості журналу - формат 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