Die Wirkung der „Global Illumination“ ist für realistische Bilder notwendig. In diesem Beitrag stellen wir ihnen eine Methode zur Erzeugung von Photonen Maps vor, die später zur Texturierung von Oberflächen verwendet werden kann. Diese Textur Maps werden erzeugt, indem das von Lichtquellen emittierte Licht verfolgt und aufgezeichnet wird, wo das Licht absorbiert wird. Dies ermöglicht es den Texturen, alle Beleuchtungseigenschaften von Schatten und „Global Illumination“ in ihnen zu kodieren.
Background.
„Global Illumination“ wird erreicht, indem der Strahlengang der Lichtquelle und der Weg des Lichts erzeugt wird. Wenn Licht auf einer Oberfläche trifft, wird die Energie des Lichts absorbiert. Wenn die Oberfläche in kleinere Bereiche unterteilt wird, können wir verfolgen, wie viel Licht auf jede Region trifft. Diese Bereiche entsprechen den Texten der Photonen-Map.
Als Postprozessoperation normalisieren wir die Lichtmenge in jedem Texel durch den Bereich. Wir normieren uns auch nach dem maximalen Lichtwert der Szene, um dem hellsten Texel den Wert 1 oder die hellste Farbdarstellung zu geben. Die Texte werden anschließend in Bilddateien geschrieben, die als Textur-Maps in einem Rendering-System verwendet werden.
Implementierung.
Die Implementierung kann in drei Hauptteilen betrachtet werden:
Verfolgung des von der Lichtquelle abgestrahlten Lichts.
Aus der Lichtquelle können Sie einen Lichtstrahl erzeugen, der sowohl Richtung als auch Farbe hat. Sie können die Farbe als RGB-Gerät verfolgen oder jede Farbe einzeln verfolgen. Mit dem Strahl aus dem Licht berechnen Sie den Schnittpunkt in ihrer Szene. Einmal berechnet, tragen Sie Licht zum entsprechenden Text der Oberfläche bei. Da die Objekte in der Szene Licht absorbieren, müssen wir feststellen, wann das Licht nicht mehr beitragen soll. Wir berechnen die Wahrscheinlichkeit, den Strahl zu beenden, indem wir die Komponenten der Lichtfarbe verwenden, Wahrscheinlichkeit = (rot + grün + blau)/3. Wir nehmen anschließend eine Zufallszahl r von [0..1] und wenn die Wahrscheinlichkeit kleiner als r ist, beenden wir den Strahl. Man könnte die Wahrscheinlichkeit auch mit der Wahrscheinlichkeit = max (rot, grün, blau) berechnen.
Wenn der Strahl nicht beendet wird, fährt der Strahl fort und es müssen zwei Dinge berechnet werden, die neue Richtung und Farbe. Die Richtung wird unter Verwendung der Normals der Oberfläche und einer zufälligen Richtung in der Hemisphäre berechnet, die durch diese Normals gebildet werden. Die Farbe wird aus dem Produkt der Oberflächenfarbe mit dem Licht berechnet, das durch das Punktprodukt des einfallenden Strahls mit dem sich überschneidenden Polygon skaliert wird (New_Color = RGB(light.r * surface.r, light.g * surface.g, light.b * surface.b) * -light.direction . Normal).
Dieser Vorgang wird so lange wiederholt, bis die Leuchte beendet ist. Wenn das Licht beendet wird, erzeugt die Lichtquelle einen weiteren Strahl.
Behalten Sie im Auge, wie viel Licht auf jede Oberfläche trifft.
Das Licht wird mit einer zweidimensionalen Anordnung verfolgt, die der UV-Parametrierung der Oberfläche entspricht. Jede Oberfläche kann verwendet werden, sofern eine UV-Parametrierung vorliegt und die Fläche pro Texel bekannt ist.
Wenn ein Schnittpunkt erreicht wird, muss der Wert des entsprechenden Texels um das Pro-Farb-Produkt der Lichtfarbe mit dem der Oberfläche erhöht werden.
Generierung der Textur-Maps für die Verwendung in einem Rendering-System.
Sobald eine vorgegebene Anzahl von Strahlen aus den Lichtquellen verfolgt wurde, kann der Prozess der Texturerstellung beginnen. Da der Maximalwert eines Texels von der Anzahl der in einer Szene verfolgten Lichtstrahlen abhängen kann, müssen die Werte der Texel auf das Maximum jeder Farbe normiert werden. Beim Überlaufen des Textsatzes in der Szene werden die Maximalwerte für jede Farbkomponente ermittelt. Ein zweiter Durchgang wird durchgeführt, um jeden Farbwert mit dem entsprechenden Maximum zu normieren. Dabei wird auch der Wert des Texels durch seine Fläche dividiert.
Die Textur-Maps können dann gespeichert und passend zum Rendering-System verwendet werden. Wir haben uns für den von Steve Parker und Pete Shirley entwickelten Ray Tracer in Echtzeit entschieden, da wir große Mengen an Texturspeicher verwenden können. Die Dateien wurden polygonweise gespeichert und bei der Inbetriebnahme der Visualisierung eingelesen.
Ergebnisse.
Bei der Erstellung unserer Szenen wurden nur rechteckige Primitive verwendet. Wie bereits erwähnt, könnten andere Primitive mit adäquaten UV-Parametrierungen und bekannten Texelbereichen wie Triangular Meshes oder NURBS verwendet werden.
Da es sich um eine Szene handelt, die von einer gleichmäßigen Verteilung der zufälligen Strahlen abhängt, steigt die Qualität der Texturen mit der Anzahl der Strahlen pro Texel. Dies hilft, die untenstehende Sprenkelung zu reduzieren. Für gute Ergebnisse werden 100 bis 1.000 Strahlen pro Texel empfohlen.
Obwohl es sich um einen „Offline“-Vorlauf handelt, kann es recht zeitaufwendig sein, diese Textur-Maps zu generieren. Mit einer naiven Implementierung auf einer Origin 3000 dauerte es 240 Arbeitsstunden, um 100 Millionen Strahlen mit einer Szene mit 2,2 Millionen Textilien zu verfolgen.
Schlußfolgerungen.
Dies ist eine unkomplizierte Implementierung für die globale Beleuchtung. Im Gegensatz zur Berechnung des Formfaktors, der O (n^2) basierend auf der Anzahl der diskreten Oberflächen skaliert, skaliert dieser Ansatz um die Kosten der Berechnung von Kreuzungen mit dem Primitiven. Durch die Verwendung von Optimierungen des Raytracing, wie z.B. einer begrenzten Hierarchie, kann die Skalierung auf O (n log n) erfolgen.
Einer der Nachteile dieser Implementierung sind die Kosten für den Texturspeicher. Bei relativ komplexen Szenen wird die Verwendung von OpenGL-Texturspeicher unmöglich, da die erforderliche Texturmenge die im Speicher übersteigt. Aus diesem Grund haben wir uns für den Raytracer in Echtzeit entschieden, da der Texturspeicher nur durch den Hauptspeicher begrenzt war.
Vielen Dank für ihren Besuch.