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:
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?
quelle
Antworten:
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
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.
quelle
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
float32
Komponenten. (funktioniert normalerweise gut mit 128-Bit-SIMD alsr,g,b,a
Vektoren).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
if
und 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.
quelle