Cartes d'ombres réfléchissantes: Partie 1

image

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.

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

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

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

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

image
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 option
La 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 .

Source: https://habr.com/ru/post/fr440488/


All Articles