Diffusion atmosphérique dans The Blacksmith

Dès le début de la phase de planification de The Blacksmith, nous savions que nous voulions une solution de diffusion atmosphérique qui nous donnerait un peu plus de détails et de contrôle que les options de brouillard intégrées. Nous avons notamment souhaité mettre l’accent sur l’effet de perspective aérienne dans certains des plans les plus vastes du film.

Alors que nous commencions à travailler sur une solution de diffusion pour le projet, nous avons d'abord implémenté et joué avec les modèles de simulation présentés dans plusieurs articles de Tomoyuki Nishita[1]. Après quelques expérimentations et prototypages de différents plans, nous avons finalement décidé qu’il serait préférable de viser un modèle permettant un contrôle artistique étendu pour chacun des plans du court métrage. Nous voulions une solution qui nous permettrait de nous rapprocher des éléments primaires des modèles physiques, mais qui nous permettrait également de briser toutes les règles lorsque cela était nécessaire. Nous avions également besoin que la solution n’ait pas un impact énorme sur les performances d’exécution du court métrage, et nous nous sommes fixés pour objectif de pouvoir effectuer la plupart des calculs par vertex plutôt que par pixel.
Nous nous sommes fixé comme objectif d’essayer d’imiter les effets combinés de la diffusion Rayleigh et Mie à partir des modèles physiques. Nous avons également ajouté un troisième élément représentant différents types d’effets de diffusion à basse altitude ; collectivement appelés diffusion en hauteur. Une autre divergence clé par rapport aux modèles basés sur la physique était que nous avons décidé de continuer à utiliser des textures de ciel HDR , au lieu de générer le ciel et les nuages de manière procédurale. L'inconvénient évident de cela est que la mise en place de quelque chose comme l'heure dynamique de la journée (dont nous n'avions pas besoin pour The Blacksmith) devient un peu plus compliquée, alors que l'avantage principal est de conserver un contrôle artistique total sur le ciel.
Diffusion de Rayleigh
La diffusion Rayleigh de la lumière solaire dans l'atmosphère est la raison de la teinte bleu vif du ciel pendant la journée et du rougissement du soleil et de l'horizon au lever et au coucher du soleil.
Dans notre émulation, nous omettons le soleil lui-même et nous nous concentrons uniquement sur la modélisation des couleurs et de l'extinction produites par la diffusion entrante et sortante de la lumière du soleil. Une représentation visuelle du soleil peut être ajoutée soit dans la texture du ciel, dans le cadre de la diffusion Mie, sous forme de sprite d'éruption solaire, ou dans toute combinaison de ceux-ci. Dans sa forme la plus simple, la densité de notre diffusion Rayleigh se réduit à une fonction exponentielle glorifiée modulée par la fonction de phase Rayleigh. Cependant, nous disposons d’un contrôle supplémentaire sur les données qui y sont stockées et sur celles que nous en extrayons. Comme nous ne modélisons pas la lumière de différentes longueurs d’onde voyageant dans l’atmosphère, les densités que nous calculons sont des valeurs scalaires. Nous utilisons une rampe de couleurs HDR pour permettre différentes teintes de lumière diffusée à l'horizon et vers le zénith, et utilisons une fonction de prise en compte de la distance pour composer la teinte finale.

Dispersion de Mie
La diffusion de la lumière solaire dans l’atmosphère contribue au halo lumineux autour du soleil, à l’apparence gris-blanc des nuages et à la brume que l’on peut voir au-dessus des villes polluées. Contrairement à la diffusion de Rayleigh, qui diffuse la lumière selon une forme presque uniforme, la diffusion de Mie est fortement directionnelle vers l'avant.
Dans notre émulation, nous laissons la diffusion Mie représenter principalement la brume et le halo autour du soleil. En tant que tel, nous le teintons presque toujours pour compenser le fait que notre émulation Rayleigh ignore le soleil. Techniquement, nos fonctions Rayleigh et Mie sont très similaires, la différence significative étant la fonction de phase appliquée à la sortie. Comme de nombreuses autres implémentations, nous utilisons la fonction de diffusion Henyey-Greenstein pour contrôler l’anisotropie – ou la directionnalité vers l’avant – de la diffusion Mie.

Les personnes qui ont lu les articles de recherche pourraient se moquer de notre choix de noms, étant donné que nous prenons certaines « libertés » dans ce que nous incluons dans chacune des émulations. Nous avons constaté très tôt que les gens utilisaient généralement le nom Rayleigh pour décrire la « diffusion du ciel » et Mie pour décrire la « brume solaire », nous avons donc décidé de continuer à utiliser ces noms même après que les modèles d'implémentation aient été simplifiés à partir des modèles physiques.
Diffusion en hauteur
L'élément de diffusion en hauteur représente un mélange de divers effets de diffusion à basse altitude, notamment le brouillard de rayonnement, la brume au sol et les nuages bas.
Notre mise en œuvre de la diffusion de hauteur est assez simple ; la densité de hauteur est calculée à partir d'un niveau de la mer défini et d'une diminution de hauteur. Cela met ensuite à l’échelle la densité exponentielle basée sur la distance, et l’ensemble est teinté de la couleur souhaitée.

Occlusion diffuse
Étant donné que notre contribution à la diffusion est principalement causée par la diffusion de la lumière du soleil vers l'observateur, loin de l'observateur, ou par son absorption par des particules sur son chemin vers l'observateur, il est logique que quelque chose se produise si des objets bloquent la lumière du soleil.
Pour gérer de tels cas, nous parcourons la carte d'ombre en cascade de la lumière directionnelle et accumulons la quantité d'occlusion le long du rayon dans une mémoire tampon hors écran à échelle réduite. Lors de l'application de la diffusion au pixel de sortie, nous suréchantillonnons cette carte d'occlusion avec un filtre sensible aux bords et l'utilisons pour composer la couleur finale du pixel. C'est à cette étape de combinaison que nous rencontrons quelques problèmes ; comme notre solution est uniquement une diffusion unique, nous ne pouvons pas simplement masquer toute la lumière diffusée, car cela nous laisserait avec une image très sombre et peu naturelle. Nous ne voulions pas non plus étendre la solution pour gérer la diffusion multiple plus complexe et plus coûteuse. En fin de compte, la solution pour nous a été d'inventer un « facteur indirect » où l'on pourrait simplement désigner explicitement un certain pourcentage de diffusion à traiter comme indirect plutôt que direct.

Mettre tout cela ensemble
Il ne reste plus maintenant qu'à combiner les différents éléments pour composer l'image finale. En additionnant les éléments Rayleigh, Mie et Height, nous commençons avec une belle composition des différentes couleurs de diffusion.

Ensuite, nous devons nous assurer que nous utilisons ce tampon d’occlusion à bon escient. Nous utilisons différents paramètres de force pour ajuster la quantité d'occlusion appliquée à la diffusion directe, indirecte, dans les nuages et dans le ciel.

Finalement, il ne reste plus qu'à mélanger la diffusion avec l'image rendue. Nous assombrissons l'image transmise par l'extinction totale accumulée, et l'éclaircissons par la diffusion totale accumulée. Ceci donne la composition finale de nos scènes d’exemple.

Nous avons extrait la diffusion atmosphérique dans un projet distinct que vous pouvez obtenir à partir de l'Asset Store. En plus de tout le code et des shaders composant la solution, le projet contient également tous les préréglages de configuration utilisés pour générer les images de cet article. N'oubliez pas de consulter le fichier readme inclus pour plus de détails sur la signification des différentes options de configuration.
Références:
[1]: Affichage de la Terre prenant en compte la diffusion atmosphérique
https://nishitalab.org/user/nis/cdrom/sig93_nis.pdf
[1]: Méthode d'affichage de la couleur du ciel prenant en compte la diffusion multiple
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.5595&rep=rep1&type=pdf
[1]: Affichage des nuages prenant en compte la diffusion anisotrope multiple et la lumière du ciel
https://www.researchgate.net/publication/220720838_Display_of_Clouds_Taking_into_Account_Multiple_Anisotropic_Scattering_and_Sky_Light
Le ciel HDR dans le package provient de NoEmotionHDRs (Peter Sanitra) /Copyright © 2019 CC BY-ND 4.0. Utilisé sans modification.
