Volumes de propagation de la lumière: filtrage anisotrope des données de volume

9

J'ai implémenté l'algorithme Cascaded Light Propagation Volumes (pas encore d'ombrage indirect) pour un éclairage global diffus en temps réel détaillé ici et ici . Cela fonctionne bien, mais j'essaie toujours de réparer un artefact en particulier.

Court résumé

Vous pouvez ignorer cela si vous savez déjà comment fonctionne l'algorithme.

L'algorithme fonctionne en stockant les informations d'éclairage sous la forme d'harmoniques sphériques dans une grille 3D, où initialement les données dans chaque cellule de la grille proviennent du rendu d'une carte d'ombre étendue ( carte d'ombre réfléchissante) qui inclut également la couleur et des informations normales, en plus de la profondeur. L'idée est qu'essentiellement tous les pixels vus par une source de lumière sont la cause du premier rebond de l'éclairage indirect, vous stockez donc les informations requises à côté du tampon de profondeur ordinaire que vous utilisez pour la cartographie des ombres et échantillonnez toutes les données pour initialiser la grille 3D . Les informations dans la grille 3D sont ensuite propagées de manière itérative en (pour chaque itération) propageant les informations dans une cellule à l'ensemble de ses 6 voisins directs (au-dessus, en dessous, à gauche, à droite, en haut, en bas). Pour éclairer la scène à l'aide des informations de la grille, vous appliquez un passage plein écran sur votre scène, et pour chaque pixel pixellisé, vous disposez de la position spatiale mondiale de la surface pixellisée (par exemple, à partir des tampons G en ombrage différé), de sorte que vous savoir à quelle cellule de la grille appartient un certain pixel de l'écran.

Cela fonctionne très bien pour la plupart, voici deux images sans GI simulé et juste un terme ambiant codé en dur, et à côté une image avec l'algorithme LPV. Remarquez les reflets colorés sur les surfaces, de meilleurs détails en profondeur, etc.

entrez la description de l'image ici

Problème

