Wie werden volumetrische Effekte wie Rauch, Nebel oder Wolken von einem Raytracer wiedergegeben? Im Gegensatz zu festen Objekten haben diese keine genau definierte Oberfläche, mit der ein Schnittpunkt berechnet werden kann.
Wie werden volumetrische Effekte wie Rauch, Nebel oder Wolken von einem Raytracer wiedergegeben? Im Gegensatz zu festen Objekten haben diese keine genau definierte Oberfläche, mit der ein Schnittpunkt berechnet werden kann.
Antworten:
Das Auftreten von Volumina (auch als teilnehmende Medien bezeichnet) in der Natur wird durch winzige Partikel wie Staub, Wassertropfen oder Plankton verursacht, die in der umgebenden Flüssigkeit wie Luft oder Wasser suspendiert sind. Diese Partikel sind feste Objekte, und Licht wird von diesen Objekten wie auf einer normalen Oberfläche gebrochen oder reflektiert. Theoretisch könnten teilnehmende Medien daher von einem herkömmlichen Raytracer mit nur Oberflächenschnittpunkten gehandhabt werden.
Natürlich macht es die bloße Anzahl dieser Partikel unmöglich, sie tatsächlich einzeln zu strahlen. Stattdessen werden sie mit einem statistischen Modell angenähert: Da die Partikel sehr klein sind und der Abstand zwischen den Partikeln viel größer als die Partikelgröße ist, können einzelne Wechselwirkungen von Licht mit den Partikeln als statistisch unabhängig modelliert werden. Daher ist es eine vernünftige Annäherung, die einzelnen Partikel durch kontinuierliche Größen zu ersetzen, die die "durchschnittliche" Licht-Partikel-Wechselwirkung in diesem bestimmten Bereich im Raum beschreiben.
Für den physikalisch basierten volumetrischen Lichttransport ersetzen wir die unvorstellbar vielen Partikel durch ein kontinuierlich teilnehmendes Medium, das zwei Eigenschaften aufweist: den Absorptionskoeffizienten und den Streukoeffizienten. Diese Koeffizienten sind sehr praktisch für die Strahlverfolgung, da sie es uns ermöglichen, die Wahrscheinlichkeit einer Wechselwirkung eines Strahls mit dem Medium - dh die Wahrscheinlichkeit, auf eines der Teilchen zu treffen - als Funktion der Entfernung zu berechnen.
Der Absorptionskoeffizient wird mit . Angenommen, ein Lichtstrahl möchte t Meter innerhalb des teilnehmenden Mediums wandern . Die Wahrscheinlichkeit, dass es nicht absorbiert wird - dh eines der Partikel nicht trifft und von ihm absorbiert wird - ist e - t ⋅ σ a `. Wenn t zunimmt, können wir sehen, dass diese Wahrscheinlichkeit auf Null geht, dh je länger wir uns durch das Medium bewegen, desto wahrscheinlicher ist es, dass es auf etwas trifft und absorbiert wird. Sehr ähnliche Dinge gelten für den Streukoeffizienten σ s : Die Wahrscheinlichkeit, dass der Strahl nicht auf ein Teilchen trifft und gestreut wird, beträgt e - t ⋅ σ s;; Das heißt, je länger wir uns durch ein Medium bewegen, desto wahrscheinlicher ist es, dass wir auf ein Teilchen treffen und in eine andere Richtung gestreut werden.
Normalerweise werden diese beiden Größen zu einem einzigen Extinktionskoeffizienten gefaltet, . Die Wahrscheinlichkeit, t Meter durch ein Medium zu wandern, ohne mit ihm zu interagieren (weder absorbiert noch gestreut), ist dann e - t ⋅ σ t . Andererseits beträgt die Wahrscheinlichkeit einer Wechselwirkung mit einem Medium nach t Metern 1 - e - t ⋅ σ t .
Wie der Strahl gestreut wird, wird durch die Phasenfunktion beschrieben und hängt von der Art der Teilchen ab; Die Rayleigh-Phasenfunktion beschreibt die Streuung von kugelförmigen Partikeln, die kleiner als die Wellenlänge des Lichts sind (z. B. unsere Atmosphäre). Die Mie-Phasenfunktion beschreibt die Streuung von kugelförmigen Partikeln mit einer ähnlichen Größe wie die Wellenlänge (z. B. Wassertropfen). In Grafiken wird normalerweise die Henyey-Greenstein- Phasenfunktion verwendet, die ursprünglich auf die Streuung von interstellarem Staub angewendet wurde.
schaffte es der Strahl unversehrt durch und interagierte wie üblich mit der Oberfläche.
Dieser Beitrag war nur eine kleine Einführung in das Rendern mit teilnehmenden Medien. Unter anderem habe ich räumlich variierende Koeffizienten (die Sie für Wolken, Rauch usw. benötigen) völlig ignoriert. Steve Marschners Notizen sind eine gute Ressource, wenn Sie interessiert sind. Im Allgemeinen ist es sehr schwierig, teilnehmende Medien effizient zu rendern, und Sie können viel anspruchsvoller vorgehen als hier beschrieben. Es gibt volumetrische Photonenkartierung , Photonenstrahlen , Diffusionsnäherungen , Joint Importance Sampling und vieles mehr. Es gibt auch interessante Arbeiten zu granularen Medien das beschreibt, was zu tun ist, wenn das statistische Modell zusammenbricht, dh Partikelwechselwirkungen sind nicht mehr statistisch unabhängig.
Eine Möglichkeit, dies zu tun - was nicht gerade die "Gehe zu" -Lösung ist, aber gut funktionieren kann - besteht darin, die Entfernung zu ermitteln, die der Strahl durch das Volumen zurückgelegt hat, und mithilfe der Integration einer Dichtefunktion zu berechnen, wie viel "Zeug" war schlagen.
Hier ist ein Link mit einer Beispielimplementierung: http://blog.demofox.org/2014/06/22/analytic-fog-density/
Hängt vom Volumeneffekt ab.
Gleichmäßige Volumeneffekte, die nicht zur Streuung gehören, können simuliert werden, indem nur die Ein- und Austrittsabstände der Strahlen berechnet werden.
Andernfalls müssen Sie den Strahlengang integrieren, der auch als Strahlenmarsch bezeichnet wird. Um zu vermeiden, dass Sekundärstrahlen aufgenommen werden müssen, wird das Raymarchen häufig mit einer Art Cache gekoppelt, z. B. Tiefenkarte, Deepmaps, Ziegelkarten oder Voxelwolken für Lichtschatten usw. Auf diese Weise müssen Sie nicht unbedingt die gesamte Szene marschieren. Ein ähnliches Caching wird häufig für die prozedurale Volumenstruktur durchgeführt.
Es ist auch möglich, die Textur in Oberflächenprimitive wie Kästchen, Kugeln oder Ebenen umzuwandeln, die eine geeignete Textur mit weichen Kanten aufweisen. Sie können dann normale Rendering-Techniken verwenden, um den volumetrischen Effekt zu lösen. Das Problem dabei ist, dass Sie normalerweise viele Grundelemente benötigen. Zusätzlich kann sich die Form des Grundelements als zu gleichmäßige Abtastung zeigen.