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