Beim Raytracing möchte ich die Schattierung für einen Punkt berechnen, auf den mein Strahl trifft. Ich "zeichne" Linien zu allen Lichtquellen und überprüfe, ob sie von Objekten blockiert sind oder nicht. Wenn sie nicht blockiert sind, berechne ich die Intensität der Beleuchtung entsprechend ihrer Intensität und dem Grad zwischen dem "Trefferstrahl" und der Oberflächennormalen.
Aber was, wenn das Licht durch eine teilweise transparente Oberfläche blockiert wird? Dann sollte das Licht den Punkt beleuchten, aber seine Intensität und Farbe werden von der Farbe der Oberfläche beeinflusst, durch die es hindurchgeht, und um zu berechnen, dass ich Raytracing für den Punkt des Durchlasses des Lichtstrahls (tatsächlich für die 2 Punkte, einer der Eingang und einer der Ausgang), und dies wird sehr teuer sein, und möglicherweise fast nie endend (ich denke, dass in der richtigen Positionierung von Lichtquellen und Oberflächen könnten Sie den Tracer in eine fast unendliche setzen Schleife für jeden Treffer).
Gibt es eine schnelle und gute Möglichkeit, die Farbe zu approximieren, oder sollte ich nur die Farbe der Oberfläche als Lichtfarbe und ihre Transparenz als Intensität nehmen?
Sie müssen Raytracing nicht an den Ein- und Ausstiegspunkten ausführen. Denken Sie darüber nach, welche Art von Licht diese Punkte trifft. Ein Lichtstrahl, der die lichtdurchlässige Oberfläche in einem anderen Winkel trifft als dem, der das Zielobjekt trifft, beeinflusst nicht die Farbe des Lichts, das das Zielobjekt trifft.
%Vor%Dies setzt natürlich voraus, dass es im Material keine Refraktion gibt.
Wenn Sie nun Ihren Raytracer auf etwas Fortgeschritteneres wie die Pfadverfolgung erweitern möchten, müssen Sie das Licht betrachten, das vom durchscheinenden Objekt abprallt und Ihr finales Objekt trifft, aber für einen Raytracer, den Sie tun Mach dir keine Sorgen.
Für das transluzente Objekt würde ich die Abnahme der Lichtintensität als eine lineare Funktion der Entfernung modellieren (die meisten realen Objekte halten sich eng an diese Annahme). Wenn Sie Licht mit RGB-Komponenten modellieren (nicht physikalisch realistisch ...), würden Sie jede Komponente im Verhältnis zum Wert dieser Komponente innerhalb des Objekts verkleinern.
Wenn Sie mit dem, was das Licht im Objekt macht, wirklich weiterkommen wollen, müssen Sie sich an Subsurface Scattering
BEARBEITEN: Das Phänomen, von dem Sie sprechen, dass Licht unendlich hin und her springt und viele Berechnungen durchführt, ist, wie sich echtes Licht verhält. Fortgeschrittene Renderer können heutzutage nicht alle diese Lichtkomponenten integrieren und stattdessen zufällige Lichtverteilungen abtasten. Je mehr Stichproben genommen werden, desto näher konvergiert das Bild zum realistisch aussehenden Bild und umso näher kommt die Lichtintegration ihrem wahren Wert. Dies nennt man Monte Carlo Rendering. Pfadverfolgung, bidirektionale Pfadverfolgung und Großstadtlichttransport sind allesamt Monte-Carlo-Algorithmen, die versuchen, den Lichttransport vollständig zu simulieren. Jeder Algorithmus, der genügend Zeit hat, konvergiert zum selben endgültigen Bild, einige sind jedoch effizienter als andere. (Siehe Pfadverfolgung auf Wikipedia. Am Ende des Artikels ist ein Bild besser als das, das ich zu zeichnen versuchte).
Wenn Sie Oberflächen mit normaler Schattierung und Transparenz wünschen, ignorieren Sie am besten die regelmäßige Schattierung für Schattenstrahlen: Verwenden Sie für Beleuchtungszwecke nur die Filterattribute transparenter Oberflächen. Dies vermeidet die möglicherweise unendliche Berechnung der Beleuchtung, die Sie beschrieben haben.
Beachten Sie, dass es eine gute Möglichkeit gibt, unendliche Strahlenbäume zu approximieren, was unter dem bunten Namen "Russisches Roulette" geschieht: Wenn irgendein Zweig des Baums zu unwichtig wird, treffen Sie eine zufällige Auswahl, ob Sie ihn beschneiden wollen. Verzweigungen werden mit der Wahrscheinlichkeit P
beschnitten und tragen Null zum Ergebnis bei (sie sind "tot" und müssen nicht berechnet werden). Überlebende Zweige ("Gewinner") erhalten ihren Beitrag multipliziert mit 1/(1-P)
, so dass die resultierende Approximation im Durchschnitt korrekt ist.
Russisches Roulette ist eine Monte-Carlo-Technik; Vielleicht möchten Sie in Monte-Carlo-Ray-Tracing und andere globale Beleuchtung Methoden.
Tags und Links graphics shader raytracing