Vermisse ich etwas für die Umgebungsokklusion?

7

Ich versuche, Umgebungsokklusion in Python 3 zu implementieren, und ich sehe Schatten unter meinen reflektierenden Kugeln, aber sie scheinen sehr schwach zu sein. Ich bin mir nicht sicher, ob das bedeutet, dass ich etwas verpasst habe oder ob ich nur einen falschen Eindruck davon habe, wie viel Schatten durch Umgebungsokklusion entsteht.

Das Ergebnis sieht folgendermaßen aus:

4 reflektierende Kugeln unter einem einheitlichen weißen Himmel

Dies wird als Kugeln (und nicht als Dreiecksnetze) modelliert. Die 4 gelblichen Spiegelkugeln schweben knapp über einer sehr großen Kugel, um sich einer Ebene anzunähern, und die gesamte Szene ist von einer sehr großen weißen Emissionskugel umgeben, die das Umgebungslicht des Himmels liefert.

Für jedes Pixel werden Probenstrahlen mit einer Gaußschen Verteilung um das Pixelzentrum ausgewählt, und es werden mehr Proben ausgewählt, bis die Varianz ausreichend niedrig ist. Strahlen reflektieren in der einzelnen Spiegelreflexionsrichtung von den Spiegelkugeln und in jeder Richtung von der Halbkugel möglicher Richtungen, wenn sie auf den Boden treffen. Alle Strahlen treffen schließlich auf die Kugel des weißen Himmels und die Farbe wird basierend auf den Verlusten auf dem Weg bestimmt.

Gibt es einen wichtigen Schritt, den ich übersehen habe?

Trichoplax
quelle
2
Verwenden Sie die Pfadverfolgung oder die physikalisch genaue Strahlverfolgung? Wenn ja, dann ist die Umgebungsokklusion bereits eine eingebaute Folge des Algorithmus und muss nicht spezifisch modelliert werden. Intuitiv scheint es mir richtig, dass der Schatten schwach ist: Ihre Kugeln sind Spiegel, und so werden diffuse Strahlen, die vom Boden in der Nähe der Kugel geschossen werden, eher weg und zur Skybox reflektiert als zurück zum Boden, wie dies bei diffusen Kugeln der Fall wäre .
Yuriks
1
Kennen Sie die srgb-Korrektur? Wenn nicht, könnte das ein Faktor sein. http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html
Alan Wolfe
Ich bin auch mit Alan zusammen, Gamma kann alle möglichen Kontrastprobleme verursachen. Eine gleichmäßig emittierende Kugel neigt jedoch dazu, sehr schwache Okklusionen zu erzeugen. Sie sollten versuchen, einen Abfallfaktor für die Emission zu verwenden, sodass vertikale Emissionen stärker sind als Weidemissionen. Auch Ihre Kugeln sind reflektierend, machen dann absorbierend. Aber ich denke, Ihr Tracer berücksichtigt das nicht, sonst würden wir mehr Energie unter Ihren Sphären sehen.
v.oddou
Ihr Himmel wirft möglicherweise ein kleines Halbschattenbild anstelle eines Schattens. Reduzieren Sie es zur Kontrolle auf eine kleine Kugel. Außerdem beleuchten die Kugeln indirekt den Hintergrund.
Yves Daoust
1
Ich habe ein echtes Foto gefunden, das beweist, dass Ihnen eine Okklusion fehlt. Imgur.com/a/qcxmK
v.oddou

Antworten:

6

Es ist ein bisschen schwer von Ihrem Bild zu unterscheiden, aber es sieht ein bisschen schwach aus. Beim Debuggen dieser Art von Dingen ist es immer nützlich, die Szene so weit wie möglich zu reduzieren, um unnötige Komplexität aus dem Bild zu entfernen. Versuchen Sie in Ihrem Fall, nur eine einzige diffuse Kugel zu erstellen, die den Boden an einem Punkt berührt. Geben Sie dem Boden und der Kugel eine Albedo von 1. Wenn die Umgebungsokklusion korrekt implementiert ist, sollte der Punkt, an dem die Kugel den Boden berührt, einen Pixelwert von 0 haben. Je weiter Sie von der Kugel entfernt sind, desto näher sollten die Pixelwerte an 1 liegen (nicht oben - stellen Sie sicher, dass bei der Ausgabe des Bildes nichts geklemmt wird). Stellen Sie sicher, dass Sie Ihre Bilder durch Gamma korrigieren.

Das einzige, was aus Ihrer Beschreibung herausragt, ist

Strahlen reflektieren [...] in jede Richtung von der Halbkugel möglicher Richtungen, wenn sie auf den Boden treffen

Das allein ist in Ordnung, aber Sie müssen sicherstellen, dass die Strahlen mit dem Lambertschen BRDF (dh Punkt (normal, Strahl) / Pi) multipliziert werden. Noch besser ist es, direkt von einer Kosinushalbkugel zu probieren. In diesem Fall heben sich alle Faktoren auf. Dieser Blog-Beitrag enthält alle wichtigen Informationen an einem Ort.

