Sto cercando di implementare la mappatura dei toni insieme all'adattamento degli occhi e all'HDR. In realtà l'ho già implementato ma non sono soddisfatto del risultato e penso di aver fatto qualcosa di sbagliato.
La mia immagine finale (prima del postprocessing) che conservo nella trama a mezzo float. Ho anche 2 trame di aiuto. Il primo memorizza la luminanza dei registri e il colore medio, minimo e massimo nell'ultima mip-map. Il secondo memorizza il valore di adattamento che viene calcolato come:
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
dove prevLum è il valore di adattamento precedente (la dimensione di questa trama è 1x1). La trama della luminanza del registro è in formato R8B8G8 e la seconda è R8. Nei tutorial ho visto che vengono usate trame semi-float ma nel mio caso ho immagini troppo luminose (quasi bianche).
Nello shader postprocesso finale sto usando tutti questi valori per ottenere adattamento degli occhi e mappatura dei toni usando questo codice:
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);
Ed ecco i miei risultati:
- adattamento degli occhi e mappatura dei toni attivati
- solo adattamento oculare
- solo mappatura dei toni
- tutto fuori
Come puoi vedere quando la mappatura dei toni è attivata, il colore del coniglietto è più pallido. E quando l'adattamento degli occhi è attivato, l'immagine finale è molto più scura. Qualcuno potrebbe spiegarmi cosa potrebbe causare questo, perché penso che qualcosa qui sia sbagliato. Forse è qualcosa con spazi di colore che non capisco bene? O con la fioritura che viene applicata prima della mappatura del tono e dell'adattamento degli occhi?
Ho anche un altro strano comportamento con l'adattamento dell'occhio. Quando guardo le aree scure, lo sfondo (cielo) diventa più luminoso. Va bene, ma succede sempre quando il centro della fotocamera si trova su un'area nera (indipendentemente dalla distanza della fotocamera da quest'area).
Mi baso sull'implementazione inclusa nei progetti in queste pagine: John Chapman , Nutty Software