Estou tentando implementar o mapeamento de tons junto com a adaptação dos olhos e o HDR. Na verdade, eu já implementei isso, mas não estou satisfeito com o resultado e acho que fiz algo errado.
Minha imagem final (antes do pós-processamento) armazeno na textura half float. Eu também tenho 2 texturas auxiliares. O primeiro armazena a luminância do log e a cor média, mínima e máxima no último mapa mip. O segundo armazena um valor de adaptação que é calculado como:
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
onde prevLum é o valor de adaptação anterior (o tamanho dessa textura é 1x1). A textura da luminância do log é o formato R8B8G8 e o segundo é o R8. Nos tutoriais, vi que são usadas texturas semi-flutuantes, mas no meu caso, tenho imagens muito brilhantes (quase brancas).
No final do processo de sombreamento, estou usando todos os valores para obter a adaptação dos olhos e o mapeamento de tons usando este código:
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);
E aqui estão os meus resultados:
- adaptação ocular e mapeamento de tons ativados
- somente adaptação ocular
- somente mapeamento de tom
- tudo fora
Como você pode ver quando o mapeamento de tons está ativado, a cor do coelho é mais pálida. E quando a adaptação ocular é ativada, a imagem final fica muito mais escura. Alguém poderia me explicar o que poderia causar isso, porque acho que algo aqui está errado. Talvez seja algo com espaços de cores que eu não entendo bem? Ou com a flor aplicada antes do mapeamento de tom e adaptação dos olhos?
Eu também tenho outro comportamento estranho com a adaptação dos olhos. Quando olho para áreas escuras, o fundo (céu) fica mais brilhante. Tudo bem, mas sempre acontece quando o centro da câmera está na área preta (não importa a que distância a câmera esteja desta área).
Baseei-me na implementação incluída nos projetos desta página: John Chapman , Nutty Software