球面調和関数と光プローブとは何ですか?


13

球面調和関数光プローブとは何ですか?コンピュータグラフィックスではどの程度役立ちますか?彼らは正確に何をしますか?siggraphのプレゼンテーションからブログの投稿まで、どこでも球面調和関数と光プローブという言葉を聞いたことがあります。

最近、Matt Pettineo がそれらについて6部構成のブログシリーズを投稿しましたが、それが何であるかはまだわかりません。

環境照明を改善する別の方法ですか?

回答:


11

球面調和関数の基礎

球面調和関数は、球の表面の2D関数を表す方法です。空間領域(キューブマップなど)の代わりに、SHは周波数領域で定義され、効率的な実行が可能な照明に関連するいくつかの興味深いプロパティと操作を備えています。SHの「次数」を増やすと、次の図に示すように、関数のより高い頻度(詳細)を表すことができます(はSH次数です)。以下の「基底関数」をスケーリングして合計することにより、関数で定義された周波数まで、球上の任意の種類の2D関数を表すことができます。基底関数は「関連付けられたルジャンドル多項式」で定義されますが、通常は自分でこれらを導出する必要はありませんが、実際の球面調和関数の既存の導出を使用できます。 lここに画像の説明を入力してください

SHで効率的に実行できるこのような操作の1つは「畳み込み」と呼ばれます。これは、2つの球面2D関数の積を球体上で積分することを意味します。これは照明計算の一般的な操作です。たとえば、関数の1つは入射照明であり、1つの関数はBRDFです。SHとして表される場合、この演算は2つのSH係数ベクトルのドット積です。

もう1つの興味深い操作は、効率的なローパスフィルタリングを実行する機能です。SHは周波数領域で表されるため、これは単にSH係数のスケーリングまたはゼロ化の問題です。一方、空間領域に比べて他の操作はSHで実行するのが難しい場合があります。たとえば、SHとして表される関数を回転させたい場合、高次のSHではかなりのコストがかかります。したがって、SHでの実行に適しているかどうかは、実際に問題に依存します。

通常、SHは低周波数関数(つまり、滑らかに変化する関数)のみを表すために使用されます。これは、周波数が高くなると、ストレージ(SH係数)と処理の量が増加するためです。これが、たとえば、光沢のある表面の鏡面反射を置き換えるためにSHが使用されていない理由です。また、Zonal Spherical Harmonicsもあります。これは、SH係数行列の対角要素を保存するだけで、z軸を中心に回転対称の2D関数の保存と計算を削減するために使用できます。また、半球関数(照明でも一般的)のみを処理する必要がある場合は、半球ハーモニクスを使用して、より少ない係数でSHと同様の周波数を表すことができるという利点があります。

実行する必要がある操作の1つは、空間ドメインデータをSHに変換する「SH投影」です。この操作は、SH基底関数を使用して空間領域データの畳み込みを実行することで実行できます。SHの興味深い特性は、空間ドメイン表現とは異なり、SHはエイリアシングの影響を受けないため、非常に低次のSHに投影する場合でもエイリアシングアーティファクトがないことです。

光プローブ

SHの基本的な操作とプロパティを理解したので、それらをGIに適用する方法を考えることができます。光プローブは、あらゆる方向からプローブが配置されているポイントまでの光の量を記録します。これは球上の2D関数であり、SH(または赤、緑、青の場合は3 SH関数)として表すことができます。プローブにエンコードする照明の詳細の量に応じて、SH順序を選択できます。

ランバート拡散照明にのみ使用されるライトプローブの場合、畳み込みは2次SH(9係数)で表すことができるコサインローブで実行されるため、非常に低次のSHで十分です。光プローブのSH係数は、プローブのポイントでキューブマップをレンダリングし、それをSHに投影するだけで生成できます。

ジオメトリをレンダリングする場合、最も近いライトプローブはほとんど取得されず、その結果は補間されて、空間内のポイントで入射ライティング機能を取得します。これは、たとえば、近くのプローブのSH係数を直接補間してから、SHドメインのピクセル法線方向のコサインローブで畳み込みを実行することによって実行できます。


