Grundlagen der sphärischen Harmonischen
Sphärische Harmonische ist eine Möglichkeit, eine 2D-Funktion auf einer Kugeloberfläche darzustellen. Anstelle des räumlichen Bereichs (wie der Cubemap) wird SH im Frequenzbereich mit einigen interessanten Eigenschaften und Operationen definiert, die für die Beleuchtung relevant sind und effizient ausgeführt werden können. Mit zunehmender "Reihenfolge" von SH können Sie höhere Frequenzen (Details) von Funktionen darstellen, wie in der folgenden Abbildung dargestellt ( ist die SH-Reihenfolge). Durch Skalieren und Summieren der folgenden "Basisfunktionen" können Sie jede Art von 2D-Funktion auf der Kugel bis zu der durch die Funktionen definierten Frequenz darstellen. Die Basisfunktionen werden mit " zugehörigen Legendre-Polynomen " definiert, aber normalerweise müssen Sie diese nicht selbst ableiten, sondern können vorhandene Ableitungen für echte sphärische Harmonische verwenden .
l
Eine solche Operation, die in SH effizient durchgeführt werden kann, heißt " Faltung ", was bedeutet, dass das Produkt zweier sphärischer 2D-Funktionen über eine Kugel integriert wird. Dies ist eine häufige Operation bei Beleuchtungsberechnungen, z. B. könnte eine der Funktionen Ihre Auflichtbeleuchtung und eine der Funktionen die BRDF sein. Wenn diese Operation als SH dargestellt wird, ist sie einfach das Skalarprodukt zweier SH-Koeffizientenvektoren.
Ein weiterer interessanter Vorgang ist die Fähigkeit, eine effiziente Tiefpassfilterung durchzuführen. Da SH im Frequenzbereich dargestellt wird, müssen lediglich einige der SH-Koeffizienten skaliert oder auf Null gesetzt werden. Andererseits können einige andere Operationen in SH im Vergleich zum räumlichen Bereich schwierig durchzuführen sein. Wenn Sie beispielsweise die als SH dargestellte Funktion drehen möchten, kann dies für SH höherer Ordnung recht teuer werden. Es hängt also wirklich vom Problem ab, ob es für die Ausführung in SH geeignet ist oder nicht.
SH wird im Allgemeinen verwendet, um nur niederfrequente Funktionen (dh sich sanft ändernde Funktionen) darzustellen, da höhere Frequenzen eine Erhöhung der Speichermenge (SH-Koeffizienten) und der Verarbeitung erfordern. Aus diesem Grund wird SH beispielsweise nicht verwendet, um Spiegelungen auf glänzenden Oberflächen zu ersetzen. Es gibt auch zonale sphärische Harmonische , die verwendet werden können, um die Speicherung und Berechnung für 2D-Funktionen, die rotationssymmetrisch zur z-Achse sind, zu reduzieren, indem nur diagonale Elemente der SH-Koeffizientenmatrix gespeichert werden. Auch Hemisphärische Harmonics kann verwendet werden , wenn Sie mit hemisphärischen Funktionen müssen befassen (auch gemeinsam in der Beleuchtung) mit dem Vorteil, dass sie mit weniger Koeffizienten ähnliche Frequenzen wie SH darzustellen.
Eine Operation, die Sie ebenfalls ausführen müssen, ist die "SH-Projektion", um räumliche Domänendaten in SH zu transformieren. Sie können diese Operation ausführen, indem Sie eine Faltung von räumlichen Domänendaten mit SH-Basisfunktionen durchführen. Eine interessante Eigenschaft von SH ist, dass SH im Gegensatz zu räumlichen Domänendarstellungen nicht unter einem Aliasing leidet, sodass Sie auch dann keine Aliasing-Artefakte haben, wenn Sie auf SH sehr niedriger Ordnung projizieren.
Lichtsonden
Nachdem Sie die grundlegenden Operationen und Eigenschaften von SH verstanden haben, können wir überlegen, wie Sie sie auf GI anwenden können. Eine Lichtsonde zeichnet auf, wie viel Licht aus jeder Richtung zu dem Punkt kommt, an dem sich die Sonde befindet. Dies ist eine 2D-Funktion auf einer Kugel und kann als SH (oder 3-SH-Funktion für Rot, Grün und Blau) dargestellt werden. Abhängig von der Menge der Beleuchtungsdetails, die wir in die Sonden codieren möchten, können wir die SH-Reihenfolge auswählen.
Für Lichtsonden, die nur für diffuses Lambert'sches Licht verwendet werden, ist eine SH niedriger Ordnung ausreichend, da die Faltung mit einer Kosinuskeule durchgeführt wird, die mit SH 2 (9 Koeffizienten) dargestellt werden kann. Die SH-Koeffizienten für Lichtsonden können einfach durch Rendern einer Cubemap am Punkt der Sonde und anschließendes Projizieren auf SH generiert werden.
Beim Rendern der Geometrie werden nur wenige nächstgelegene Lichtsonden genommen und deren Ergebnisse interpoliert, um die einfallende Beleuchtungsfunktion an einem Punkt im Raum zu erhalten. Dies kann zum Beispiel durch direktes Interpolieren der SH-Koeffizienten benachbarter Sonden und anschließendes Durchführen der Faltung mit einer pixelnormalen Kosinuskeule im SH-Bereich erfolgen.
Sphärische Harmonische
Wenn Sie nicht wissen, was eine Fouriertransformation ist, müssen Sie das erst wissen, bevor Sie die sphärischen Harmonischen verstehen können. Mit der Fourier-Transformation können Sie ein Signal als eine Reihe von Sinus- und Cosinuswellen mit jeweils der doppelten Frequenz der letzten darstellen. Das heißt, Sie können das Signal als Durchschnitt plus eine Sinuswelle, deren Wellenlänge der Länge des Signals entspricht, plus eine Sinuswelle, die doppelt so lang ist wie diese Wellenlänge usw. darstellen. Da Sie durch die Fourier-Transformation auf diese bestimmten Wellenlängen festgelegt werden, müssen Sie nur die Amplitude der einzelnen Wellenlängen aufzeichnen.
Wir verwenden häufig Fourier-Transformationen, um Bilder darzustellen, bei denen es sich nur um digitale 2D-Signale handelt. Dies ist nützlich, weil Sie einige der Sinuswellen wegwerfen (oder die Genauigkeit verringern können, mit der Sie ihre Amplitude speichern), ohne das Bild für das menschliche Auge wesentlich zu verändern. OTOH, das Wegwerfen von Pixeln verändert das Aussehen des Bildes erheblich.
Wenn Sie in einem abgetasteten Signal wie einem Bild die gleiche Anzahl von Sinuswellen verwenden, wie es Samples (Pixel) im Originalbild gab, können Sie das Bild exakt rekonstruieren. Wenn Sie also anfangen, Frequenzen wegzuwerfen, erstellen Sie das Bild weniger Speicherplatz in Anspruch nehmen.
Sphärische Harmonische sind wie Fourier-Transformationen, verwenden jedoch anstelle von Sinuswellen eine sphärische Funktion, sodass sie anstelle von linearen Funktionen (z. B. Bilder) Funktionen darstellen können, die auf der Kugel definiert sind (z. B. Umgebungskarten).
Lichtsonden
So wie ein Standardbild das gesamte Licht aufzeichnet, das einen bestimmten Punkt in der Bildebene erreicht, zeichnet eine Lichtsonde das gesamte Licht auf, das aus allen Richtungen einen bestimmten Punkt erreicht. Sie kamen zuerst aus Filmeffekten heraus. Wenn Sie einer realen Szene ein computergeneriertes Objekt hinzufügen möchten, müssen Sie in der Lage sein, das synthetische Objekt mit der realen Beleuchtung zu beleuchten. Dazu müssen Sie wissen, welches Licht den Punkt in der Szene erreicht, an dem sich das synthetische Objekt befindet. (Hinweis: Obwohl ich "Beleuchtung" sage, zeichnen Sie ein Bild des gesamten Lichts auf, sodass es auch für Reflexionen verwendet werden kann.)
Da Sie keine Kamera mit einer sphärischen Linse haben können, die das gesamte Licht aufzeichnet, das aus allen Richtungen einen einzelnen Punkt erreicht, nehmen Sie dies auf, indem Sie normale Fotos von einem sphärischen Spiegel machen und die Bilder dann auf eine Kugel projizieren.
Außerhalb von Filmeffekten ist es üblicher, Lichtsonden zu verwenden, die aus einer künstlichen Szene generiert wurden. Stellen Sie sich vor, Sie haben einen teuren Algorithmus zum Berechnen der globalen Beleuchtung (GI) in einer Szene und Sie haben auch einige kleinere Objekte, die sich in dieser Szene bewegen (z. B. ein Spiellevel mit Spielern darin). Sie können den gesamten GI-Algorithmus nicht jedes Mal ausführen, wenn sich ein Objekt bewegt. Sie führen ihn also einmal mit der statischen Szene aus und speichern Lichtsonden, die an verschiedenen Punkten in der Ebene aufgenommen wurden. Dann können Sie eine gute Annäherung an den GI erhalten, indem Sie den Player mit der Lichtsonde beleuchten, die ihm am nächsten liegt.
Gemeinsam nutzen
Im Allgemeinen möchten Sie ohnehin scharfe Kanten in Ihrer globalen Beleuchtung herausfiltern, damit Sie diese so darstellen können, dass sie kompakt sind und Sie problemlos hohe Frequenzen wegwerfen können. Darin sind sphärische Harmonische wirklich gut! Deshalb werden Sie diese beiden Begriffe oft zusammen hören.
Sie berechnen Lichtsonden mit Ihrem teuren GI-Algorithmus - normalerweise im Level-Design-Tool oder vielleicht einmal pro Sekunde (statt einmal pro Frame), wenn Sie Ihre dynamischen Objekte einbeziehen möchten. Sie speichern diese kostengünstig mit sphärischen Harmonischen - 16 Floats reichen für eine ziemlich hochwertige Beleuchtung, aber keine Reflexionen. Dann wählen Sie für jedes dynamische Objekt, das Sie beleuchten möchten, die nächste Lichtsonde aus (oder interpolieren mehrere linear) und verwenden sie als einheitliche oder konstante Eingabe für Ihren Shader. Es ist auch üblich, sphärische Harmonische zur Darstellung von Umgebungsokklusionsdaten zu verwenden, und es ist sehr billig, diese mit der Lichtsonde zu falten, obwohl die rotierenden sphärischen harmonischen Funktionen etwas komplexer sind.
quelle
Sphärische Harmonische
Angenommen, Sie haben einige Daten in einem Array, möchten diese Daten jedoch mit einer geringeren Anzahl von Bytes darstellen.
Eine Möglichkeit, dies zu tun, könnte darin bestehen, die Daten als Funktion anstelle der Rohwerte auszudrücken.
Das Problem ist, dass eine lineare Gleichung wahrscheinlich eine schlechte Annäherung an Ihre Daten darstellt.
Wir haben die Speicherkapazität und die rechnerische Komplexität beim Speichern und Abrufen Ihrer Daten im Vergleich zur linearen Gleichung erhöht, aber es ist eine bessere Annäherung an Ihr Datenarray. Wir könnten es auch auf eine kubische Funktion oder höher bringen. Das Erhöhen der Reihenfolge erhöht die Speicherung, Berechnung und Genauigkeit.
Genau wie in den obigen Beispielen können Sie eine Funktion für sphärische Harmonische niedrigerer Ordnung verwenden, um etwas mit geringerem Speicherbedarf und geringerer Berechnung der Daten, aber auch mit geringerer Genauigkeit zu erstellen.
Auf der anderen Seite können Sie die Reihenfolge erhöhen und eine bessere Annäherung an Ihre ursprünglichen Daten erzielen, allerdings auf Kosten von mehr Speicherplatz und mehr Rechenaufwand für die Berechnung eines Datenpunkts.
Im Extremfall können Sie so viele sphärische harmonische Terme verwenden, wie Sie Samples in Ihrem Array hatten, und dann können Sie Ihr ursprüngliches Array genau rekonstruieren, aber Sie müssen viel Rechenaufwand aufbringen, um dies zu tun, und Sie verwenden genauso viel Speicherplatz wie du angefangen hast mit.
Aus diesem Grund bieten Funktionen für sphärische Harmonische in der Praxis keinen großen Vorteil, wenn Sie feine Details darstellen müssen - wie eine scharfe Reflexion auf einer Kugel -, aber sie können für Daten, die keine feinen Details aufweisen, günstig sein (Daten, die keine feinen Details aufweisen) haben nicht viel hochfrequenten Inhalt). Sie sind auch nützlich für Frequenzbereichsberechnungen wie Spektralanalyse oder Faltung.
Eine der Daten, die sie gut speichern können, ist die "Bestrahlungsstärke", dh die Lichtmenge, die aus anderen Richtungen auf einen Punkt auftrifft. Es sieht in der Regel etwas verschwommen aus, was bedeutet, dass es nur einen niedrigen Frequenzgehalt hat und ein guter Kandidat für die Speicherung in einer Funktion für sphärische Harmonische ist.
Ich überlasse die Erklärung der Lichtsonden einer anderen Person: p
quelle