Benedikt Bitterli
quelle
Würden Albedowerte von 1 nicht ein Bild erzeugen, das niemals konvergiert? Afaik, Albedo sollte immer <1 sein, damit Konvergenz stattfinden kann. Eine Albedo von 1 würde speziell keinen Kontaktschatten verursachen, da Strahlen perfekt reflektiert würden, bis sie eine Lichtquelle wie den Himmel erreichen.
Yuriks
Bei globaler Beleuchtung würde es keinen Kontaktschatten geben, ja. Die Frage bezieht sich jedoch auf die Umgebungsokklusion, die nur einen Sprung ausführt. Solange die Szene nicht geschlossen ist (dh der Himmel ist sichtbar), würde die Szene konvergieren, wenn die globale Beleuchtung auch mit einer Albedo von 1 verwendet würde.
Benedikt Bitterli
Der Trick, die Kugel auf den Boden zu legen und den Kontaktpunkt zu betrachten, ist großartig. Beachten Sie, dass es auch zum Debuggen Ihrer (sphärischen) Lichter funktioniert, jedoch in die entgegengesetzte Richtung!
Imallett
3

Ich werde einige Richtlinien hinzufügen, um den Lesern das Verständnis von Benedikt Bitterlis Aussage "Stellen Sie sicher, dass Ihre Bilder durch Gamma korrigiert werden" zu erleichtern.

Gammakorrekturbilder bedeuten nicht, dass am Ende ein Leistungsfilter angewendet wird. Es bedeutet, während aller Berechnungen im linearen Raum zu arbeiten und schließlich die Ausgabe in den Gammaraum zu codieren.

Der Gammaraum ist der Farbraum, in den alle Anzeigemaschinen dieses Alters erwarten, dass ihnen RGB-Werte präsentiert werden.

Der lineare Raum im Gegensatz dazu ist die Tatsache, mit Werten zu arbeiten, die proportional zu den physikalischen Emissionen sind.

Wenn der Künstler die Werte der Albedofarben der Weltoberflächen und die Farben der Lichter der Szene bearbeitet, tut er dies im Gammaraum, da keine Editionssoftware es wagt, die Eingaben des Benutzers zu ändern und nur zu speichern. ist. Der Künstler betrachtete also etwas, das für ihn gut aussah, während es im Gammaraum aufbewahrt wurde.

Der erste Schritt aller Rendering-Engines sollte daher darin bestehen, zuerst alle vom Menschen bearbeiteten Eingaben in den linearen Raum zu konvertieren. In Ihrem Fall bedeutet dies alle Kugelfarben und Emissionswerte.

Anschließend führen Sie Ihr übliches Raytracing, Ihre Brdf-Auswertung und Ihre Monte-Carlo-Probenahme in HDR durch, wenn möglich, unter Verwendung von float32Komponenten. (funktioniert normalerweise gut mit 128-Bit-SIMD als r,g,b,aVektoren).

Schließlich filtern Sie das HDR-Bild nach dem von Ihnen gewählten Belichtungswert, heuristisch oder manuell. Diese Operation könnte sehr einfach sein wie a clamp. Und dann und nur dann codieren Sie das endgültige Bild in den Gammaraum.

Die Basis ist: Ein Monitor nimmt einen Eingabewert x und wendet die Formel x ^ 2.2 an, um die physikalische Strahlung auf dem Ausgabepixel zu erzeugen.

Somit lauten die Umrechnungsformeln wie folgt:

linear zu Gamma: x ^ (1 / 2.2)
Gamma zu linear: x ^ 2.2

Bitte beachten Sie als Trivia, dass der sRGB-Speicher eine komplexe Formel, a ifund einen gewissen Versatz hat. Aber von weitem gesehen kommt die Kurve dem einfachen Gamma sehr nahe.

Sind Sie sicher, dass Ihre Stichprobe fair ist?
Sie könnten zu viel in die Richtungen abtasten, die mehr Strahlen privilegieren, um den Himmel zu erreichen. Überprüfen Sie die Gleichmäßigkeit Ihrer Probenahme. Sie sagten, Sie verwenden einen Gaußschen, der mir so vorkommt, als würden Sie nach Voreingenommenheit fragen. Verwenden Sie einfach die klassische Lambert-Verteilungsstichprobe: https://pathtracing.wordpress.com/. Auf diese Weise reduzieren Sie die Anzahl der Stichproben, die erforderlich sind, um ein Varianzäquivalent mit einer rein einheitlichen Kugel zu erhalten. Außerdem speichern Sie die Kosinusauswertung, da sie in die Verteilung eingebettet ist.

Wenn Ihre Kugeln wirklich Spiegel sind und Ihr GI angeblich tatsächlich funktioniert, sammelt er reflektierte Energie auf dem Boden und kompensiert so Ihre Schatten vor Okklusion. Ich erwarte in solchen Fällen sogar mehr Energie als Verdunkelung.

v.oddou
quelle
Interessant - danke. Für das zusätzliche Licht, das den Boden von den Kugeln erreicht, erwarte ich, dass dies weniger ist als das Licht, das den Boden direkt vom Himmel erreichen würde, wenn die Kugeln nicht da wären, da sie konvex sind. Das heißt, ich kann mir keine Ätzmittel vorstellen, die nur aus konvexen Oberflächen resultieren, wenn das Licht gleichmäßig vom Himmel kommt. Selbst im Extremfall, in dem alles Licht reflektiert wird (keine Absorption), würde ich einfach keinen Schatten erwarten, sondern eine Ätzung.
Trichoplax
1
Ich verstehe deine Intuition. Ich wollte es wagen, eine analytische Berechnung für die Energie durchzuführen, die wir auf einem Pixel erwarten sollten, das direkt unter der vertikalen Tangente der Kugel liegt, aber ich bin so langsam in Mathe, dass ich lol aufgegeben habe. In der Tat werden konvexe Oberflächen nur über einen Pfad zu einem bestimmten singulären Emissionsquellenpunkt reflektiert, sodass die Ätzung unplausibel erscheint.
v.oddou