シンプルな画像ベースの照明よりもこの方法を使用する利点は何ですか?
アルジャンシン

キューブマップを使用するよりも、同じようなストレージ要件とパフォーマンス要件を備えた低品質の低周波照明を使用できます。
JarkkoL

15

球面調和関数

fバツfθϕ

フーリエ変換が何かわからない場合は、球面調和関数を理解する前に知る必要があります。フーリエ変換を使用すると、信号を一連の正弦波と余弦波として表現でき、それぞれが最後の2倍の周波数を持ちます。つまり、信号をその平均値、プラス信号の長さと同じ波長の正弦波、プラスその波長の2倍の正弦波などとして表すことができます。フーリエ変換によりこれらの特定の波長に固定されるため、各波長の振幅のみを記録する必要があります。

通常、フーリエ変換を使用して画像を表しますが、これは単なる2Dデジタル信号です。正弦波の一部を捨てる(または振幅を保存する精度を下げる)ことができるため、画像が人間の目にどのように見えるかを大幅に変更することなく便利です。ピクセルを捨てると、画像の見た目が大きく変わります。

画像のようなサンプリングされた信号で、元の画像にサンプル(ピクセル)があったのと同じ数の正弦波を使用すると、画像を正確に再構築できるため、周波数を捨て始めると、画像の保存容量が少なくなります。

球面調和関数はフーリエ変換に似ていますが、正弦波の代わりに球面関数を使用するため、線形関数(画像など)の代わりに、球体で定義された関数(環境マップなど)を表すことができます。

光プローブ

標準画像が画像平面を通過して特定のポイントに到達するすべての光を記録する方法と同様に、ライトプローブはすべての方向から特定のポイントに到達するすべての光を記録します。彼らは最初に映画の効果から出てきました。コンピューターで生成されたオブジェクトを現実世界のシーンに追加する場合は、現実世界の照明で合成オブジェクトを照らすことができる必要があります。そのためには、合成オブジェクトが存在するシーンのポイントに到達する光を知る必要があります。(注:「照明」と言いますが、すべての光の画像を記録しているので、反射にも使用できます。)

すべての方向から単一のポイントに到達するすべての光を記録する球面レンズを備えたカメラを使用することはできないため、球面ミラーの通常の写真を撮影し、画像を球体に再投影することでこれを記録します。

映画の効果以外では、人工的なシーンから生成された光プローブを使用するのがより一般的です。シーン内のグローバルイルミネーション(GI)を計算するための高価なアルゴリズムがあり、このシーン内で動き回る小さなオブジェクト(プレイヤーがいるゲームレベルなど)もあるとします。オブジェクトが移動するたびにGIアルゴリズム全体を実行することはできないため、静的シーンで1回実行し、レベルのさまざまなポイントで取得したライトプローブを保存します。次に、プレイヤーに最も近いライトプローブでプレイヤーを照らすことで、GIを適切に近似できます。

それらを一緒に使用する

一般に、グローバルイルミネーションの鋭いエッジをフィルターで除外するため、コンパクトで高周波数を簡単に捨てることができるエッジを表現する方法が必要です。それは球面調和関数が本当に得意なことです!そのため、これらの2つの用語がよく一緒に使用されます。

高価なGIアルゴリズムを使用してライトプローブを計算します-通常はレベル設計ツールで、または動的オブジェクトを含める場合は1秒に1回(フレームごとに1回ではなく)。これらを球面調和関数で安価に保存します。16個のフロートは、非常に高品質の照明には十分ですが、反射には十分ではありません。次に、照明したい動的オブジェクトごとに、最も近いライトプローブを選択し(またはいくつかを一緒に線形補間します)、シェーダーへの均一または一定の入力として使用します。また、アンビエントオクルージョンデータを表すために球面調和関数を使用することも一般的であり、それをライトプローブと畳み込むことは非常に安価です。


素晴らしい答えは、これが本当にすべてを明らかにした!したがって、基本的にライトプローブは、移動するキャラクターの照明を計算する簡単な方法であり、シーン全体のGIを再計算することを防ぎます。一方、球面高調波は、高周波を除去するために使用されます。(間違っている場合は修正してください。正しい理解があるかどうかを確認しようとしています)。
アルジャンシン

