Ich versuche, Brechung und Transmission in meinem Path Tracer zu implementieren, und bin mir ein bisschen unsicher, wie ich das implementieren soll. Zunächst einige Hintergrundinformationen:
Wenn Licht auf eine Oberfläche trifft, wird ein Teil davon reflektiert und ein Teil gebrochen:
Wie viel Licht reflektiert oder gebrochen wird, wird durch die Fresnel-Gleichungen angegeben
In einem rekursiven Raytracer besteht die einfache Implementierung darin, einen Strahl zur Reflexion und einen Strahl zur Brechung aufzunehmen und dann eine gewichtete Summe mit dem Fresnel zu erstellen.
Bei der Pfadverfolgung wird jedoch nur ein Pfad ausgewählt. Das ist meine Frage:
- Wie wähle ich, ob ich unbeeinflusst reflektieren oder brechen möchte?
Meine erste Vermutung wäre, zufällig basierend auf dem Fresnel zu wählen. Aka:
float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
// Reflect
} else {
// Refract
}
Wäre das richtig? Oder muss ich einen Korrekturfaktor haben? Da gehe ich nicht beide Wege.
quelle
Antworten:
TL; DR
Ja, Sie können es so machen, Sie müssen nur das Ergebnis durch die Wahrscheinlichkeit der Richtungswahl dividieren.
Volle Antwort
Das Thema der Probenahme in Path Tracern, die sowohl Reflexions- als auch Refraktionsmaterialien zulassen, ist etwas komplexer.
Beginnen wir zunächst mit Hintergrundinformationen. Wenn Sie BSDFs - nicht nur BRDFs - in Ihrem Path Tracer zulassen, müssen Sie statt nur der positiven Hemisphäre die gesamte Sphäre integrieren. Monte-Carlo-Samples können mit verschiedenen Strategien erzeugt werden: Für die direkte Beleuchtung können Sie BSDF und die Lichtabtastung verwenden, für die indirekte Beleuchtung ist die BSDF-Abtastung normalerweise die einzig sinnvolle Strategie. Die Abtaststrategien selbst enthalten normalerweise die Entscheidung darüber, welche Hemisphäre abzutasten ist (z. B. ob Reflexion oder Brechung berechnet wird).
In der einfachsten Version kümmert sich die Lichtabtastung normalerweise nicht viel um Reflexion oder Brechung. Es werden die Lichtquellen oder die Umgebungskarte (falls vorhanden) in Bezug auf die Lichteigenschaften abgetastet. Sie können die Stichprobenerfassung von Umgebungskarten verbessern, indem Sie nur die Halbkugel auswählen, in der das Material einen Beitrag ungleich Null aufweist. Der Rest der Materialeigenschaften wird jedoch normalerweise ignoriert. Beachten Sie, dass für und idealerweise glattes Fresnel-Material die Lichtabtastung nicht funktioniert.
Für die BSDF-Stichprobe ist die Situation viel interessanter. Der von Ihnen beschriebene Fall handelt von einer idealen Fresnel-Oberfläche, bei der es nur zwei beitragende Richtungen gibt (da Fresnel BSDF in Wirklichkeit nur eine Summe von zwei Delta-Funktionen ist). Sie können das Integral leicht in zwei Teile aufteilen - eine Reflexion und eine für die Brechung. Da wir, wie Sie bereits erwähnt haben, in einem Pfadfinder nicht in beide Richtungen fahren möchten, müssen wir eine auswählen. Dies bedeutet, dass wir die Summe der Zahlen schätzen möchten, indem wir nur eine davon auswählen. Dies kann durch diskrete Monte-Carlo-Schätzung erfolgen: Wählen Sie einen der Summanden nach dem Zufallsprinzip aus und dividieren Sie ihn durch die Wahrscheinlichkeit, mit der er ausgewählt wird. Im Idealfall möchten Sie, dass die Abtastwahrscheinlichkeit proportional zu den Addenden ist, aber da wir ihre Werte nicht kennen (wir müssten die Summe nicht schätzen, wenn wir sie kennen). Wir schätzen sie nur, indem wir einige der Faktoren vernachlässigen. In diesem Fall ignorieren wir die einfallende Lichtmenge und verwenden nur das Fresnel-Reflexionsvermögen / die Fresnel-Transmission als unsere Schätzungen.
Die BSDF-Abtastroutine für den Fall einer glatten Fresnel-Oberfläche besteht daher darin, eine der Richtungen zufällig mit einer Wahrscheinlichkeit proportional zum Fresnel-Reflexionsvermögen auszuwählen und das Ergebnis für diese Richtung an einem bestimmten Punkt durch die Wahrscheinlichkeit der Auswahl der Richtung zu teilen. Der Schätzer sieht folgendermaßen aus:
Bei anspruchsvolleren BSDF-Modellen wie denen, die auf der Mikrofacett-Theorie basieren, ist die Abtastung etwas komplexer, aber die Idee, das gesamte Integral in eine endliche Summe von Teilintegralen aufzuteilen und anschließend diskretes Monte Carlo zu verwenden, kann in der Regel ebenfalls angewendet werden.
quelle