Path tracer - matériaux multicouches et échantillonnage d'importance

12

J'essaie actuellement d'implémenter un traceur de chemin Monte Carlo. J'ai fait quelques recherches et il semble qu'une approche commune des matériaux consiste à utiliser un modèle en couches. Quelque chose comme ça:

entrez la description de l'image ici

Lorsque la lumière frappe la surface, Fresnel nous indique quelle part de cette lumière est réfléchie par la première couche et combien va à la seconde, etc.

J'ai donc fait quelque chose de similaire, mais plus simple: une seule couche de spéculaire et une couche de diffus. Pas encore de transmission. Jusqu'ici tout va bien, j'utilise un simple brdf pondéré en cosinus pour mon diffus et le modèle microfacetté Cook-Torrance pour mon spéculaire.

Maintenant vient la partie difficile: que dois-je faire une fois qu'un rayon frappe la surface? Normalement, je choisissais le brdf correspondant au matériau de surface, échantillonnais une direction de lumière incidente, évaluais le brdf et divisais par la bonne fonction de distribution de probabilité.

Mais ici, un coup de surface correspond effectivement à plusieurs matériaux. La façon naïve de gérer cela serait d'échantillonner une fois pour chaque couche touchée. Mais cela est clairement la source d'un énorme impact sur les performances, ce qui fait que mon chemin devient effectivement un arbre.

Y a-t-il une meilleure solution?

castan
la source
1
Ne pouvez-vous pas «monter-carlo» les couches de matière? Par exemple, pondérez chaque couche en fonction de leur réflectivité et choisissez-en une au hasard en fonction de cela. Les couches plus profondes auront besoin d'une certaine atténuation basée sur la somme de l'absorption de toutes les couches au-dessus d'elles.
PaulHK
PaulHK C'est exactement ce que je fais dans mon traceur de chemin, la roulette russe pour chaque interface entre les couches, donc pas de branchement du tout. Malheureusement, mon implémentation n'est pas encore terminée, donc je n'ai pas d'informations sur les performances réelles. J'ai basé mon implémentation sur le document "Arbitrially Layered Micro-Facet Surfaces" d'Andrea Weidlich et Alexander Wilkie, qui semble être plus limité que le cadre de Wenzel Jakob (souligné dans la réponse de Stefan), mais qui est capable de générer de très bons résultats et est beaucoup plus simple à mettre en œuvre.
Christian Pagot

Réponses:

7

Wenzel Jakob et al ont présenté un cadre pour les matériaux en couches au SIGGRAPH 2014. La section 6.2 explique l'importance de l'échantillonnage. Si vous préférez le code aux équations, la méthode est implémentée dans le rendu Mitsuba .

Stefan Werner
la source
2
Notez que la méthode de Jakob et al. repose sur le rendu de données BSDF tabulées dans une représentation de base de Fourier spécialisée. Pour plus de détails, reportez-vous également au rapport technique correspondant . Une implémentation open-source est également disponible dans la 3ème édition la plus récente de PBRT . Les fichiers BSDF peuvent être générés avec layerlab en Python.
tizian