Gestion de l'aliasing projectif dans le mappage d'ombres

15

Je joue avec la modélisation 3D procédurale simple pour créer de minuscules bâtiments pour l'impression 3D. Un exemple:

Le bâtiment


Pour rendre les modèles plus lisibles à l'écran, j'ai mis en œuvre un mappage d'ombres de base pour une seule lumière directionnelle. Étant donné que ma scène ne change pas, je rend juste la carte d'ombre une fois à l'aide d'une boîte alignée sur l'axe de la scène pour déterminer quelles devraient être les limites de la carte d'ombre. Les ombres et les limites semblent avoir toutes les matrices correctes, mais se rapprocher un peu semble terrible:

Gros plan de la tour

D'après la lecture que j'ai faite, je comprends le panoramique de Peter et ce que je pourrais faire à ce sujet, mais les bords irréguliers, qui je crois est une forme d'alias projectif, semblent si mauvais que je pense que quelque chose ne va pas dans mon implémentation de base.

J'ai piraté le pixel shader pour montrer les limites du texel d'ombre:

Affichage des limites de Texel

J'ai un filtrage bilinéaire dans la texture (sans cela, je reçois une sérieuse acné d'ombre). Malheureusement, ma tentative de PCF a également échoué - elle semble tout aussi irrégulière:

entrez la description de l'image ici

Voici le cas d'échantillon unique avec filtrage bilinéaire désactivé:

entrez la description de l'image ici

Cela ressemble-t-il à un aliasing projectif "typique"? Le rendu dynamique de la carte d'ombre, en utilisant le tronc de vue coupé à la scène, éventuellement en cascade, pourrait-il résoudre le problème?

Edit: Ajout d'un gros plan de filtrage bilinéaire, comparaison post-ombre, juste pour montrer ce que j'obtiens. L'acné de mauvaise ombre apparaît en raison des bords intérieurs; Je modélise avec des blocs virtuels empilés et ne fais pas une opération d'union appropriée. D'après ma lecture, la mise en œuvre d'opérations booléennes sur les polyèdres n'est pas anodine, mais me permettra également d'implémenter des volumes d'ombre statiques ainsi que de nettoyer certains logiciels d'impression 3D.

Filtrage bilinéaire

Daniel M Gessel
la source

Réponses:

10

La cartographie des ombres avec une qualité acceptable est tout un voyage. Vous avez donc mis en œuvre la première étape - une carte d'ombre de base qui englobe statiquement toute la scène. Cela signifie que la taille du texel de la texture de l'ombre dans l'espace de la vue claire à la taille du texel de la scène rendue dans le rapport d'espace de la vue de la caméra est assez grande, ce qui entraîne un aliasing. Pour réduire ce rapport plus près de 1: 1, il existe des techniques que vous avez mentionnées comme:

  • le moyen le plus simple consiste à augmenter la taille de votre shadow map, pour trouver la valeur avec des performances toujours optimales,
  • aligner la carte des ombres sur le tronc de la vue de la caméra. Ensuite, la carte d'ombre englobe une plus petite partie de la scène, ce qui réduit le crénelage,
  • cela peut être amélioré en CSM, qui fait la même chose mais vous devez rendre la scène pour chacune des cascades avec une position centrale différente de la matrice de vue de la lumière en fonction du point central de chaque tranche de tronc.

Certaines des techniques de base pour lisser le bord de l'ombre:

  • évidemment PCF, mais est-il recommandé de combiner votre implémentation PCF avec du matériel PCF intégré (en Opengl - en utilisant sampler2DShadow). Cela entraînerait moins d'itérations de boucle de votre côté et un PCF moins cher,
  • le blocage des bords peut être échangé contre du bruit en utilisant un disque de Poisson tourné. Les échantillons utilisés pour échantillonner à partir de la carte fantôme subissent une rotation aléatoire à chaque itération de la boucle PCF.

Vous pouvez également rechercher les techniques de lissage des bords comme:

  • rendre la carte des ombres au tampon d'images appliqué par MSAA,
  • améliorer encore PCF par interpolation ,
  • nombre croissant d'échantillons avec mélange temporel .

La technique de base PCF souffre d'acné de l'ombre qui peut être corrigée en appliquant un certain décalage dans le test de l'ombre. Le calcul de la taille de ce décalage est également un domaine de recherche .

D'autres méthodes de carte d'ombre plus avancées incluent:

  • Cartes d'ombre exponentielles et cartes d'ombre de variance - dans la plupart des cas, ne souffrent pas d'acné d'ombre et offrent des bords lisses sans bloc, mais au prix de certaines situations de fuite de lumière,
  • Cartes d'ombre à variation exponentielle - probablement la technique la plus avancée de mappage d'ombre de carte de profondeur 2D, combine une grande fluidité de VSM et résout les fuites de lumière, dans un coût d'utilisation de la mémoire doublant,
  • Ombres douces plus proches en pourcentage - technique de base pour améliorer les cartes d'ombres traditionnelles avec différentes tailles de pénombre,
  • Cartes d'ombres à vues multiples - plusieurs cartes d'ombres d'une certaine technique, disposées sur la lumière de la zone, pour calculer des ombres douces réalistes avec une taille de pénombre variable,
  • Deep Shadow Maps - pour améliorer la diffusion volumétrique avec des ombres,
  • Ombres tracées par rayons en temps réel - probablement l'avenir.

Vous n'avez pas échoué avec PCF, ça ressemble à ça :)

Je souhaite qu'il y ait un moyen d'appliquer un flou gaussien sur la carte d'ombre dans l'espace de vue de la caméra, mais cela ne fonctionne pas comme prévu.

narthex
la source
Une partie de ce commentaire vous remercie de votre réponse, j'ai donc pensé que je vous ferais savoir car vous ne recevrez pas de notification à partir de là.
trichoplax
Oui, je l'ai vu mais merci.
narthex
1

Vous avez dit que "... filtrage bilinéaire dans la texture ...". Il semble que vous interpoliez les valeurs de profondeur de la carte d'ombre. La bonne façon d'utiliser l'interpolation avec la carte d'ombre est de l'appliquer sur les résultats des tests d'ombre (pour autant que je m'en souvienne, OpenGL prend cela en charge). Vous pouvez même combiner l'interpolation des résultats des tests fantômes avec PCF, ce qui fournira de bien meilleurs résultats. Cependant, comme vous l'avez peut-être remarqué, l'aliasing est un fléau qui poursuit toujours le mapping d'ombre :)

Bien que je comprenne que vous cherchez des solutions concernant le mappage d'ombres (même parce qu'il est assez simple à mettre en œuvre), avez-vous déjà envisagé l'utilisation de volumes d'ombres? Il est beaucoup plus complexe à implémenter, mais ne souffre pas du tout d'alias, et je pense qu'il conviendrait parfaitement à vos besoins.

Christian Pagot
la source
Merci beaucoup pour les réponses! Pour obtenir les résultats que je recherche, il pourrait être approprié de passer aux volumes fantômes. Le lien de flux de code fourni sous "interpolation" est très utile - merci!
Daniel M Gessel