Und nur noch ganz kurz, bevor ich auch ins Bett gehe: Ich würde erst einmal die Annahme aufweichen, dass man nur ein Nebelvolumen hat, denn ich würde es in zwei unterteilen. Eben einem Nebelvolumen mit konstanter Dichte, und einem Nebelvolumen mit exponentiell verteilter Dichte.
Am Ende rendert man dann beide Volumen (nach Betrachterentfernung sortiert). (Das ist ein einfacher Painter's-Algorithm am Ende, d.h. man beschränkt sich auf disjunkte, konvexe Nebelvolumen (wenn nur ein Volumen, ist die Konvexität egal), was aber in der Praxis kaum Einschränkungen mit sich bringt. Und falls CodingCat jetzt mit OIT kommt: Nein, dass geht auch nicht, weil man Liniensegmente statt einzelner Pixel verfolgen müsste. Das ist alles nur eine Seitenbemerkung, warum schreibe ich das überhaupt hier? Egal, löschen werde ich das jetzt nicht.)
Das Integral für das Volumen mit konstanter Nebeldichte gibt ja bereits im Wenzel aufgelöst, das Integral für die exponentiell verteilte Nebeldichte kann ich morgen noch mal herleiten, sollte aber sehr einfach werden. Mit der Unterteilung in zwei Volumen spart man sich die explizite Bestimmung von
\($t_0$\). (Ansonsten müsstest du einen Zusatz-Pass rendern, in dem du nur die
\($z_0$\)-Trennebene rausrenderst.)
Zur Berechnung von
\($\mathbf o$\) und
\($\mathbf d$\): Das ist auch alles im Wenzel beschrieben (Folie 21 ff.). Die Punkte
\($\mathbf o$\) und
\($\mathbf o$\) +
\($\mathbf d$\) sind einfach die Endpunkte des Liniensegments, das durch das Nebelvolumen geht. Alles in Weltkoordinaten! Dabei kann es vorkommen, dass
\($\mathbf o$\) oder
\($\mathbf o$\) +
\($\mathbf d$\) jeweils unabhängig voneinander auf dem Hüllkörper des Nebelvolumens liegen, oder innerhalb des Volumens. Kurzversion:
- Falls Kameraposition im Nebelvolumen:
- Setze \($\mathbf o$\) = Kameraposition.
- Rendere die z-Werte der Back-Faces des Hüllkörpers vom Nebelvolumen in einen Buffer. Zusätlich hast du den z-Buffer, der die Tiefenwerte der übrigen Objekte in der Szene enthält. Lese an der entsprechenden Pixelposition beide Buffer aus, bilde das Minimum, dies ist der z-Wert von \($\mathbf o$\) + \($\mathbf d$\). Rekonstruiere die Weltposition von \($\mathbf o$\) + \($\mathbf d$\), wie es bei Deferred Shading üblich ist.
- Falls Kameraposition nicht im Nebelvolumen:
- Rendere Front-Faces des Hüllkörpers vom Nebelvolumen. Lese an der entsprechenden Pixelposition den Buffer aus, dies ist der z-Wert von \($\mathbf d$\). Rekonstruiere die Weltposition von \($\mathbf o$\), wie es bei Deferred Shading üblich ist.
- Siehe 1. zur Berechnung von \($\mathbf o$\) + \($\mathbf d$\).
Damit hast du
\($\mathbf o$\) und
\($\mathbf o$\) +
\($\mathbf d$\) berechnet. Wie schon gesagt, die Berechnung von
\($t_0$\) erübrigt sich, wenn man das Volumen in zwei Volumen aufteilt. Beide Volumen werden gerendet (back-to-front) und geblendet.
Andre hat geschrieben:Ist d Index 3 die Z-Koordinate des Vektors d? (Bei mir ist Y oben) Oder was bedeutet der Index?
Ja, genau das ist sie.
Andre hat geschrieben:Was genau ist b? Die Dichte?
Das müsstest du den Wenzel fragen.
\($b$\) ist einfach ein Proportionalitätsfaktor von der Dichte. Ähnlich
\($c$\), nur dass
\($c$\) im Exponent auftaucht. Darüber würde ich mir keinen Kopf machen, sondern das sind einfach benutzerdefinierte Parameter, damit es am Ende gut aussieht.
Andre hat geschrieben:Bei Wenzel's Methode hat man auf jedenfall keine sichtbare Grenzschicht.
Naja, vielleicht für deinen jeweiligen Fall nicht sichtbar. Ich muss nur die Höhe der z.B. Bounding Box kleiner machen (anschauungshalber auf 1 Zentimeter), und du wirst eine Grenzschicht sehen. Egal wie hoch du nun die Bounding Box machst, das prinzipielle Problem bleibt bestehen (dass der Term nur asymptotisch gegen Null geht), daher bräuchte man eine unendlich Hohe Bounding Box. In der Praxis kann man sich mit einer genügend hohen Box zufrieden geben, da die Differenz zur 0 eben verschwindend gering wird. Aber saubere Lösungen sehen meiner Meinung nach anders aus. Vor allem ist es nicht sehr benutzerfreundlich. (Der tiefere Grund könnte die physikalische Modellierung von Partikeldiffusion in unendlich langen Zylindern sein.)
Ich sollte vielleicht noch sagen, dass ich das nie implementiert habe, geschweige denn zuvor den Wenzel-Artikel gelesen habe. Aber mittlerweile bin ich im akademischen Paper-Lesen doch halbwegs geübt.
Herleitung des Integrals für die exponentielle Verteilung morgen, sollte aber einfach sein.