Ich versuche derzeit, einen Monte-Carlo-Pfad-Tracer zu implementieren. Ich habe einige Nachforschungen angestellt und es scheint, dass ein gängiger Ansatz für Materialien darin besteht, ein Schichtenmodell zu verwenden. Etwas wie das:
Wenn Licht auf die Oberfläche trifft, gibt Fresnel an, wie viel von diesem Licht von der ersten Schicht reflektiert wird und wie viel zur zweiten und so weiter fließt.
Also habe ich etwas ähnliches gemacht, aber einfacher: nur eine Schicht Spiegel und eine Schicht diffus. Noch keine Übertragung. Soweit so gut, verwende ich für mein diffuses Modell eine einfache cosinusgewichtete brdf und für mein Spiegelbild das mikrofacettierte Cook-Torrance-Modell.
Nun kommt der schwierige Teil: Was soll ich tun, wenn ein Strahl auf die Oberfläche trifft? Normalerweise würde ich das dem Oberflächenmaterial entsprechende brdf auswählen, eine einfallende Lichtrichtung abtasten, das brdf auswerten und durch die richtige Wahrscheinlichkeitsverteilungsfunktion dividieren.
Aber hier entspricht ein Oberflächenschlag effektiv mehreren Materialien. Die naive Möglichkeit, dies zu handhaben, besteht darin, für jeden Layer-Treffer ein Sample zu erstellen. Aber dies ist eindeutig die Quelle eines riesigen Leistungseinbruchs, der dazu führt, dass mein Weg effektiv zu einem Baum wird.
Gibt es eine bessere Lösung?
quelle
Antworten:
Wenzel Jakob et al. Stellten auf der SIGGRAPH 2014 ein Framework für Schichtmaterialien vor . Abschnitt 6.2 erläutert die Stichprobenerhebung. Wenn Sie Code gegenüber Gleichungen bevorzugen, wird die Methode im Mitsuba-Renderer implementiert .
quelle