「元の画像にサンプル(ピクセル)があったのと同じ数の正弦波を使用すると、画像を正確に再構成できます」が、実際はそうではありません。たとえば、正確な表現のために方形波には無限の数の周波数が必要です
-JarkkoL

@JarkkoL確かに、真の矩形波はそうです。ただし、サンプリングによって離散化した場合は、サンプリングエラーよりも誤差を小さくするために必要なのは同じ数の周波数だけです。これはナイキストの定理の便利な結果です(サンプリングされた信号に存在する最高周波数はサンプルレートの半分です)。
ダンハルム

ああ、もちろん、それは本当です。半分の周波数が必要ですが、複雑な(実際の)周波数領域の結果が必要だと思います。または、DFTの2倍の周波数でDCTと実ドメインを使用します。
JarkkoL

5

球面調和関数

配列にデータがあるが、そのデータをより少ないバイト数で表現したいとします。

その方法の1つは、生の値ではなく関数としてデータを表現することです。

y=ax+b

ab

問題は、線形方程式はおそらくデータの近似値としては不十分だということです。

y=aバツ2+bバツ+c

ababc

線形方程式と比較して、メモリストレージを増やし、データの保存と取得の計算の複雑さも増しましたが、データの配列へのより良い近似です。また、3次関数以上にすることもできます。順序を増やすと、ストレージ、計算、精度が向上します。

fバツ

上記の例のように、低次の球面調和関数を使用して、ストレージが少なく、データを計算する計算が少ないものを作成できますが、精度も低くなります。

一方、順序を増やして元のデータにより近い近似値を得ることができますが、必要なストレージスペースが増え、データのポイントを計算するためにより多くの計算が必要になります。

極端な場合、配列内のサンプルと同じ数の球面調和項を使用でき、元の配列を正確に再構築できますが、それを行うために多くの計算を費やし、同じくらいのストレージスペースを使用していますあなたが始めたように。

このため、実際には、球面調和関数は、球体の鋭い反射のように、細かいディテールを表す必要がある場合にはあまりメリットがありませんが、細かいディテールを持たないデータ(高周波コンテンツはあまりありません)。また、スペクトル解析や畳み込みなどの周波数領域計算を行うのにも役立ちます。

彼らが保存するのが得意なデータの1つは、「放射照度」です。これは、他の方向からポイントに当たる光の量です。それは少しぼやけているように見える傾向があります。つまり、低周波数成分のみを持ち、球面調和関数に保存するのに適した候補です。

ライトプローブの説明は他の人に任せます:p


なぜ反対票なのか?:P
アランウルフ

球面調和関数が細かいディテールを表現するのが得意ではないのは事実ではありません。フーリエ変換と同様に、すべての周波数を維持すると、元の信号を正確に再構築できます。必要のない場合に高周波を捨てることで、スペースを節約しやすくするだけです。
ダンハルム

申し訳ありませんが、票を投じた後、それ以外の有用な回答で疑わしい申し立てを1つも断言するのは厳しいと思いましたが、私は再考するまでに票を固定しました。
ダンハルム

あ。ええ、多項式でデータセットを表すことができるのと同じ方法で可能ですが、実際には、どちらも多くのデータポイントに密接に適合させる必要があるため、悪い選択です。多項式では、たとえばN個のデータポイントに正確に適合するためにN次関数のN個の項が必要です。これは、データポイントを取得するためのルックアップではなく計算であるため、単なる配列よりも悪い選択になります。同様に、実用的には、球面調和関数は、保持したい高周波成分を含む球面データには不適切な選択です。これらの状況では適切な選択ではありません。
アランウルフ

個々のサンプルを再構築できるようにしたい場合、それは真実ですが、フーリエのすべての使用がそれを必要とするわけではありません。畳み込みを行う場合は、サンプルに戻す前に周波数領域で行う方がはるかに安価です。私が自分の答えを終えた後、あなたの答えでこのことをより明確にするために編集を提案してくれませんか?
ダンハルム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.