Bonjour, Habr! Je vous présente la traduction de l'article
«Dynamic Local Exposure» de John Chapman.
Dans cet article, je présenterai quelques idées sur l'exposition locale dynamique dans le rendu HDR. Bart Wronsky a déjà
un excellent article sur ce sujet et je recommande fortement de le lire tout de suite si vous ne l'avez pas déjà fait; les idées ici sont, dans une plus large mesure, basées sur son article. En fin de compte, j'ai inclus d'autres excellents liens.
Plage dynamique faible / élevée
Dans le bon vieux temps (années 1990), les jeux étaient rendus directement au format
LDR (plage dynamique étroite) affiché (espace gamma, 8 bits). C'était simple et bon marché, mais, d'un autre côté, il a considérablement gêné la création d'une image vraiment photoréaliste.
Actuellement, en particulier avec l'avènement du
PBR (rendu physique), les jeux sont rendus avec une gamme dynamique gigantesque dans un espace linéaire avec une précision plus élevée. Avec ce mouvement, le vrai problème vient du photoréalisme: comment afficher une image
HDR en
LDR ?
Exposition automatique globale
L'approche standard du contrôle automatique de l'exposition consiste à mesurer la luminosité moyenne (ou logarithmique moyenne) de la scène, éventuellement avec une fonction de
pondération qui préfère les valeurs proches du centre de l'image. Cela peut être fait très efficacement en utilisant la réduction parallèle ou en sous-
échantillonnant à plusieurs reprises dans la
mipmap du tampon de luminance . Cette dernière approche présente certains avantages, dont je parlerai dans la section suivante.
La luminosité moyenne est ensuite convertie en valeur d'exposition, par exemple en calculant l'inverse de la luminosité maximale admissible de la scène:
float Lavg = exp(textureLod(txLuminance, uv, 99.0).x); float ev100 = log2(Lavg * 100.0 / 12.5); ev100 -= uExposureCompensation;
Obtenu à partir de la norme ISO pour le calcul de la vitesse en fonction de la saturation; pour une explication complète, voir (3)Étant donné que la luminosité moyenne potentielle est instable dans des conditions dynamiques, elle est généralement lissée dans le temps à l'aide de la fonction d'hystérésis exponentielle
(2) :
Lavg = Lavg + (Lnew - Lavg) * (1.0 - exp(uDeltaTime * -uRate));
Commentaire du traducteurCette fonction doit être appliquée dans la luminosité de la texture du sous- échantillonnage du shader et uniquement pendant le calcul du dernier niveau de mip (1x1). En outre, il sera écrit à ce sujet, mais à mon avis, il est facile de l'oublier.
En raison de sa nature globale, cette méthode souffre d'un ombrage sévère ou de hautes lumières des zones de l'image dans lesquelles il y a un écart par rapport à la luminosité moyenne:

