
Bonjour, Habr! Je vous présente la traduction de l'article
«Reflective Shadow Maps» d'Eric Polman.
Reflective Shadow Maps (RSM) est un algorithme qui étend la
carte d'ombre «simple». L'algorithme prend en compte la lumière diffusée après le premier coup sur la surface (
diffuse ). Cela signifie qu'en plus de l'éclairage direct, vous bénéficiez d'un éclairage indirect. Dans cet article, je vais analyser l'algorithme d'un
article officiel pour l'expliquer humainement. Je vais également parler brièvement de la
cartographie des ombres .
Cartographie des ombres
Shadow Mapping (SM) est un algorithme de génération d'ombres. Selon l'algorithme, nous stockons la distance de la source lumineuse à l'objet dans la carte de profondeur.
La figure 1 montre un exemple de carte de profondeur. Il stocke la distance (profondeur) pour chaque pixel.
Figure 1: Cette image montre une carte de profondeur. Plus le pixel est proche, plus il est brillant.Ainsi, lorsque vous avez une carte de profondeur en termes de source lumineuse, vous dessinez ensuite la scène en termes de caméra. Pour déterminer si un objet est allumé, vous vérifiez la distance entre la source de lumière et l'objet. Si la distance à l'objet est supérieure à la valeur stockée dans
la carte d'ombre (profondeur), l'objet est dans l'ombre. Cela signifie que le sujet ne doit pas être éclairé.
La figure 2 montre un exemple. Vous effectuez ces vérifications pour chaque pixel.
Figure 2: La distance entre la source de lumière et le pixel dans l'ombre est supérieure à la distance stockée dans la carte des ombres.Cartographie d'ombre réfléchissante
Maintenant que vous comprenez le concept de base de la
Shadow Mapping , nous allons continuer avec la
Reflective Shadow Mapping (RSM). Cet algorithme étend les fonctionnalités des «
shadow maps » simples. En plus
des données de
profondeur , vous stockez également la position de l'espace-monde (dans le système de coordonnées universelles), les
normales de l' espace-monde et le
flux (
flux lumineux). Je vais vous expliquer pourquoi vous avez besoin de ces données.
Les données
Position dans le monde
Dans l'espace mondial
RSM , la position doit être stockée afin de déterminer la distance entre les pixels. Ceci est utile pour calculer l'atténuation de la lumière. La lumière s'estompe (devient moins concentrée) lorsqu'une certaine distance passe. La distance entre deux points dans l'espace est utilisée pour calculer l'intensité lumineuse.
Normal
Les normales (espace-monde) sont utilisées pour calculer la réflexion de la lumière à partir d'une surface. Dans le cas de
RSM, ils sont également utilisés pour déterminer si un pixel donné est une source de lumière pour un autre pixel. Si les deux normales coïncident pratiquement, elles ne se donneront pas beaucoup de lumière réfléchie.
Flux lumineux (Flux lumineux)
Le flux est l'intensité lumineuse d'une source lumineuse. Son unité de mesure est le
lumen , un terme que vous pouvez actuellement voir sur les paquets d'ampoules. L'algorithme stocke le
flux pour chaque pixel pendant qu'une carte d'ombre est dessinée.
Le flux est calculé en multipliant l'intensité lumineuse par le coefficient de réflexion. Pour la
lumière directionnelle, vous obtenez une image uniformément éclairée. Pour la
lumière spot, vous considérez également l'angle d'incidence. L'atténuation et le cosinus de réception (entre la normale et le vecteur lumière) ne sont pas pris en compte, car cela est pris en compte lorsque l'on considère l'éclairage indirect. Cet article ne couvrira pas les détails.
La figure 3 montre les textures de la
lumière spot d'un article officiel.
Figure 3: Les quatre cartes contenues dans RSM sont représentées. De gauche à droite: carte des profondeurs, position de l'espace-monde, espace-monde normal, flux.Application de données
Maintenant que les données sont générées (théoriquement), il est temps de les appliquer à l'image finale. Lorsque vous dessinez l'image finale, vous calculez l'effet de chaque source de lumière sur chaque pixel. En plus d'éclairer simplement les pixels à l'aide de sources lumineuses, vous utilisez désormais également la
carte d'ombres réfléchissantes .
Une approche naïve pour calculer la contribution de l'éclairage consiste à passer par tous les texels dans
RSM . Vous vérifiez si la lumière du texel dans le
RSM atteint le pixel que vous comptez. Cela se fait en utilisant les positions de l'espace-monde et l'espace-monde normal. Vous calculez la direction de la position de l'espace mondial dans le texel
RSM au pixel. Ensuite, vous le comparez à la normale en utilisant le produit scalaire des vecteurs. Toute valeur positive signifie que le pixel doit être éclairé à l'aide d'un
flux , qui est stocké dans
RSM .
La figure 4 montre cet algorithme.
Figure 4: Démonstration de la contribution de l'éclairage indirect sur la base des positions et des normales de l'espace mondial.Les cartes d'ombre (et les
RSM ) sont intrinsèquement grandes (512x512 = 262144 pixels), donc la vérification de chaque texel est loin d'être optimale. Au lieu de cela, il est préférable de faire un certain nombre d'échantillons à partir de la carte. Le nombre d'échantillons dépend de la puissance de votre matériel. Un nombre insuffisant d'échantillons peut produire des artefacts tels que des rayures ou un scintillement.
Les texels qui affecteront le plus le résultat d'éclairage sont les plus proches du pixel calculé. La méthode d'échantillonnage, qui recueille la plupart des échantillons près des coordonnées des pixels, donnera de meilleurs résultats. Cette méthode est appelée
«échantillonnage d'importance» . L'article officiel décrit que la densité d'échantillonnage diminue avec le carré de la distance du pixel que nous calculons.
Nous devons également mettre à l'échelle l'intensité des échantillons en tenant compte d'un facteur qui dépend de la distance. Cela est dû au fait que les texels sont situés plus loin, bien qu'ils soient échantillonnés moins souvent, mais en réalité ils ont la même quantité de flux. Par conséquent, en pixels éloignés, vous devez augmenter l'intensité pour atténuer l'inégalité, tout en conservant un petit nombre d'échantillons.
La figure 5 montre comment cela fonctionne.
Figure 5: Échantillonnage d'importance. Plus d'échantillons sont prélevés au centre et les échantillons sont mis à l'échelle par un facteur basé sur leur distance du point central. Adapté d'un article sur RSM .En optionLa projection du pixel actuel sur la carte d'ombre est prise comme point (s, t). Et les coordonnées d'échantillonnage relatives à (s, t) sont calculées à l'avance et transférées au shader sous forme de tableau.
Vous devez considérer l'échantillon comme une source ponctuelle d'éclairage. Vous utilisez la valeur du
flux comme
couleur de lumière et uniquement les sources de lumière opposées au pixel.
Conclusion
L'
article officiel discute plus en détail d'autres optimisations de cet algorithme, mais je m'y attarderai. La section
Interpolation écran-espace décrit comment vous pouvez augmenter la productivité, mais je pense que l'
échantillonnage d'importance sera suffisant pour commencer.
La
deuxième partie présente la mise en œuvre de
RSM .