Einleitung
Beim Rendern wird hĂ€ufig die Berechnung mehrdimensionaler bestimmter Integrale verwendet: Zum Beispiel, um die Sichtbarkeit von rĂ€umlichen Lichtquellen (FlĂ€chenlicht), die den Pixelbereich erreichende Helligkeit, die ĂŒber einen Zeitraum eintreffende Helligkeit und die durch die Halbkugel eines OberflĂ€chenpunkts eintretende Strahlung zu bestimmen. Die Berechnung dieser Integrale erfolgt ĂŒblicherweise mit Hilfe der Monte-Carlo-Integration, bei der das Integral durch die Erwartung eines stochastischen Experiments ersetzt wird.
In diesem Artikel werde ich detailliert auf den grundlegenden Monte-Carlo-Integrationsprozess sowie auf verschiedene Techniken zur Reduzierung der Varianz der Technik eingehen. Dies erfolgt aus praktischer Sicht - es wird davon ausgegangen, dass der Leser mit der Wahrscheinlichkeitstheorie nicht sehr vertraut ist, aber dennoch effektive und korrekte Rendering-Algorithmen entwickeln möchte.
Definierte Integrale
Ein bestimmtes Integral ist ein Integral der Form
intbaf(x)dx wo
[a,b] Ist ein Segment (oder eine Region),
x - Skalar und
f(x) - eine Funktion, die fĂŒr jeden Punkt im Segment berechnet werden kann. Wie in
Wikipedia geschrieben , ist ein bestimmtes Integral ein Bereich mit einem Zeichen in einer Ebene
x zeitlich begrenzt
f Achse
x und vertikale Linien
x=a und
x=b (
Abbildung 1a ).
Dieses Konzept erstreckt sich logischerweise auf eine gröĂere Anzahl von Dimensionen: FĂŒr ein bestimmtes Doppelintegral wird der
Bereich mit einem Vorzeichen zu einem
Volumen mit einem Vorzeichen (
Abbildung 1b ), und fĂŒr bestimmte Mehrfachintegrale wird es im Allgemeinen zu einem
mehrdimensionalen Volumen mit einem Vorzeichen .
Abbildung 1: Beispiele fĂŒr bestimmte Integrale.In einigen FĂ€llen kann die FlĂ€che beispielsweise
analytisch bestimmt
werden , z
f(x)=2 : auf dem Segment
[a,b] Die FlÀche wird gleich sein
2(bâa) . In anderen FĂ€llen ist eine analytische Lösung beispielsweise unmöglich, wenn wir das Volumen des Teils des Eisbergs ĂŒber dem Wasser ermitteln mĂŒssen (
Abbildung 1c ). In solchen FĂ€llen
f(x) oft kann durch
Stichproben bestimmt werden.
Numerische Integration
Wir können die FlÀche komplexer Integrale durch
numerische Integration nÀherungsweise berechnen. Ein Beispiel ist die
Riemannsche Summe . Dieser Betrag wird berechnet, indem die FlĂ€che in regelmĂ€Ăige Formen (z. B. Rechtecke) unterteilt wird, die zusammen eine FlĂ€che bilden, die einer echten FlĂ€che Ă€hnlich ist. Die Riemannsche Summe ist wie folgt definiert:
tag1S= sumni=1f(xi) Deltaxi
n Ist die Anzahl der Unterintervalle und
Deltaxi= fracbâan - die Breite eines Unterintervalls. FĂŒr jedes Intervall
i wir probieren
f an einem Punkt
xi innerhalb des Unterintervalls (in
Abbildung 2 befindet sich dieser Punkt am Anfang des Unterintervalls).
Abbildung 2: Riemann-Summe.Es ist erwÀhnenswert, dass mit zunehmender
n die Riemannsche Summe konvergiert gegen den realen Wert des Integrals:
tag2 intbaf(x)dx= lim|| Deltax|| bis0 sumni=1f(xi) Deltaxi
Die Riemann-Summe kann auch fĂŒr groĂe Dimensionen verwendet werden (
Abbildung 3 ). Hier haben wir jedoch ein Problem: FĂŒr eine Funktion mit zwei Parametern sollte die Anzahl der Teilintervalle viel gröĂer sein, wenn wir eine Auflösung erreichen wollen, die mit der im zweidimensionalen Fall verwendeten vergleichbar ist. Dieses PhĂ€nomen nennt man den
Fluch der Dimensionen , und in höheren Dimensionen verschÀrft es sich.
Abbildung 3: Riemann-Summe fĂŒr ein Doppelintegral.Nun werden wir die Genauigkeit der Riemann-Summe fĂŒr die folgende Funktion auswerten (wir haben absichtlich eine komplexe Funktion gewĂ€hlt):
tag3f(x)= left| sin left( frac12x+ frac pi2 right) tan fracx27+ sin left( frac35x2 right)+ frac4x+ pi+1â1 right|
Funktionsdiagramm fĂŒr ein Segment
[â2.5,2.5] unten gezeigt. Als Referenz haben wir ein bestimmtes Integral in
Wolfram Alpha berechnet
int2.5â2.5f(x) Bereich bekommen
3.12970 . Die Grafik rechts zeigt die Genauigkeit der numerischen Integration unter Verwendung der Riemann-Summe zur Erhöhung
n .
Abbildung 4: Funktionsgraph und Riemannsche Summengenauigkeit. Auch bei kleinen n Wir erhalten ein ziemlich genaues Ergebnis.Um sich ein Bild von der Genauigkeit zu machen, geben wir die Zahlen ein: z
n=50 der fehler ist
2 times10â3 . Bei
n=100 der fehler ist
3 times10â4 . Die folgende GröĂenordnung ergibt sich mit
n=200 .
Weitere Informationen zu Riemann-BetrÀgen finden Sie in den folgenden Ressourcen:
Monte Carlo (1)
Beim Rendern sind fast keine (und vielleicht ĂŒberhaupt keine?) Integrale
einzeln . Das heiĂt, wir werden schnell auf den Fluch der Dimensionen stoĂen. DarĂŒber hinaus ist das Abtasten einer Funktion in gleichen Intervallen
nicht ausreichend abgetastet und
verzerrt : Es können wichtige Werte der Funktion ĂŒbersprungen oder ungewollte gegenseitige Interferenzen zwischen der abgetasteten Funktion und dem Abtastmuster auftreten (
Abbildung 5 ).
Abbildung 5: Verzerrungen fĂŒhren zum Verlust von Teilen der abgetasteten Funktion (rot) und in diesem Fall zu einer völlig falschen Interpretation der Funktion.Diese Probleme werden mit einer Technik namens
Monte-Carlo-Integration gelöst. Ăhnlich wie bei der Riemann-Summe wird auch bei einer Menge von Punkten eine Funktionsabtastung verwendet, aber im Gegensatz zum
deterministischen Riemann-Summenmuster wird eine grundsÀtzlich
nicht deterministische Zutat verwendet: Zufallszahlen.
Die Monte-Carlo-Integration basiert auf folgender Beobachtung: Das Integral kann durch die
Erwartung eines stochastischen Experiments ersetzt werden:
tag4 intbaf(x)dx=(ba)E left[f(X) right] ungefÀhr fracban sumni=1f(X)
Mit anderen Worten, wir testen die Funktion
n Zeiten an zufĂ€lligen Punkten innerhalb eines Segments (bezeichnet mit einem GroĂbuchstaben)
X ), mittle die Abtastwerte und multipliziere mit der Breite des Segments (fĂŒr eine eindimensionale Funktion). Wie im Fall der Riemannschen Summe, wenn
n bis unendlich konvergiert der Durchschnittswert der Abtastwerte zur Erwartung, dh zum wahren Wert des Integrals.
Ein bisschen Wahrscheinlichkeitstheorie
Es ist wichtig, jedes der hier verwendeten Konzepte zu verstehen. Beginnen wir mit dem
Warten : Dies ist der Wert, der fĂŒr eine einzelne Stichprobe erwartet wird. Beachten Sie, dass dies nicht unbedingt ein
möglicher Wert ist, der möglicherweise nicht intuitiv zu sein scheint. Wenn wir zum Beispiel den WĂŒrfel werfen, ist die Erwartung gleich
3.5 - der Durchschnitt aller möglichen Ergebnisse:
(1+2+3+4+5+6)/6=21/6=3.5 .
Das zweite Konzept sind
Zufallszahlen . Dies mag offensichtlich erscheinen, aber fĂŒr die Monte-Carlo-Integration benötigen wir gleichmĂ€Ăig verteilte Zufallszahlen, d.h. Jeder Wert sollte die gleiche Wahrscheinlichkeit der Erzeugung haben. Wir werden spĂ€ter mehr darĂŒber sprechen.
Das dritte Konzept ist die
Abweichung und die damit verbundene
Varianz . Selbst wenn wir eine kleine Anzahl von Zahlen verwenden, sollten der erwartete Durchschnittswert sowie die Erwartung fĂŒr jede einzelne Stichprobe gleich sein. Bei der Berechnung von
Gleichung 4 erhalten wir jedoch selten einen solchen Wert. Abweichung ist der Unterschied zwischen der Erwartung und dem Ergebnis des Experiments:
XâE(X) .
In der Praxis hat diese Abweichung eine interessante Verteilung:
Dies ist ein Diagramm der
Normalverteilung oder der
GauĂschen Verteilung : Es zeigt, dass nicht alle Abweichungen gleich wahrscheinlich sind. TatsĂ€chlich liegen ungefĂ€hr 68,2% der Proben im Bereich
â1 sigma..1 sigma wo
sigma (Sigma) ist die
Standardabweichung . Die Standardabweichung kann auf zwei Arten beschrieben werden:
- Die Standardabweichung ist ein MaĂ fĂŒr die DatenvariabilitĂ€t .
- 95% der Datenpunkte liegen innerhalb 2 sigma vom Durchschnitt.
Es gibt zwei Methoden, um die Standardabweichung zu bestimmen:
- Standardabweichung sigma= sqrt frac1n sumni=1 left(XiâE left[X right] right)2 : Kann berechnet werden, wenn eine diskrete Wahrscheinlichkeitsverteilung vorliegt und die Erwartung bekannt ist E[X] . Dies gilt fĂŒr WĂŒrfel, in denen X=1,2,3,4,5,6 und E[X]=3.5 . Wenn wir die Zahlen ersetzen, bekommen wir sigma=1.71 .
- Auch die Standardabweichung der Stichproben kann wie folgt berechnet werden sigma= sqrt frac1nâ1 sumni=1 left(XiâX right)2 . Lesen Sie mehr dazu auf Wikipedia .
ĂberprĂŒfen Sie: Ist das richtig? Wenn sigma=1.71 erklĂ€ren wir, dass 68,2% der Proben innerhalb von 1,71 von 3,5 liegen. Wir wissen das 2,3,4,5 dieses Kriterium erfĂŒllen und 1 und 6 - Nein. Vier von sechs sind 66,7%. Wenn unser WĂŒrfel irgendeinen Wert in dem Intervall erzeugen könnte [1..6] Dann wĂŒrden wir genau 68,2% bekommen.
Anstelle der Standardabweichung wird das zugehörige Konzept der
Varianz definiert als
Var left[X right]= sigma2 . Da das Quadrat verwendet wird, ist die Varianz immer positiv, was bei den Berechnungen hilfreich ist.
Monte Carlo (2)
Oben haben wir
Gleichung 3 mit der Riemann-Summe nÀherungsweise berechnet. Nun wiederholen wir dieses Experiment mit der Monte-Carlo-Integration. Denken Sie daran, dass die Monte-Carlo-Integration wie folgt definiert ist:
tag5 intbaf(x)dx=(ba)E left[f(X) right] ungefÀhr fracban sumni=1f(X)
Lassen Sie uns dies in C-Code ĂŒbersetzen:
double sum = 0; for( int i = 0; i < n; i++ ) sum += f( Rand( 5 ) - 2.5 ); sum = (sum * 5.0) / (double)n;
Ergebnis fĂŒr Werte von
n=2 vorher
n=200 in der folgenden Tabelle gezeigt. Daraus ist zu schlieĂen, dass die Monte-Carlo-Integration deutlich schlechter ausfĂ€llt als die Riemann-Summe. Eine genauere Betrachtung des Fehlers besagt, dass mit
n=200 der durchschnittliche Fehler der Riemann-Summe ist
0,0002 und Monte Carlo
0.13 .
Abbildung 6: Monte-Carlo-Fehler bei 2..200 Stichproben.In höheren Dimensionen wird dieser Unterschied verringert, aber nicht vollstÀndig beseitigt. Die unten gezeigte Gleichung ist eine erweiterte Version der oben verwendeten und empfÀngt zwei Parameter:
f(x,y)= left| sin left( frac12x+ frac pi2 right) tan fracx27+ sin left( frac16x2 right)+ frac4x+ pi+1â1 right| left| sin left(1.1y right) cos left(2.3x right) right|(6)
Abbildung 7: Graph der obigen Gleichung.Im Bereich der Definition
xâ[â2,5,2,5],yâ[â2,5,2,5] Volumen durch diese Funktion und Ebene begrenzt
xy ist gleich
6.8685 . Bei
n=400 (20 Ă 20 Abtastwerte) ist der Fehler der Riemannschen Summe
0.043 . Bei der gleichen Anzahl von Abtastwerten betrÀgt der durchschnittliche Monte-Carlo-Integrationsfehler
0,33 . Dies ist besser als das vorherige Ergebnis, aber der Unterschied ist immer noch signifikant. Um dieses Problem zu verstehen, werden wir die bekannte Monte-Carlo-Integrationsdispersionsreduktionstechnik untersuchen, die als "Schichtung" bezeichnet wird.
Abbildung 8: Auswirkungen der Schichtung; a) Proben mit schlechter Verteilung; b) Proben mit gleichmĂ€Ăiger Verteilung.Durch die Schichtung wird die
Einheitlichkeit der Zufallszahlen erhöht. In
8a werden acht Zufallszahlen verwendet, um die Funktion abzutasten. Da jede Zahl zufĂ€llig ausgewĂ€hlt wird, stellt sich heraus, dass sie hĂ€ufig ungleichmĂ€Ăig ĂŒber den Definitionsbereich verteilt sind.
Abbildung 8b zeigt den Effekt der Schichtung: Der Definitionsbereich ist in acht Schichten unterteilt, und in jeder Schicht wird eine zufĂ€llige Position ausgewĂ€hlt, wodurch die GleichmĂ€Ăigkeit verbessert wird.
Der Effekt auf die Varianz ist ziemlich offensichtlich.
9a zeigt eine grafische Darstellung der Ergebnisse mit und ohne Schichtung.
Abbildung 9b zeigt den ungefÀhren Wertefehler. Bei
n=10 Der durchschnittliche Fehler fĂŒr 8 Schichten ist
0.05 ; fĂŒr 20 Schichten -
0.07 und fĂŒr 200 Schichten sinkt es auf

