BRDF für Reflektion [Solved]

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

BRDF für Reflektion [Solved]

Beitrag 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.
Zuletzt geändert von Artificial Mind am 10.04.2012, 19:47, insgesamt 3-mal geändert.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: BRDF für Reflektion

Beitrag 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?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
waigie
Beiträge: 82
Registriert: 20.05.2009, 19:37

Re: BRDF für Reflektion

Beitrag von waigie »

Ich denke nicht, aber ich hab das gleiche Problem. Opera mag die Latexformeln nicht darstellen, mit Chrome geht es.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: BRDF für Reflektion

Beitrag von Artificial Mind »

Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: BRDF für Reflektion

Beitrag 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...
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: BRDF für Reflektion

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
MadMax
Beiträge: 59
Registriert: 24.01.2003, 13:31
Kontaktdaten:

Re: BRDF für Reflektion

Beitrag von MadMax »

imho einfach BRDF = δ(ω-ωreflect)
MadMax
Beiträge: 59
Registriert: 24.01.2003, 13:31
Kontaktdaten:

Re: BRDF für Reflektion

Beitrag von MadMax »

damit kann man dann auch sehr schön aus der alg. rendering gleichung den Raytracing Algo. herleiten.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: BRDF für Reflektion

Beitrag 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
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: BRDF für Reflektion

Beitrag 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.
Zuletzt geändert von eXile am 11.04.2012, 21:54, insgesamt 4-mal geändert.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: BRDF für Reflektion

Beitrag 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?
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: BRDF für Reflektion

Beitrag 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.
Antworten