Seite 1 von 1

BRDF für Reflektion [Solved]

Verfasst: 10.04.2012, 16:16
von Artificial Mind
Hallo,

Cat und ich haben uns gerade über BRDFs und deren Normierung unterhalten und kamen dabei auf die Frage, wie genau die BRDF für perfekte Reflektion aussieht.

Wir haben dabei folgende Renderinggleichung:
\($$L_o(\mathbf x, \omega, \lambda, t) = L_e(\mathbf x, \omega, \lambda, t) + \int_\Omega f_r(\mathbf x, \omega', \omega, \lambda, t) L_i(\mathbf x, \omega', \lambda, t) (-\omega' \cdot \mathbf n) d \omega'$$\)
wobei die Winkel als \(\(\omega = (\theta, \phi)\)\) aufzufassen sind.
Für unsere Reflektions-BRDF sollte ja \(\(f_r(\theta, \theta', \phi - \phi')\)\) reichen (weil Reflektion ja isotrop ist, oder?).

Sie wird wahrscheinlich über das Dirac-Delta \(\(\delta\)\) formuliert und zwar mindestens als einen Term, der erzwingt, dass \(\(\phi, \theta\)\) gleich dem reflektierten \(\(\phi', \theta'\)\) entspricht. Außerdem muss es sicher einen Term geben, der für \($$\int_\Omega f_r(\mathbf x, \omega', \omega, \lambda, t) (-\omega' \cdot \mathbf n) d \omega' = 1$$\) bzw. \($$\int_{\theta'} \int_{\phi'} f_r(\theta, \theta', \phi - \phi') cos(\theta') sin(\theta') d \phi' d \theta' = 1$$\) sorgt.

Wir würden uns freuen, wenn jemand (*schiel* z. B. eXile *schiel*) das vielleicht kurz erklären könnte.

Cheers,
Mind

EDIT: auf Cat's Hinweis hin zur Klärung der Renderinggleichung: es ist \(\(L_i = L_o(trace(x, -omega'), omega')\)\) gemeint, es wird also zwischen einfallendem Licht \(\(L_i\)\) und ausfallendem Licht \(\(L_o\)\) unterschieden.

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 16:27
von Schrompf
Zur Frage kann ich leider nichts beitragen, auch wenn ich die Diskussion mit großem Interesse verfolgen werde. Aber eine Frage zu den Formeln: brauch ich irgendein Browser-Plugin, um die lesen zu können?

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 16:30
von waigie
Ich denke nicht, aber ich hab das gleiche Problem. Opera mag die Latexformeln nicht darstellen, mit Chrome geht es.

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 16:33
von Artificial Mind

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 16:42
von Matthias Gubisch
Muss wohl irgendwas beim Editieren kaputt gegangen sein
Als ich das erste mal in den Thread gesehen habe waren die Formeln noch lesbar...

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 16:48
von Schrompf
Nein, auch der Post ging bei mir nicht. Wenn ich das richtig verstehe, sollte der BBCode Javascript-Code erzeugen, aber ich sehe davon nichts. Ich sehe nur den Rohtext.

Aber ich möchte hier nicht weiter vom Thema ablenken.

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 17:48
von MadMax
imho einfach BRDF = δ(ω-ωreflect)

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 17:54
von MadMax
damit kann man dann auch sehr schön aus der alg. rendering gleichung den Raytracing Algo. herleiten.

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 17:57
von Artificial Mind
MadMax hat geschrieben:imho einfach BRDF = δ(ω-ωreflect)
1. Das ist natürlich "einfach" weil du den Winkel nicht aufgelöst hast und das "reflect" benutzt (es muss dann außerdem ω'reflect sein und nicht ωreflect). Ich würde gerne eine Formel haben, die direkt \(\(\theta,\theta',\phi,\phi'\)\) benutzt.
2. hast du dir Gedanken über Normalisierung gemacht, damit die Formel für alle ω energieerhaltend ist?

EDIT: Die Formeln buggen etwas O.o

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 18:52
von eXile
Wenn ich darf, schnapp' ich mir erstmal deine Renderinggleichung und schmeiß' die ganzen Variablen, die wir nicht brauchen (nämlich \($\lambda$\) und \($t$\)), raus:
\($$L_o(\mathbf x, \omega) = L_e(\mathbf x, \omega) + \int_\Omega f_r(\mathbf x, \omega', \omega) L_i(\mathbf x, \omega') (-\omega' \cdot \mathbf n) d \omega'$$\)(Mich persönlich stört daran das Minus beim letzten Term (die haben auf Wikipedia einfach die Richtung der Vektoren umgedreht), aber das ist mir jetzt egal; mir ist lieber, dass ich hier eure Notation verwende, anstatt hier alle meine Notation aufzuzwingen.) Der Emissionsterm \($L_e$\) ist egal, da ein Spiegel keine Emission besitzt (jetzt kommt nicht mit venezianischen Spiegel und eine Leuchte dahinter…). Damit vereinfacht sich die Renderinggleichung zur Reflexionsgleichung (Emissionsterm 0):
\($$L_o(\mathbf x, \omega) = \int_\Omega f_r(\mathbf x, \omega', \omega) L_i(\mathbf x, \omega') (-\omega' \cdot \mathbf n) d \omega'$$\)Wenn man so ein Problem angeht, muss man sich fragen, was die charakteristische Eigenschaft dieser BRDF ist. Naja, die charakteristische Eigenschaft ist halt, dass die reflektierte Radianz gleich der eingehenden Radianz ist. Oder in Formeln:
\($$L_o(\mathbf x, \omega) = \int_\Omega f_{\text{mirror}}(\mathbf x, \omega', \omega) L_i(\mathbf x, \omega') (-\omega' \cdot \mathbf n) d \omega' = L_i\big(\mathbf x, R(\omega)\big)$$\)wobei das \($R(\omega)$\) dem reflektierten Raumwinkel entspricht:
\($$R(\omega) = R(\theta, \phi) = (\theta, (\phi + \pi) \text{ mod } 2\pi)$$\)Bei einem Spiegel bleibt der Altitudewinkel \($\theta$\) vor und nach der Reflexion gleich. Der Azimuthwinkel \($\phi$\) ist um eine halbe Drehung verdreht. Dabei muss man noch aufpassen, dass der Winkel auch schön zwischen 0 und \($2\pi$\) liegt, weil halt die Parametrisierung für \($\phi$\) nur in \($[0, 2\pi[$\) liegt.

Wenn wir nun in die obige Reflexionsgleichung die explizite Polarkoodinaten-Parametrisierung mitsamt zugehöriger Funktionaldeterminante einsetzen, kriegen wir:
\($$L_o(\mathbf x, \omega) = \int_0^{2\pi} \int_0^\pi f_{\text{mirror}}(\mathbf x, \omega', \omega) L_i(\mathbf x, \omega') \cos(\theta') \sin(\theta') \,\mathrm d\theta' \,\mathrm d\phi' = L_i\big(\mathbf x, R(\omega)\big)$$\)Das obige Minus von Wikipedia (was ich immer noch nicht mag) ist damit auch elegant im Orkus der Geschichte verschwunden, weil der Kosinus eine gerade Funktion ist. Man kann jetzt schon mal eine Hypothese für \($f_{\text{mirror}}$\) aufstellen: Auf jeden Fall müssen der Kosinus- und der Sinusterm verschwinden. Außerdem soll der „Peak“ der BRDF genau in Richtung \($R(\omega)$\) gehen. Wenn man diese zwei Ideen nimmt, kann man sich mal diese BRDF anschauen:
\($$f_{\text{mirror}}(\mathbf x, \omega, \omega') = \frac{\delta(\theta' - \theta) \cdot \delta(|\phi' - \phi| - \pi)}{\cos(\theta') \sin(\theta')}$$\)Das erste Dirac-Delta erzwingt \($\theta' = \theta$\). Das zweite Dirac-Delta erzwingt unter Beachtung von Wraparound \($\phi' = \phi \pm \pi$\). Genau, was wir haben wollen. Durch Multiplikation können wir beide Bedingungen Und-Verknüpfen. Dann noch im Nenner durch den Kosinus- und Sinusterm teilen, und fertig ist die Laube.

Wenn ihr jetzt sagt, das geht doch für \($\theta' = 0$\) mit eine Division durch Null voll in die Hose: Stimmt, ist aber egal, weil das nur ein einzelner Punkt (genauer: eine Nullmenge) beim Integrieren ist; das verändert also den Wert des Integrals nicht. Praxisnah ist das so wie so nicht, es sei denn, ihr bastelt mir mal eine Dirac-Verteilung im Computer.

Als „Beweis“ kann ich das ganze auch noch mal schnell durchrechnen:
\(\begin{align}L_o(\mathbf x, \omega) &= \int_0^{2\pi} \int_0^\pi f_{\text{mirror}}(\mathbf x, \omega', \omega) L_i(\mathbf x, \omega') \cos(\theta') \sin(\theta') \,\mathrm d\theta' \,\mathrm d\phi' \\
&= \int_0^{2\pi} \int_0^\pi \delta(\theta' - \theta) \cdot \delta(|\phi' - \phi| - \pi) \cdot L_i(\mathbf x, \omega') \,\mathrm d\theta' \,\mathrm d\phi' \\
&= \int_0^{2\pi} \delta(\theta' - \theta) \int_0^\pi \delta(|\phi' - \phi| - \pi) \cdot L_i(\mathbf x, \omega') \,\mathrm d\theta' \,\mathrm d\phi' \\
&= \int_0^{2\pi} \delta(\theta' - \theta) \cdot L_i\big(\mathbf x, \theta', (\phi + \pi) \text{ mod } 2\pi\big)\,\mathrm d\theta' \,\mathrm d\phi' \\[5 pt]
&= L_i(\mathbf x, \theta, (\phi + \pi) \text{ mod } 2\pi) \\[5 pt]
& = L_i(\mathbf x, R(\omega))\end{align}\)
Also genau das, was wir wollten. Ich hab's zur Sicherheit auch noch mal mit Mathematica nachgerechnet. ;)

Wohlgemerkt: Damit haben wir eine solche BRDF gefunden. Niemand sagt, dass die Formel eindeutig ist (da man hier nicht mit Funktionen, sondern mit sogenannten Distributionen rechnet, kann man die Funktionen nicht einfach punktweise vergleichen!; man muss im Falle von unbeschränkten Werten – wie bei der Dirac-Deltafunktion an der Stelle 0 – einen Grenzwertvergleich anstellen!); siehe dazu auch Zusatz 1.

Zusatz 1:
Anstelle von obiger Definition von \($f_{\text{mirror}}$\) mit dem Kosinusterm im Nenner kann man auch folgende, äquivalente Definition nehmen:
\($$f_{\text{mirror}}(\mathbf x, \omega, \omega') = \frac{\delta\big(\!\cos(\theta') - \cos(\theta)\big) \cdot \delta(|\phi' - \phi| - \pi)}{\cos(\theta')}$$\)Wir sehen: Keine Divison durch den Sinusterm. Warum? Weil durch die „Kettenregel“ (es ist nicht die Kettenregel für Funktionen, weil wir hier mit Distributionen arbeiten!) den Transformationssatz für Integrale (wieder: Eigentlich für Distributionen und nicht Funktionen…) beim ersten Deltaterm die Division durch den Sinusterm geschenkt bekommen! Nachtrag: In der Formel war vorhin noch ein Fehler, ist nun gefixt.

Zusatz 2:
Die Version von MadMax funktioniert so leider nicht: Die Dirac-Verteilung nimmt als Parameter eine reelle Zahl; übergeben wurde (je nach Parametrisierung) ein zumindest zweidimensionales Tupel (nämlich \($\omega = (\theta, \phi)$\)). D.h. nimmt man jetzt an, dass man die Winkelpaare einfach komponentenweise vergleicht, und die Dirac-Verteilungen multipliziert (so wie ich oben), dann klappt es immer noch nicht, weil eben \($\phi$\) um \($\pm \pi$\) rotiert werden muss.

Beim \($\omega_{\text{reflect}}$\) kann ich aber weiterhelfen: Householder-Reflektor benutzen. Das hatte ich schon mal in diesem Post angerissen (das \($\mathbf{r}_\mathbf{n}$\) dort ist der Householder-Reflektor).

Zusatz 3:
Bestimmt wieder Tonnen von Fehlern eingebaut. Bin um reden Hinweis dankbar.

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 19:10
von Artificial Mind
Vielen Dank für die ausführliche Antwort. Das ist im großen und ganzen so wie ich mir das gedacht habe, aber jetzt habe ich das ganze auch nochmal mathematisch exakt, danke :)

1. Bezüglich der Richtungen der Omegas: Ist wohl einfach Geschmackssache, aber ich kann durchaus verstehen, warum man lokal immer alle Richtungen vom Punkt wegzeigend definieren möchte (-> Einheitlichkeit).

2. Das man die Reflektion per Householder-Spiegelung "implementieren" "könnte", war mir bekannt (auch wenn man wahrscheinlich nicht die Matrixdarstellung nehmen sollte wegen Performanz, oder?). Ich wollte wissen, wie man das direkt aus den Winkeln berechnen kann, was du ja mit R(ω) beantwortet hast ;)

3. Welche "Kettenregel" für Verteilungen meinst du? Transformationssatz?

4. Dirac-Delta im Computer: wie wärs mit Gaußverteilung mit sigma -> 0 numerisch? :D

EDIT: 5. Könnte man sonst auch den Glossy-Phong-Term mit Specularity -> Infinity nehmen?

Re: BRDF für Reflektion

Verfasst: 10.04.2012, 19:42
von eXile
Artificial Mind hat geschrieben:3. Welche "Kettenregel" für Verteilungen meinst du? Transformationssatz?
Ja, genau. Weil Verteilungen leider keine Funktionen sind, darf man den zwar nicht anwenden; aber man kann etwas ganz analoges für (bestimmte) Verteilungen (deren unbeschränkter Wertebereich eine Nullmenge ist) zeigen. Bitte frag' mich nicht nach einem Beweis, den habe ich mal vor Jahren gesehen, und da ging es lustig mit Borelmengen umher. Maßtheorie ftw.
Artificial Mind hat geschrieben:4. Dirac-Delta im Computer: wie wärs mit Gaußverteilung mit sigma -> 0 numerisch? :D
Klingt gut. Wenn man dann Importance-Sampling mit einer uniformen Dichtefunktion draufhaut, wunder man sich, warum es nicht klappt: Die Varianz ist nicht definiert (umgangssprachlich könnte man sagen, die Varianz ist unendlich groß). Aber man kann die Monte-Carlo-Integration mit einer genau angepassten Dichtefunktion mit genau einem Sample durchführen, so dass man sofort das korrekte Ergebnis hat: Man nimmt \($f_\text{mirror}$\) als Importance-Funktion, und zieht ein Sample: Genau in Reflexionsrichtung. Das ist Ray-Tracing. Monte-Carlo-Integration mit einem Sample und Importance-Sampling für spekulare Importance-Funktionen ist Raytracing. Es ist somit gar nicht nötig, die Delta-Verteilung fürs Rendering explizit abzubilden.
Artifical Mind hat geschrieben:Könnte man sonst auch den Glossy-Phong-Term mit Specularity -> Infinity nehmen?
Phong ja; Blinn-Phong (mit Halfvector-Term) nein.