Bien que cela corresponde à la capacité de l'œil à s'adapter aux changements de niveaux de lumière, l'effet global est assez loin de ce que nous percevons réellement dans le monde réel.
AE local
Si nous générons une luminosité moyenne avec sous-
échantillonnage , nous avons accès à des niveaux de mip inférieurs du
tampon de
luminance (4) pour obtenir une luminosité moyenne locale.
float Lavg = exp(textureLod(txLuminance, uv, uLuminanceLod).x;
Veuillez noter que pour que cela fonctionne, l'hystérésis ne doit être appliquée qu'à la dernière étape (lors de l'enregistrement d'un niveau de mip 1x1), sinon il y aura des artefacts.En théorie, c'est une excellente idée: chaque zone de l'image peut avoir une bonne exposition, tout en contrastant avec les zones voisines. Cependant, en pratique, un résultat dégoûtant est obtenu:

Les plus désagréables sont les «halos» de blocs que l'on trouve dans les zones à fort contraste:

Cependant, ils peuvent être lissés soit en préfiltrant le
tampon de luminance , soit simplement en utilisant un échantillonnage bicubique:

Ça a toujours l'air dégoûtant, mais déjà mieux.
L'échantillonnage de différents niveaux de mipmap en
luminance modifie le rayon du halo. Ce paramètre est utile pour contrôler l '«apparence» globale du résultat, ainsi que pour minimiser l'effet de halo, bien qu'en raison d'une diminution générale du contraste (il devient un filtre de bordure) ou d'une perte de localité du contrôle d'exposition:

Pourtant, lisser les images fantômes ne suffit pas. Le résultat n'est pas du tout naturel; ressemble à un style extrême de «photo HDR», contrairement à ce qu'une personne voit. Cependant, en mélangeant les valeurs mondiales et locales, nous pouvons tirer le meilleur parti des deux mondes:
float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x; float L = mix(Lglobal, Llocal, uLocalExposureRatio);

En modifiant le facteur de mélange, vous pouvez ajuster l'exposition locale de manière à minimiser les artefacts et à maximiser le réalisme perçu:

Rapport de mixage automatique
L'ajustement manuel
du rapport de mélange est normal dans les situations où nous avons un contrôle absolu de la position de la caméra, de l'éclairage, etc. Cependant, dans de nombreux cas (par exemple, les jeux de plein air avec un changement dynamique de jour et de nuit), ce niveau de contrôle n'est tout simplement pas possible. Dans ce cas, il serait bien de générer automatiquement le
facteur de mixage .
Dans l'image ci-dessous, nous avons une large plage dynamique; principalement des valeurs de luminosité moyennes à faibles et plusieurs zones à forte intensité (ciel dans les fenêtres):

Sans exposition locale, la couleur du ciel est perdue. Dans ce cas, je voudrais un grand
rapport de mélange :

Considérons maintenant l'image ci-dessous, qui a une petite plage dynamique principalement avec une valeur de luminosité élevée:

Dans ce cas, l'application d'une exposition locale réduit trop la luminosité des zones «lumineuses»:

Les données d'observation suggèrent une méthode simple de mélange
des valeurs
locales et
globales : si la différence entre la luminosité moyenne et maximale de la scène est plus grande, alors le coefficient de mélange de l'exposition locale devrait être plus grand. La génération de la
luminosité maximale de la scène peut se faire trivialement lors du calcul de la luminosité, en utilisant l'hystérésis pour lisser le résultat de la même manière que pour la valeur moyenne. Par conséquent, nous pouvons développer le fragment de code précédent comme suit:
float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x;
Veuillez noter que uLocalExposureMax est apparu sur notre entrée pour contrôler le degré maximum absolu d'influence de l'exposition locale. J'ai obtenu un bon résultat uLocalExposureMax <0,3 .Code final float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x;
Conclusion
L'approche décrite ci-dessus impose certaines limites quant au moment où il est nécessaire de mesurer la luminosité d'une scène. Habituellement, la mesure est effectuée immédiatement après le passage de l'éclairage pour éviter l'adaptation des effets de
particules , de la
floraison , etc. Cependant, lorsque la luminosité locale est utilisée, il est important que la valeur réelle qui participe à l'exposition soit présentée dans la
carte de luminance . Cela signifie qu'une mesure de la luminosité doit être effectuée immédiatement avant d'appliquer l'exposition. Si cela est inacceptable, la solution consiste à générer une luminosité locale séparément des valeurs moyennes et maximales.
Bien que je pense qu'utiliser la luminosité locale et globale de la scène ensemble est la «bonne» approche pour créer une image équilibrée et naturelle, la qualité du résultat est évidemment subjective. L'adéquation d'une telle méthode à un jeu particulier dépend entièrement du contenu et du style visuel souhaité. Je serais intéressé d'entendre d'autres idées à cet égard.
Les références
- Cartographie tonale localisée (Bart Wronski)
- Implémentation d'une caméra à base physique (Padraic Hennessy)
- Déplacement des gelures vers PBR (Sébastien Lagarde, et al.)
- Un examen plus approfondi de la cartographie du ton (Matt Pettineo)
- L'importance d'être linéaire (Larry Gritz, et al.)
- Techniques avancées et optimisation des pipelines couleur HDR / VDR (Timothy Lottes)
Images HDR prises à partir de sIBL Archive .