Ich las "Ein praktisches Modell für den Lichttransport unter der Oberfläche" und "Eine schnelle hierarchische Rendering-Technik für durchscheinende Materialien". Wenn ich das richtig verstehe, berücksichtigt der erstere nicht den Fall, in dem ein Objekt hinterleuchtet und wir sehen können, dass das Licht durch ihn hindurchgeht.
Letzteres kann dies erreichen, aber es gibt eine Vorverarbeitungsstufe, die für meinen CUDA-Pfad-Tracer nicht geeignet ist, und ich möchte, dass sie so natürlich wie möglich ist. Haben Sie also ein Papier im Sinn, das nicht veraltet ist, oder würden Sie mir vorschlagen, die vollständige Strahlungsübertragungsgleichung zu lösen?
raytracing
pathtracing
global-illumination
subsurface-scattering
cuda
Mustafa Işık
quelle
quelle
Antworten:
Wie in den Kommentaren erwähnt, würde ich dringend empfehlen, mit der vollständigen volumetrischen Streuung zu beginnen. Dies ist zweifach:
In diesem Sinne finden Sie im Folgenden eine grundlegende Einführung in die Implementierung der vollständigen volumetrischen Streuung in einem Rückwärtspfad-Tracer.
Schauen wir uns zunächst den Code für einen Rückwärtspfad-Tracer an, der nur Reflexion und keine Transmission / Refraktion enthält:
Auf Englisch:
Weitere Informationen zur direkten Lichtabtastung finden Sie in dieser Antwort .
BSDFs
Um die Übertragung hinzuzufügen, müssen wir zuerst einige unserer BRDF-Materialien auf vollständige BSDFs mit einer BTDF-Funktion aktualisieren.
Zum Beispiel ist ein BSDF für ein ideales spiegelndes Dielektrikum (dh Glas):
Der interessante Teil des Codes ist
Sample()
. Hier entscheidet ein Strahl, ob er reflektiert oder gebrochen wird. Wie wir das machen, liegt wirklich bei uns, wie in dieser Antwort gezeigt . Eine naheliegende Wahl wäre jedoch eine Stichprobe auf der Grundlage der Fresnel-Gleichungen .Im Fall eines idealen Spiegeldielektrikums gibt es nur zwei mögliche Ausgangsrichtungen: perfekte Brechung oder perfekte Reflexion. Also bewerten wir den Fresnel und wählen zufällig die Brechung / Reflexion mit einem Anteil, der dem Fresnel entspricht.
Medien
Als nächstes müssen wir über Medien sprechen und wie sie sich auf das herumprallende Licht auswirken. Wie von Nathan Reed in dieser Antwort erklärt :
Zusammenfassend:
Ich entschied mich dafür, dies mit einem Streukoeffizienten zu implementieren und Beer-Lambert den Absorptionskoeffizienten zu überlassen.
Ein nicht streuendes Medium ist ein Medium, durch das sich ein Photon gerade bewegt, das jedoch nach Beer-Lambert auf dem Weg abgeschwächt wird:
Ein isotropes Streumedium ermöglicht es dem Strahl, Streuereignisse (Reflexionsereignisse) zu haben, während der Strahl durch ihn wandert. Der Strahl kann in jeder Richtung in der Kugel um den Wechselwirkungspunkt reflektiert werden (daher isotrop).
Der Abstand zwischen Reflexionen ist zufällig, basierend auf einer exponentiellen "Streu" -Wahrscheinlichkeit.
Bei hohen Streuabständen verhält sich das Material fast wie ein NonScatteringMedium, da es eine sehr geringe Streuwahrscheinlichkeit aufweist, bevor es sich durch das Medium bewegt.
Bei geringen Streuabständen verhält sich das Material wie Wachs oder Jade.
Wenn der Streuabstand immer kleiner wird, haben wir eine immer höhere Wahrscheinlichkeit, auf dem Weg durch das Medium zu streuen. Dies wirft einige Probleme auf:
Daher müssen Sie maxBounces auf eine hohe Zahl einstellen und sich im allgemeinen Fall auf russisches Roulette verlassen, um Strahlen zu beenden. Darüber hinaus ist IsotropicScatteringMedium für die Darstellung meist undurchsichtiger Materialien äußerst ineffizient. Um eine bessere Leistung zu erzielen, sollten wir eine nicht-isotrope Phasenfunktion wie Henyey-Greenstein oder Schlick verwenden . Diese spannen die Streuung in eine bestimmte Richtung vor. So könnten wir sie auf eine hohe Rückstreuung einstellen, wodurch das Problem der "verlorenen" Strahlen verringert wird.
Alles zusammenfügen
Wie modifizieren wir mit diesen neuen Informationen den Integrator, um BSDFs und Medien zu verstehen?
Zuerst müssen wir verfolgen, in welchem Medium wir uns gerade befinden und welchen Brechungsindex (IOR).
Dann teilen wir den Integrator in zwei Teile: Übertragung und Materialinteraktion.
Auf Englisch:
quelle
In Fällen, in denen die Diffusionsnäherung der vollständigen volumetrischen Pfadverfolgung vorgezogen wird, ist die von Solid Angle veröffentlichte Methode ziemlich effizient: https://www.solidangle.com/research/s2013_bssrdf_slides.pdf
Es ist in der Arnold-Render-Engine, Blender's Cycles und pbrt implementiert, wobei letzteres Open Source ist.
Die Datei, die es in PBRT implementiert, befindet sich hier: https://github.com/mmp/pbrt-v3/blob/7095acfd8331cdefb03fe0bcae32c2fc9bd95980/src/core/bssrdf.cpp
quelle