Traçage de chemin et matériaux

8

Je m'interroge sur la technique utilisée lors de l'échantillonnage d'un matériau en couches pour le prochain événement dans un traceur de chemin. J'ai un matériau à trois couches: une base diffuse, des lobes spéculaires et brillants. Comment procéder pour choisir une couche discrète à échantillonner pour la prochaine direction de rayon? Est-ce juste une sélection aléatoire? Dans l'affirmative, des poids égaux sont-ils attribués aux couches ou des poids sont-ils utilisés en fonction de la contribution finale d'un lobe? Merci pour tout aperçu de cette étape d'échantillonnage.

~ M

Mark Davies
la source

Réponses:

12

Cette question est quelque peu liée à celle-ci .

Comme Alan l'a déjà dit, suivre le chemin lumineux réel à travers chaque couche conduit à des résultats plus précis physiquement. Je baserai ma réponse sur un article d'Andrea Weidlich et d'Alexander Wilkie ( "Surfaces à micro-facettes à couches arbitraires" ) que j'ai lu et partiellement mis en œuvre. Dans l'article, les auteurs supposent que la distance entre deux couches est inférieure au rayon d'un élément à aire différentielle. Cette hypothèse simplifie la mise en œuvre car nous n'avons pas à calculer les points d'intersection séparément pour chaque couche, en fait nous supposons que tous les points d'intersection sur les couches sont exactement le même point.

Selon le document, deux problèmes doivent être résolus afin de rendre le matériau multicouche. La première consiste à échantillonner correctement les couches et la seconde consiste à trouver le BSDF résultant généré par la combinaison des multiples BSDF qui se trouvent le long du chemin d'échantillonnage.

MISE À JOUR: En fait, j'ai adopté une méthode différente pour mettre en œuvre l'évaluation de ce modèle en couches. Bien que j'aie gardé l'idée de considérer les points d'intersection comme étant exactement le même point le long des couches, j'ai calculé l'échantillonnage et le BRDF final différemment: pour l'échantillonnage, j'ai utilisé le lancer de rayons ordinaire, mais à travers les couches (en russe Roulette pour choisir entre réflexion / réfraction quand c'est le cas); pour l'évaluation finale des BRDF, je multiplie simplement chaque BRDF parcouru par le trajet des rayons (pondération des radiances incidentes en fonction du cosinus du rayon incident).

Échantillonnage

Dans cette première étape, nous déterminerons le chemin lumineux réel à travers les couches. Lorsqu'un rayon lumineux se déplace d'un milieu moins dense, par exemple l'air, vers un milieu plus dense, par exemple le verre, une partie de son énergie est réfléchie et la partie restante est transmise. Vous pouvez trouver la quantité d'énergie réfléchie par les équations de réflectance de Fresnel . Ainsi, par exemple, si la réflectance de Fresnel d'un diélectrique donné est de 0,3, nous savons que 30% de l'énergie est réfléchie et 70% seront transmis:

entrez la description de l'image ici

Lorsque le rayon lumineux passe d'un milieu plus dense à un milieu moins dense, le même principe décrit par la réflectance de Fresnel s'applique. Cependant, dans ce cas spécifique, une réflexion interne totale (aka TIR) peut également se produire si l'angle du rayon incident est supérieur à l'angle critique. Dans le cas du TIR, 100% de l'énergie est réfléchie dans le matériau:

entrez la description de l'image ici

Lorsque la lumière frappe un conducteur ou une surface diffuse, elle sera toujours réfléchie (étant la direction de réflexion liée au type de BRDF). Dans un matériau multicouche, le trajet de lumière résultant sera le résultat global de toutes ces possibilités. Ainsi, dans le cas d'un matériau à 3 couches, en supposant que les première et deuxième couches sont des diélectriques et que la troisième couche est diffuse, on pourrait se retrouver, par exemple, avec le chemin lumineux suivant (un arbre en fait):

entrez la description de l'image ici