. Aufgrund dieser Ergebnisse scheint es sinnvoll, eine groĂe Anzahl von Streifen zu verwenden. Die Schichtung weist jedoch Nachteile auf, die mit zunehmender Anzahl von Schichten zunehmen. Erstens sollte die Anzahl der Stichproben immer ein Vielfaches der Anzahl der Schichten sein. zweitens leidet die Schichtung wie in der Riemannschen Summe unter dem Fluch der Dimensionen.
Abbildung 9: Schichtung und Varianz: a) ein ungefĂ€hrer Wert fĂŒr die Anzahl der Stichproben von n = 2 bis n = 200; b) Abweichung.Beispiel fĂŒr die Wichtigkeit
In den vorherigen Abschnitten haben wir die Gleichungen gleichmĂ€Ăig abgetastet. Die Erweiterung der
Integrationsfunktion von Monte Carlo ermöglicht es uns, die Situation zu Àndern:
tag7 intbaf(x)dx=(ba)E left[f(X) right] ungefÀhr fracban sumni=1 fracf(X)p(X)
Hier
p(X) Ist eine
Wahrscheinlichkeitsdichtefunktion (pdf) : Sie bestimmt die relative Wahrscheinlichkeit, dass eine Zufallsvariable einen bestimmten Wert annimmt.
FĂŒr eine einheitliche Zufallsvariable im Intervall
0..1 , pdf ist 1 (
Abbildung 10 a), und dies bedeutet, dass jeder Wert die gleiche Wahrscheinlichkeit der Wahl hat. Wenn wir diese Funktion ĂŒber integrieren
[0,0.5] dann bekommen wir die Wahrscheinlichkeit in
0.5 von was
X< frac12 . FĂŒr
X> frac12 Wir haben offensichtlich die gleiche Wahrscheinlichkeit.
Abbildung 10: Wahrscheinlichkeitsverteilungen. a) Konstante pdf, bei der jede Stichprobe die gleiche Wahrscheinlichkeit der Wahl hat; b) pdf, wenn Stichproben unter 0,5 eine höhere Selektionswahrscheinlichkeit haben.Abbildung 10b zeigt ein weiteres PDF. In diesem Fall ist die Wahrscheinlichkeit, eine Zahl zu erzeugen, geringer
frac12 gleich 70%. Dies kann mit dem folgenden Code-Snippet implementiert werden:
float SamplePdf() { if (Rand() < 0.7f) return Rand( 0.5f ); else return Rand( 0.5f ) + 0.5f; }
Dieses PDF ist wie folgt definiert:
\ tag {8} p (x) = \ left \ {\ begin {matrix} 1.4, wenn x <\ frac {1} {2} \\ 0.6, andernfalls \ end {matrix} \ right.
Die zahlen
1.4 und
0.6 reflektieren die Notwendigkeit dieser Wahrscheinlichkeit
x< frac12 war gleich 70%. Bei der Integration von PDF von
[0.. frac12] gibt
1.4 times frac12 und
0.6 times frac12 gleich
0.3 . Dies zeigt eine wichtige Anforderung fĂŒr alle PDFs im Allgemeinen: Das Ergebnis der PDF-Integration
sollte 1 sein. Eine weitere Anforderung ist die folgende
p(x) kann nicht null sein, wenn
f(x) ungleich null: es wĂŒrde bedeuten, dass die teile
f haben eine Stichprobenwahrscheinlichkeit von Null, was sich offensichtlich auf den Wert auswirkt.
Einige Tipps zum VerstÀndnis des PDF-Konzepts:
- Ein PDF-Wert beschreibt nicht die Wahrscheinlichkeit: Daher kann das lokale PDF gröĂer als 1 sein (z. B. wie im gerade untersuchten PDF).
- Das Integral ĂŒber den Definitionsbereich von pdf ist jedoch eine Wahrscheinlichkeit, was bedeutet, dass die Integration von pdf 1 ergibt.
Ein Wert kann als
relative Möglichkeit des Auftretens eines bestimmten Werts interpretiert werden.
Es ist zu bedenken, dass die Normalverteilung eine Wahrscheinlichkeitsverteilungsfunktion ist: Sie gibt uns die Wahrscheinlichkeit, dass sich eine Zufallsvariable in einem bestimmten Intervall befindet. Bei einer Normalverteilung ist diese Zufallsvariable eine Abweichung vom Mittelwert. Wie bei jedem anstÀndigen PDF ist das Ergebnis der Integration der Normalverteilung 1.
Daher können wir mit
Gleichung 7 eine ungleichmĂ€Ăige Abtastung durchfĂŒhren. Sie kompensiert dies, indem sie jede Stichprobe durch die relative Wahrscheinlichkeit ihrer Wahl dividiert. Wie wichtig dies ist, zeigt
Abbildung 11a . Der Funktionsgraph zeigt ein signifikantes Intervall, in dem sein Wert liegt
0 . Das Abtasten in diesem Bereich ist sinnlos: Der Summe wird nichts hinzugefĂŒgt, wir teilen einfach durch eine gröĂere Zahl. Denken Sie an den Eisberg aus
Abbildung 1c : Es macht keinen Sinn, die Höhe in einem groĂen Bereich um den Eisberg zu messen.
Abbildung 11: pdf fĂŒr eine Funktion mit Nullwerten.Ein PDF mit dieser Kenntnis der Funktion ist in
Abbildung 11b dargestellt . Beachten Sie, dass dieses PDF fĂŒr den Wertebereich tatsĂ€chlich Null ist. Dies macht es nicht zu einem falschen PDF: An manchen Stellen ist die Funktion Null. Wir können diese Idee ĂŒber Null hinaus erweitern. Die Proben werden am besten an den Stellen ausgegeben, an denen die Funktion signifikante Werte aufweist. TatsĂ€chlich ist das
ideale PDF proportional zur abgetasteten Funktion . Ein sehr gutes PDF fĂŒr unsere Funktion ist in
Abbildung 12a dargestellt . Ein noch besseres PDF wird in
Abbildung 12b gezeigt . In beiden FĂ€llen dĂŒrfen wir nicht vergessen, es so zu
normalisieren , dass das Integral gleich 1 ist.
Abbildung 12: Erweitertes PDF fĂŒr die Funktion in Abbildung 11.Das PDF in
Abbildung 12 stellt uns vor zwei Aufgaben:
- Wie erstelle ich ein solches PDF?
- wie man ein solches pdf probiert?
Die Antwort auf beide Fragen ist die gleiche:
Wir brauchen das nicht zu tun. In vielen FĂ€llen ist die Funktion, die wir integrieren möchten, unbekannt, und die einzige Möglichkeit, die Stellen zu bestimmen, an denen sie von Bedeutung ist, besteht darin, sie abzutasten. Dazu benötigen wir PDF-Dateien. klassische Situation von "HĂŒhnchen und Eiern".
In anderen FÀllen haben wir jedoch eine ungefÀhre Vorstellung davon, wo die Funktion höhere Werte oder Nullwerte liefern kann. In solchen FÀllen ist ein sehr raues PDF oft besser als kein PDF.
Möglicherweise haben wir auch die Möglichkeit, PDFs im laufenden Betrieb zu erstellen. Einige Beispiele geben eine Vorstellung von der Form der Funktion, und auf deren Grundlage richten wir die nachfolgenden Beispiele an die Stellen, an denen wir hohe Werte erwarten, die wir zur Verbesserung von PDF-Dateien usw. verwenden.
Im nÀchsten Artikel wenden wir diese Konzepte auf die Rendering-Implementierung an. Eine ernsthafte Herausforderung ist das Erstellen von PDF. Wir untersuchen mehrere FÀlle, in denen pdfs bei der Stichprobenauswahl hilfreich ist.