Lors de la recherche des cellules pendant la phase d'éclairage, l'interpolation trilinéaire (à l'aide de filtres de texture matériels) est utilisée pour interpoler en douceur les données entre le centre d'une cellule, ses cellules voisines et la coordonnée de texture recherchée réelle. Essentiellement, cette interpolation imite la propagation des informations d'éclairage au centre d'une cellule vers les pixels en béton autour du centre où les informations sont recherchées. Ceci est nécessaire car sinon l'éclairage serait très rugueux et laid. Cependant, puisque l'interpolation trilinéaire ne prend pas en compte la direction de propagation de la lumière des informations d'éclairage codées dans une cellule (rappelez-vous, c'est en harmoniques sphériques), la lumière peut être propagée de manière incorrecte vers le pixel recherché. Par exemple, si le rayonnement codé dans la cellule ne se propage que vers (1,0,0) ("

Cela provoque un saignement de la lumière incorrectement dans les murs lorsque la taille des cellules dans la grille est grande par rapport aux surfaces de la scène (cela est nécessaire car vous avez besoin de grandes cellules pour propager la lumière loin dans la scène avec le moins d'itérations de propagation possible). Voici à quoi ça ressemble:

entrez la description de l'image ici

Comme vous pouvez le voir (à partir des contours d'ombre en haut à droite), la scène est éclairée par une source de lumière directionnelle quelque part au-dessus de la scène en haut à gauche. Et comme il n'y a qu'une seule cellule séparant l'extérieur de l'oreillette et l'intérieur, la lumière passe à travers et le mur à gauche n'est pas éclairé correctement.

Question réelle

L'auteur propose une forme de filtrage anisotrope manuel pour résoudre ce problème. Il donne un gradient de radiance (je suppose des coefficients SH échantillonnés à partir de la cellule actuelle) vers la direction de la normale de surface n comme:

entrez la description de l'image ici

Et déclare

Ainsi, en comparant la dérivée directionnelle de radiance avec la direction de radiance réelle, il peut être calculé si la distribution de radiance commence plus loin que son interpolation trilinéaire pour ce point.

Mes questions):

Dans l'équation, la fonction c (x) semble être les coefficients SH au point (x). Le gradient de radiance semble donc être calculé comme une dérivée numérique normale comme la différence pondérée des coefficients SH aux points x - (n / 2) et x + (n / 2). Cependant, quel est c (x) dans mon contexte? Actuellement, je suppose que c (x) fait référence aux coefficients interpolés trilinéairement à l'emplacement de la surface (x), mais je ne suis pas sûr du tout, car je ne sais pas comment cela est censé vous donner plus d'informations sur la directionnelle distribution des coefficients SH.

Et comment ce gradient est-il ensuite utilisé pour changer la façon dont l'éclairage échantillonné de la cellule est appliqué aux surfaces, exactement? L'auteur écrit simplement «comparer la dérivée directionnelle de la radiance avec la direction réelle de la radiance», mais c'est assez vague.

Il mentionne l'utilisation d'un "schéma de différenciation central" et fait référence à ces diapositives pour la différenciation centrale des coefficients SH, et fait également référence à cet article qui montre les dérivations du gradient, mais pour l'instant je ne peux pas en tirer de conclusions utiles.

TravisG
la source

Réponses:

4

La différence centrale a été introduite par un article d'AMD lorsqu'ils ont fait une démo avec des cristaux volant dans un tunel, de mémoire.

La cfonction n'a pas besoin d'être quelque chose de précis, juste une idée, par exemple, de la radiance, alors évaluez simplement le SH en utilisant votre normale actuelle.

Ensuite, ce que vous faites avec cela, c'est que vous atténuez, en utilisant un facteur empirique, le rayonnement en utilisant ce différentiel. Mais ne vous abaissez que si le différentiel implique que le flux lumineux s'éloigne de votre normale actuelle.

Fondamentalement, l'idée est de détecter empiriquement le fait que si vous allez dans la direction opposée à la normale de votre mur, le flux lumineux diminue lentement, car il se propage dans l'air (de l'autre côté). Mais si vous sondez un peu devant votre normale, vous remarquerez une chute soudaine de flux, cela signifie que la cellule que vous échantillonnez maintenant est en fait une fuite.

J'ai trouvé que cela fonctionne dans 70% des cas, mais s'il est appliqué avec négligence, il peut créer des effets de trous noirs très étranges, ou des changements de teinte (rose, vert ...) sur les zones très sombres qui contiennent une fuite de lumière d'une autre taille. C'est parce que vous avez 3 LPV pour chaque couleur, la différence centrale a tendance à donner des résultats différents. Si vous en êtes capable, essayez d'utiliser la luminosité en niveaux de gris pour évaluer l'amortisseur de différence centrale et utilisez un facteur de réduction commun à tous les canaux de couleur ultérieurement.

Sans ce hack, vous ne devriez normalement pas avoir beaucoup d'éclat de toute façon, car la normale que vous utilisez pour évaluer le SH est opposée à la direction du flux. Cependant, comme vous le remarquez, les 2 bandes SH utilisées en LPV ne sont pas suffisantes en fait, et ont une forte composante DC qui donne ces puissantes fuites. C'est pourquoi le LPV n'est pas pratique pour les géométries qui ne sont pas étroitement contrôlées par un artiste sensibilisé au LPV, qui donnera à chaque mur une épaisseur minimale pour réduire les fuites.

Certaines entreprises (comme Square Enix) utilisent également des murs de blocage conçus manuellement pour tuer les fuites, comme le volume de la géométrie devrait vous donner. (le volume de la géométrie aide à réduire les fuites, mais la rétroprojection RSM pour voxéliser la scène est trop partielle dans la plupart des cas et crée un aliasing au niveau des cellules LPV qui donne un aspect encore pire aux fuites car elles varient étrangement en intensité).

Vous ne pouvez que le sucer et essayer d'atténuer les problèmes en donnant au LPV un dernier mot moins fort sur la lumière indirecte finale, utilisez un terme constant avec un poids (0,5?) Et le LPV pourrait contribuer au 0,5 restant de l'indirect lumière. Essayez également d'implémenter le volume géométrique, cela réduira le problème. Et enfin la différence centrale.

v.oddou
la source
comme amélioration de plus de 50% de la température ambiante constante, une technique appelée "BRDF ambiante" (par tri-Ace) peut être utilisée.
v.oddou