Nous pouvons simuler ce type d'interaction en utilisant la récursivité et la pondération de chaque trajet de lumière en fonction de la réflectance / transmittance réelle aux points d'incidence correspondants. Un problème concernant l'utilisation de la récursion dans ce cas est que le nombre de rayons augmente avec la profondeur de la récursivité, concentrant l'effort de calcul sur les rayons qui individuellement ne pourraient presque rien contribuer au résultat final. D'un autre côté, le résultat global de ces rayons individuels à des niveaux de récursivité profonde peut être significatif et ne doit pas être rejeté. Dans ce cas, nous pouvons utiliser la roulette russe (RR) afin d'éviter les branchements et les trajets finaux probabilistes sans perdre d'énergie, mais au prix d'une variance plus élevée (résultat plus bruyant). Dans ce cas, le résultat de la réflectance de Fresnel, ou TIR, sera utilisé pour sélectionner au hasard le chemin à suivre. Par exemple:

entrez la description de l'image ici

Comme on peut le voir, la réflectance TIR ou Fresnel peut empêcher certains rayons de rebondir indéfiniment entre les couches. Pour autant que je sache, Mitsuba implémente le plastique comme un matériau à deux couches, et il utilise une solution de forme fermée pour ce cas spécifique qui représente un nombre infini de rebonds de lumière entre les couches. Cependant, Mitsuba permet également la création de matériaux multicouches avec un nombre arbitraire de couches, auquel cas il impose un nombre maximal de rebonds internes car aucune solution de forme fermée ne semble exister pour le cas général. En tant qu'effet secondaire, une certaine énergie peut être perdue dans le processus de rendu, ce qui rend le matériau plus sombre qu'il ne devrait l'être.

Dans mon implémentation matérielle multicouche actuelle, je permets un nombre arbitraire de rebonds internes au prix de temps de rendu plus longs (enfin ... en fait, je n'ai implémenté que deux couches .. une diélectrique et une diffuse :).

Une option supplémentaire consiste à mélanger ramification et RR. Par exemple, les rayons initiaux (niveaux profonds inférieurs) pourraient présenter une contribution substantielle à l'image finale. Ainsi, on peut choisir de ne se ramifier qu'aux premières ou deux premières intersections, en utilisant uniquement RR par la suite. C'est, par exemple, l'approche utilisée par smallpt .

Un point intéressant concernant les matériaux multicouches est que les rayons réfléchis / transmis individuels peuvent être échantillonnés en fonction des BRDF / BTDF correspondants de chaque couche.

Évaluation du BSDF final

Considérant le chemin lumineux suivant calculé à l'aide de RR:

entrez la description de l'image ici

Nous pouvons évaluer la quantité totale d'éclat Lrreflétée par un BSDF multicouche considérant chaque couche comme un objet individuel et appliquant la même approche que celle utilisée pour le traçage de chemin ordinaire (c'est-à-dire que l'éclat sortant d'une couche sera l'éclat incident pour la couche suivante). L'estimateur final peut ainsi être représenté par le produit de chaque estimateur Monte Carlo individuel:

Lr=(Fr1cosθ1pF1(Fr2cosθ2pF2(Fr3cosθ3pF3(Fr2cosθ4pF2(LjeFr1cosθ5pF1)))))

Étant donné que tous les termes de l'estimateur sont multipliés, nous pouvons simplifier la mise en œuvre en calculant le BSDF final et pF et en tenant compte de la Lje terme:

Fr=Fr1Fr2Fr3Fr2Fr1

pF=pF1pF2pF3pF2pF1

cosθ=cosθ1cosθ2cosθ3cosθ2cosθ1

Lr=(FrcosθpF)Lje

Le document d'Andrea Weidlich et d'Alexander Wilkie prend également en compte l'absorption, c'est-à-dire que chaque rayon lumineux peut être atténué en fonction du facteur d'absorption de chaque couche transmissive et de son épaisseur. Je n'ai pas encore inclus l'absorption dans mon moteur de rendu, mais elle est représentée par une seule valeur scalaire, qui sera évaluée selon la loi de Beer .

Approches alternatives

Le rendu Mitsuba utilise une représentation alternative pour les matériaux multicouches basée sur la "tabulation des fonctions de réflectance sur une base de Fourier". Je ne l'ai pas encore exploré, mais cela pourrait m'intéresser: " Un cadre complet pour le rendu des matériaux en couches " par Wenzel Jacob et al . Il existe également une version étendue de ce document.

Christian Pagot
la source
1
Je veux demander (en espérant que vous vous souvenez du papier) si vous êtes sûr d'ajouter des termes cosinus pour chaque couche? Pour autant que je comprends, nous calculons l'équation de rendu uniquement sur la couche supérieure. Nous descendons pour déterminer la direction sortante finale et pour déterminer BRDF. Dois-je manquer quelque chose?
Mustafa Işık
@ MustafaIşık Vous avez raison, dans le document, ils n'ajoutent pas les termes cosinus au BRDF final. En fait, j'ai adopté une approche un peu différente de celle proposée dans le document (je l'inclurai dans ma réponse). Dans le document, ils proposent la définition d'un BRDF unique parmi les BRDF en couches. J'ai trouvé le processus de dérivation un peu déroutant: 1) Je ne comprends pas pourquoi ils ajoutent les BRDF individuels (je pense qu'ils devraient être multipliés);
Christian Pagot du
@ MustafaIşık 2) comme vous l'avez souligné, il n'y a pas de multiplication par le terme cosinus (je pense que vous devez le faire car nous ne considérons que l'énergie incidente sur une zone différentielle); 3) ils ne développent pas l'expressiont=(1-g)+T21g; 4) Je ne sais pas s'ils ont dilué le terme cosinus à l'intérieur du BRDF; 5) également, le TIR peut entraîner une perte d'énergie. Pour ces raisons, j'ai décidé de tracer chaque rayon en utilisant la roulette russe pour décider de la réfraction ou de la réflexion, au prix de temps de rendu plus longs que ceux éventuellement obtenus par eux.
Christian Pagot
1
Le document semble simple, mais ce n'est pas le cas, car chaque terme ni stratégie n'est pas expliqué suffisamment clairement pour une mise en œuvre exacte. Il est cependant influent. Le vôtre ressemble plus à une simulation évitée par le papier mais plus précise.
Mustafa Işık
3

