Auswahl von Reflexion oder Brechung bei der Pfadverfolgung

14

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: Bildbeschreibung hier eingeben

Wie viel Licht reflektiert oder gebrochen wird, wird durch die Fresnel-Gleichungen angegeben Bildbeschreibung hier eingeben

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.

R=Fresnel()T=1-RLÖ=RLIch, Reflexion+TLIch, Brechung

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.

RichieSams
quelle
russisches roulette
v.oddou

Antworten:

6

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:

Lich(ωich)F(θich)P(ωich)=Lich(ωich)F(θich)F(θich)=Lich(ωich)

ωich=(ϕich,θich)Lich(ωich)F(θich)P(ωich)F(θich)

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.

ivokabel
quelle
1
Das ist interessant, aber ich bin durch einen Punkt verwirrt. Können Sie klarstellen, was es bedeutet, "das Ergebnis für diese Richtung durch die Wahrscheinlichkeit der Richtungsauswahl zu teilen"? Wenn es sich nicht um eine binäre Wahl handelt, sondern um eine Richtung, die aus einer kontinuierlichen Verteilung ausgewählt wurde, ist die Wahrscheinlichkeit dann nicht Null?
Trichoplax
1
@trichoplax: Ja, aber in diesem Abschnitt habe ich die Abtasttechnik nur für eine (dielektrische) Fresnel-BSDF beschrieben - idealerweise glatte Oberfläche, die eine Summe von zwei Dirac-Delta-Funktionen ist. In diesem Fall wählen Sie mit einer gewissen Wahrscheinlichkeit eine der Richtungen aus. Im Falle eines nicht-Delta (endlichen) BSDF generieren Sie Richtungen gemäß einer Wahrscheinlichkeitsdichtefunktion. Leider müssen Delta-Fälle und Nicht-Delta-Fälle getrennt behandelt werden, was den Code etwas unübersichtlich macht. Weitere Einzelheiten zur Probenahme von Microfacet-BSDFs finden sich beispielsweise in der Veröffentlichung von Walter et al. al. [2007] paper.
IvoKabel
2
@RichieSams: Walter et. al. [2007] ist im Grunde immer noch der Stand der Technik für dielektrisch raue Oberflächen, aber um gut zu funktionieren, ist eine gute Stichprobe erforderlich, die erst kürzlich von Heitz und D'Eon in der Veröffentlichung "Wichtigkeitsprobe von mikrofacetbasierten BSDFs" von 2014 veröffentlicht wurde unter Verwendung der Verteilung der sichtbaren Normalen ". Beachten Sie auch, dass es sich um ein Einzelstreumodell handelt, bei dem Interreflexionen zwischen Mikrofacetten vernachlässigt werden, wodurch es für höhere Rauheitswerte sichtbar dunkel wird. Weitere Informationen finden Sie in meiner Frage "Kompensation des Energieverlusts in einfach streuenden Microfacet-BSDF-Modellen".
IvoKabel
5
Ich wollte nur darauf hinweisen, dass Sie, wenn Sie als Fragestellung Wahrscheinlichkeit = fresnel () wählen, beim Dividieren durch die Wahrscheinlichkeit den Fresnel-Faktor aufheben, der normalerweise multipliziert wird. Also (im diskreten Fall mit zwei Diracs) ) Am Ende enthält der Strahlenbeitrag überhaupt keinen Fresnel-Faktor. Es ist die Standardtheorie der Stichprobenerhebung von Wichtigkeit, aber ich dachte, ich würde darauf als potenziell verwirrendes Problem hinweisen.
Nathan Reed
2
@ Nathan, ich habe Ihren Hinweis in die Antwort aufgenommen.
ivokabel