Diese Frage hat etwas mit dieser zu tun .
Wie Alan bereits gesagt hat, führt das Verfolgen des tatsächlichen Lichtwegs durch jede Schicht zu physikalisch genaueren Ergebnissen. Ich werde meine Antwort auf ein Papier von Andrea Weidlich und Alexander Wilkie ( "Arbitriary Layered Micro-Facet Surfaces" ) stützen , das ich gelesen und teilweise implementiert habe. In der Arbeit gehen die Autoren davon aus, dass der Abstand zwischen zwei Schichten kleiner ist als der Radius eines Differentialflächenelements. Diese Annahme vereinfacht die Implementierung, da wir Schnittpunkte nicht für jede Ebene separat berechnen müssen, sondern davon ausgehen, dass alle Schnittpunkte über den Ebenen genau der gleiche Punkt sind.
Dem Papier zufolge müssen zwei Probleme gelöst werden, um mehrschichtiges Material zu rendern. Die erste besteht darin, die Schichten richtig abzutasten, und die zweite darin, die resultierende BSDF zu finden, die durch die Kombination der mehreren BSDFs erzeugt wird, die entlang des Abtastpfads gefunden werden.
UPDATE: Eigentlich habe ich eine andere Methode gewählt, um die Bewertung dieses Schichtmodells zu implementieren. Während ich mich an die Idee gehalten habe, die Schnittpunkte als genau den gleichen Punkt entlang der Schichten zu betrachten, habe ich die Abtastung und die endgültige BRDF unterschiedlich berechnet: Für die Abtastung habe ich gewöhnliches Raytracing verwendet, jedoch durch die Schichten (mit Russisch) Roulette zur Auswahl zwischen Reflexion / Brechung, wenn dies der Fall ist); Für die endgültige BRDF-Bewertung multipliziere ich einfach jedes BRDF, das vom Strahlengang durchlaufen wird (Gewichtung der einfallenden Strahlungsdichten gemäß dem Kosinus des einfallenden Strahls).
Probenahme
In dieser ersten Stufe werden wir den tatsächlichen Lichtweg durch die Schichten bestimmen. Wenn sich ein Lichtstrahl von einem weniger dichten Medium, z. B. Luft, zu einem dichteren Medium, z. B. Glas, bewegt, wird ein Teil seiner Energie reflektiert und der verbleibende Teil übertragen. Sie können die Energiemenge finden, die durch die Fresnel-Reflexionsgleichungen reflektiert wird . Wenn beispielsweise das Fresnel-Reflexionsvermögen eines bestimmten Dielektrikums 0,3 beträgt, wissen wir, dass 30% der Energie reflektiert werden und 70% übertragen werden:
Wenn sich der Lichtstrahl von einem dichteren zu einem weniger dichten Medium bewegt, gilt das gleiche Prinzip, das durch das Fresnel-Reflexionsvermögen beschrieben wird. In diesem speziellen Fall kann jedoch auch eine Totalreflexion (auch bekannt als TIR) auftreten, wenn der Winkel des einfallenden Strahls über dem kritischen Winkel liegt. Bei TIR werden 100% der Energie zurück in das Material reflektiert:
Wenn Licht auf einen Leiter oder eine diffuse Oberfläche trifft, wird es immer reflektiert (dies ist die Richtung der Reflexion, die sich auf den Typ des BRDF bezieht). In einem mehrschichtigen Material ist der resultierende Lichtweg das Gesamtergebnis all dieser Möglichkeiten. Unter der Annahme, dass die erste und die zweite Schicht dielektrisch sind und die dritte Schicht diffus ist, könnten wir im Fall eines dreischichtigen Materials beispielsweise den folgenden Lichtweg (tatsächlich einen Baum) erhalten:
Wir können diese Art der Interaktion simulieren, indem wir jeden Lichtweg durch Rekursion und Gewichtung entsprechend dem tatsächlichen Reflexionsvermögen / Transmissionsgrad an den entsprechenden Einfallspunkten gewichten. Ein Problem hinsichtlich der Verwendung der Rekursion in diesem Fall besteht darin, dass die Anzahl der Strahlen mit der Tiefe der Rekursion zunimmt, wodurch sich der Rechenaufwand auf Strahlen konzentriert, die einzeln fast nichts zum Endergebnis beitragen können. Andererseits kann das Gesamtergebnis dieser einzelnen Strahlen bei tiefen Rekursionsniveaus signifikant sein und sollte nicht verworfen werden. In diesem Fall können wir russisches Roulette (RR) verwenden, um Verzweigungen und probabilistische Endlichtwege zu vermeiden, ohne Energie zu verlieren, jedoch auf Kosten einer höheren Varianz (lauteres Ergebnis). In diesem Fall ist das Ergebnis des Fresnel-Reflexionsvermögens oder des TIR, wird verwendet, um zufällig auszuwählen, welchem Pfad gefolgt werden soll. Zum Beispiel:
Wie zu sehen ist, kann das TIR- oder Fresnel-Reflexionsvermögen dazu führen, dass einige Strahlen unbegrenzt zwischen den Schichten zurückprallen. Soweit ich weiß, implementiert Mitsuba Kunststoff als zweischichtiges Material und verwendet für diesen speziellen Fall eine geschlossene Lösung, die eine unendliche Anzahl von Lichtreflexen zwischen den Schichten berücksichtigt. Mitsuba ermöglicht jedoch auch die Erzeugung von mehrschichtigen Materialien mit einer beliebigen Anzahl von Schichten. In diesem Fall wird eine maximale Anzahl von internen Bounces auferlegt, da für den allgemeinen Fall keine Lösung in geschlossener Form zu existieren scheint. Als Nebeneffekt kann beim Rendern etwas Energie verloren gehen, wodurch das Material dunkler aussieht, als es eventuell sein sollte.
In meiner aktuellen Implementierung von mehrschichtigem Material erlaube ich eine beliebige Anzahl von internen Bounces auf Kosten längerer Renderzeiten (naja ... eigentlich habe ich nur zwei Schichten implementiert ... eine dielektrische und eine diffuse :).
Eine zusätzliche Option ist das Mischen von Verzweigung und RR. Zum Beispiel könnten die anfänglichen Strahlen (niedrigere Tiefen) einen wesentlichen Beitrag zum endgültigen Bild leisten. Daher kann man sich dafür entscheiden, nur an den ersten ein oder zwei Kreuzungen zu verzweigen und danach nur RR zu verwenden. Dies ist zum Beispiel der Ansatz von smallpt .
Ein interessanter Punkt in Bezug auf mehrschichtige Materialien ist, dass einzelne reflektierte / durchgelassene Strahlen gemäß den entsprechenden BRDFs / BTDFs jeder Schicht wichtig abgetastet werden können.
Bewertung des endgültigen BSDF
Betrachtet man den folgenden mit RR berechneten Lichtweg:
L.r
L.r= ( fr1cosθ1p df1( fr2cosθ2p df2( fr3cosθ3p df3( fr2cosθ4p df2( L.ichfr1cosθ5p df1) ) )))
p dfL.ich
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=(frcosθpdf)Li
Das Papier von Andrea Weidlich und Alexander Wilkie berücksichtigt auch die Absorption, dh jeder Lichtstrahl kann entsprechend dem Absorptionsfaktor jeder durchlässigen Schicht und ihrer Dicke abgeschwächt werden. Ich habe die Absorption noch nicht in meinen Renderer aufgenommen, aber sie wird durch nur einen Skalarwert dargestellt, der gemäß dem Biergesetz ausgewertet wird .
Alternative Ansätze
Der Mitsuba-Renderer verwendet eine alternative Darstellung für mehrschichtiges Material basierend auf der "Tabellierung der Reflexionsfunktionen auf Fourier-Basis". Ich habe mich noch nicht damit befasst, könnte aber von Interesse sein: " Ein umfassender Rahmen für das Rendern von Schichtmaterialien " von Wenzel Jacob et al . Es gibt auch eine erweiterte Version dieses Papiers.