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.
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:
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:
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.