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:
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:
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):
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:
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:
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θ1p dF1(Fr2cosθ2p dF2(Fr3cosθ3p dF3(Fr2cosθ4p dF2(LjeFr1cosθ5p dF1) ) )))
É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 p dF et en tenant compte de la Lje terme:
Fr = fr1⋅ fr2⋅ fr3⋅fr2⋅fr1
p dF= p dF1⋅ p dF2⋅ p dF3⋅ p dF2⋅ p dF1
cosθ = cosθ1⋅ cosθ2⋅ cosθ3⋅ cosθ2⋅ cosθ1
Lr= (Fr cosθp dF)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.
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.
la source