Photon Mapping ist seit der Version 11.0 Teil von PRMan. Die Lichtquellen mussten jedoch fest programmierte Abstände aufweisen und die Oberflächenmaterialien waren auf einen festen, begrenzten Satz von Materialien (matt, transzulent, chrom, transparent, Glas und Wasser) beschränkt. Die vielleicht größte Einschränkung war, dass Texturen in Photon Tracing Phasen nicht verwendet werden konnten.
PRMan 13.5 führte einen viel allgemeineren und flexibleren Ansatz für das Photon Mapping ein. Der Ansatz arbeitet mit sehr allgemeinen Shadern, einschließlich Flächenlichtquellen, Oberflächentexturen und Displacement Shadern. Der größte Nachteil ist, dass die direkte Beleuchtung und die Oberflächenfarben in Punktwolken-Dateien gebakt werden müssen. Zweck dieser Application Note ist es, Beispiele für den Einsatz von Photonen-Maps für Causting und Global Illumination mit sehr allgemeinen Lichtquellen und Surface Shadern zu liefern.
Sampling Illuminationen und Scattering-Koeffizienten.
Um die Emission und das Tracing von Photonen zu kontrollieren, müssen wir zunächst die Beleuchtung und die Oberflächenfarben baken.
Baken mit direkter Beleuchtung.
Die Photonen-Emission, die einfachen Lichtquellen entspricht, ist relativ unkompliziert. Allgemeine Light Source Shader können jedoch auch einen unnatürlichen Absturz der Entfernung, gefakte Shading-Positionen und Positions-Highlights etc. aufweisen. Es ist schwierig, die Photonenemission auf solche Shader abzustimmen. Hier werden wir jedoch einen anderen Ansatz verfolgen: Bewerten Sie die Light Source Shader an den Oberflächenpunkten, indem Sie die direkte Beleuchtung durch die Lichtquellen darstellen. Dabei wird jeder Lichtquellen-Shader grundsätzlich als „Black Box“ behandelt, die sich durch ihre Beleuchtung auf den Oberflächen der Szene auszeichnet.
Um die direkte Beleichtung festzulegen, müssen wir die Szene mit einem Lichtquellen-Shader rendern, der _Bestrahlungsstärke, L und _Bereich mit der Funktion bake3d() bakt. (L ist notwendig, wenn alle Oberflächen diffus sind).
Als Beispiel verwenden wir eine Box mit zwei Teekannen sowie Textur- und Displacement Maps. Die Szene wird von drei Lichtquellen beleuchtet. Sie speichern die Beleuchtung für den Einsatz in der Photonen-Emission – drei Lichtquellen werden in die gleiche Punktwolken Datei eingebrannt. Nachfolgend sind die beiden verwendeten Lichtquellen-Shader aufgeführt. Der Shader „Myspotlight“ ist ein Scheinwerfer ohne Abstandsverlust „Projectlightxz“ projiziert eine leichte Textur (in der x-z-Ebene) ähnlich einem Diaprojektor. Die Schatten werden mit Raytracing berechnet.
Die Zeile „L = L;“ ist ein notwendiger Trick, um eine unerwünschte Optimierung zu vermeiden und damit sicherzustellen, dass der Lichtquellen-Shader auf allen Shading-Grids betrieben wird.
Der Vollständigkeit halber sind die drei Displacement Shader im Folgenden aufgeführt. Der Einsatz von Displacement-Shadern zeigt hier, dass Displacement- mit Photonen-Mapping gut funktioniert.
Hier ist die RIB-Datei für die Szene:
Sonderfall: Wenn alle Oberflächen rein diffus sind, muss die L-Richtung nicht eingebrannt werden. In diesem Fall genügt es, die gesamte CI (die Summe der Beleuchtung aller Lichtquellen) zusammen mit der Mikropolygonfläche zu baken. Dies kann entweder im Oberflächen-Shader oder in einem Atmosphere-Shader erfolgen.
Potentieller Pit-Fall: Wenn mehrere Lichtquellen in die gleiche Punktwolken-Datei schreiben, dann ist es wichtig, dass die Display-Kanäle nicht „EliminateDuplicateGrids“ einschalten. Wenn ja, dann werden nur Punkte der ersten Lichtquelle in der Punktwolke gespeichert. Wenn EliminateDuplicateGrids eingeschaltet sein muss (für Netrendering), dann sollte das Baken in einem Surface Shader (oder Atmosphere-Shader) erfolgen.
Baking Scattering Koeffizienten.
Um die Scattering Koeffizienten festzulegen, muss die Szene mit Oberflächenschattierungen gerendert werden, die die Streukoeffizienten für die Oberflächenmaterialien der Objekte baken.
Der Oberflächen-Shader „bake_scattercoeffs“ speichert Scattering Koeffizienten für das Photonen Tracing: diffuse Reflexion, Spiegelreflexion, diffuse Refraction und Specular Refraction. (Das Baken und spätere Nachschlagen basiert auf den nach außen gerichteten Oberflächen-Normals).
Hier ist die RIB-Datei:
In diesem Beispiel haben wir nur diffuse und spiegelnde Reflexionsfaktoren gebakt. Es ist auch möglich, diffuse und spiegelnde Refraction-Koeffizienten sowie den Index of Refraction (ior) zu baken.
In diesem Beispiel wurden alle Scattering-Koeffizienten zu einer einzigen Punktwolkendatei gebakt. Es ist auch möglich, mehrere Punktwolken zu baken z.B. eine pro Objekt in der Szene.
Photonen-Emission und -Tracing.
Der nächste Schritt ist die Photonen-Emission und -Tracing. Die Photonen-Emission und -Tracing wird von den oben gebakten Punktwolken geleitet.
Festlegen der Photonen-Emission.
Photonen werden wie bisher emittiert: mit einem Photonenversteck. Neu ist, dass die Photonen-Emission durch eine Punktwolke spezifiziert werden kann, die mit dem Parameter „Emissionspunktwolke“ übergeben wird. Zum Beispiel:
Wenn keine Emissionspunktwolke angegeben ist, kehrt PRMan zum alten Verhalten zurück: Es emittiert Photonen, die den Lichtquellen in der Szene entsprechen (so weit wie möglich).
Spezifikation von Oberflächenmaterialien.
Die für die Oberflächenstreuung zu verwendende Punktwolke (diffrefl, diffrefr, specrefl, specrefr, ior) wird mit dem Attribut „Photon“ „Shading-Modell“ und einem Dateinamen vorangestellt mit „PointCloud“ oder „Brickmap:“ angegeben. Zum Beispiel:
Auch die alten, vordefinierten Oberflächenmaterialien können weiterhin verwendet werden:
Beispiel: Photonen-Emission und -Tracing in der Boxenszene.
In der folgenden RIB-Datei wird die Illumination Point-Cloud „box_direct.ptc“ zur Steuerung der Photonenemission und die Scattering-Koeffizienten in „box_scattercoeffs.ptc“ zum Photonen-Tracing verwendet.
Durch das Ausführen dieser RIB-Datei wird eine globale Photonen-Map „box_gpm.ptc“ mit ca. 2,6 Millionen Photonen erzeugt.
Berechnung der Radiosity Map.
Unter Verwendung der Leistungen der Photonen-Map und der diffusen Oberflächenfarben können wir eine Radiositätsschätzung an jeder Photonenposition berechnen. Die resultierende Punktwolke wird oft als Radiosity Map bezeichnet. Die Radiosity Map kann mit dem eigenständigen Programm ptfilter berechnet werden. Zum Beispiel:
Neuer Schritt: Neuabtastung der Radiosity Map.
Dieser Schritt stellt sicher, dass keine Lücken in der Radiosity Map entstehen. Dieser Schritt ist nur notwendig, wenn im folgenden Rendering-Schritt punktbasierte Color-Bleedings für die endgültige Sammlung verwendet werden und wenn die Photonen-Map Lücken zwischen den Photonen in Gebieten mit geringer Beleuchtung aufweist. In unserem Map-Beispiel ist die Vorderseite der verschobenen, diffusen Teekanne ein solcher Bereich, ebenso wie die Bodenbereiche unter den Teekannen.
Dies ist ein Shader, der Radiositätswerte aus einer Radiosity Map liest und in eine andere schreibt:
Und hier ist die RIB-Datei für das Resampling der Radiosity Map:
Rendering mit Final Gathering.
Alles, was bleibt, ist das endgültige Bild zu rendern. Die oben gezeigte Radiosity Map ist offensichtlich zu verrauscht, um direkt zu rendern, also müssen wir eine abschließende Sammlung durchführen, um die Qualität zu verbessern. Die endgültige Sammlung kann auf zwei Arten erfolgen:
In diesem Beispiel verwenden wir den punktbasierten Ansatzm da er in der Regel schneller ist. Dies ist ein Shader, der punktbasierte Color-Bleedings berechnet.
Beachten Sie, dass, um die beste Qualität der punktbasierten Color-Bleeding zu erhalten, die indirekten Diffuse-()-Parameter „Clamp“ und „Sortbleeding“ eingeschaltet sind und „Colorhitsides“ „Front“ ist.
Nachfolgend finden Sie die RIB-Datei für die Darstellung des endgültigen hochwertigen Bildes der „Global Illumination“ in der Box.
(Wenn Sie diese RIB-Datei ausführen, ignorieren Sie die Warnung, dass die Punktwolkendatei keine float_area-Daten enthält. Stattdessen werden die Disc Radii verwendet, was für diesen Zweck völlig in Ordnung ist.)
Ein Caustics-Beispiel.
Das in den vorherigen Abschnitten gezeigte Box-Beispiel hat Caustics aus der spiegelnden Teekanne. Die Caustics sind jedoch nicht sehr ausgeprägt. Hier ist ein einfacheres Beispiel mit klareren Caustics. Die Szene besteht aus einer texturierten, spiegelnden Teekanne auf einer diffusen Ebene.
Hier ist die RIB-Datei zum Baken der direkten Beleuchtung:
Hier ist die RIB-Datei zum Baken der Scattering-Koeffizienten aus der texturierten Spiegelteekanne:
In diesem Beispiel verwenden wir eine Brick-Map für die Scattering-Koeffizienten. Aus der Punktwolke wird mit dem Brickmake-Programm die Brick-Map generiert:
Als nächstes ist es an der Zeit, Photonen zu tracen. Wir werden 1 Million Photonen mit einer Verteilung emittieren, die der in die teapotcaustic_direct.ptc Punktwolke eingebrannten Beleuchtung entspricht. Die Photonenstreuung wird durch die Scattering-Koeffizienten gesteuert, die in der Brick Map Datei teapotcaustic_scattercoeffs.bkm gespeichert sind. Hier ist die RIB-Datei für die Photonenemission und -streuung:
Das Ergebnis ist eine geätzte Photonen-Map-Datei (teapotcausting_cpm.ptc genannt) mit rund 196.000 Photonen. Die Darstellung der geätzten Photonen-Map mit ptviewer – mehrfach 200.000.000 teapotcuastic_cpm.ptc sorgt dafür, dass die durch die Textur auf der Teekanne verursachten farbigen Ätzungen deutlich sichtbar sind.
Die Shader, die für die Darstellung des endgültigen Bildes verwendet werden, sind „paintedchrome“ (verwendet für die texturierte Chromteekanne) und „matte_und-caustic“ (verwendet für die Grundplatte):
Hier ist die RIB-Datei für die Darstellung der berechneten Caustics:
Da die Caustic ausbreitet ist, ist sie eher schwach (im Gegensatz zu einem fokussierten Caustic). Aus diesem Grund haben wir einen „Kc“-Wert von 6 verwendet, um ihn künstlich aufzuhellen.
In diesem Beispiel werden weder das Causting-Gussobjekt noch die Causting-Empfänger als Displacement Map dargestellt, aber sie hätten es leicht sein können.
Bekannte Einschränkungen.
Die Implementierung hat die folgenden bekannten Einschränkungen:
Displacement Shader.
Der Shader „Dispmap“ verwendet eine Textur-Map für das Displacement, „dispsinz“ berechnet eine Wellen-Displacement in Abhängigkeit von der Z-Position (tiefe) und „disppumpkin“ berechnet ein Displacment, die eine Teekanne wie einen Kürbis aussehen lässt.
Damit sind wir soweit mit unserem Beitrag zum Photonen-Mapping durch. Falls Sie noch Fragen oder Anmerkungen zu diesem Beitrag haben sollten, hinterlassen Sie uns unten einen Kommentar.
Vielen Dank für ihren Besuch.