En y réfléchissant d'un point de vue physique, il semble que cela fonctionnerait comme une version généralisée du calcul diffus / spéculaire.

Vous commenceriez par la couche la plus haute et utiliseriez Fresnel, etc. pour calculer un pourcentage de lumière qui réfléchit vs transmet. Vous utilisez ensuite un nombre aléatoire pour déterminer laquelle de ces actions faire pour votre échantillon.

Dans le cas de la réflexion, vous feriez le lobe spéculaire de votre couche supérieure, réfléchissez sur la surface et continuez.

Dans le cas de la transmission, vous passez à la 2e couche.

À cette couche, vous calculeriez une fois de plus le pourcentage de chances de réfléchir par rapport à transmettre.

Dans le cas de la réflexion, vous utiliseriez le lobe spéculaire de cette deuxième couche, effectuez la réflexion et passez à autre chose.

Dans le cas de la transmission, vous passez à la couche intérieure.

Pour cette couche la plus intérieure, vous détermineriez à nouveau si vous avez besoin de réfléchir ou de transmettre.

Pour la réflexion, vous utiliseriez le lobe spéculaire de cette couche intérieure.

Pour la transmission, vous feriez votre calcul diffus ou tout ce que votre surface intérieure souhaite faire pour la lumière transmise (diffusion sous la surface? Réfraction? Etc.).

Je ne sais pas si chaque couche doit faire sa propre réfraction et si techniquement vous devez déplacer le rayon un peu entre les couches pour obtenir des effets plus réalistes. Pour votre cas, cela peut ne pas faire de différence.

Mais fondamentalement, si vous aviez une sphère avec 3 couches, elle DEVRAIT se comporter comme si vous aviez 3 sphères différentes imbriquées les unes dans les autres, chacune ayant une seule couche qui gérait la transmission contre la réflexion.

Avoir un matériau en couches est juste une façon plus compacte de dire que c'est ce que vous voulez, par rapport à avoir les trois objets séparés.

Alan Wolfe
la source