物理ベースレンダリング-球面調和基底に基づくリアルタイムのグローバルイルミネーション


この記事の主な内容であるPRTを紹介する前に、まずゲームエンジンレンダリングパイプラインでよく見られる一つのステップであるIBLを紹介します。Disneyは、2012 Siggraphカンファレンスで公開されたPBR courseで、レンダリング結果をよりリアルにするためにPBRレンダリングパイプラインにIBL（Image Based Lighting）を追加したと述べました。現在、IBLはPBRレンダリングパイプラインのほぼ不可欠な部分になっています（たとえば、多くのエンジンはSkyBoxを環境光スタンプとして提供するか、シーンの環境光スタンプを取得するためのサンプリングツールを提供し、このスタンプを使用してシーンの物体をレンダリングします。）。

IBLとは何ですか？なぜそれを使用する必要がありますか？実際、初期のリアルタイムレンダリングでは、方向光を使用して無限の太陽光をシミュレートし、光源を使用して近くのライトをシミュレートしました。しかし実際には、物体がシーン内にある場合、物体はすべての方向からの入射光によって照らされます。これらの入射光は、光源から取得するだけでなく、物体の表面の拡散反射、鏡面反射、屈折、さらには霧の中の散乱光からも取得できます。四方八方からのリアル的な入射光をシミュレートするために、IBLのアイデアは次のとおりです：シーン内の物理が閉じた立方体に囲まれていると仮定すると、シーン内でそれに当たる光は必ず、立方体の6つの面からに違いない。物体の周囲のシーンを6つの面にレンダリングして入射光にすれば、これらの6つの面は、光源、物体表面反射、霧の散乱などからのあらゆる種類の光をカバーします。

IBLは、実際に撮られた環境光スタンプを入射光として使用するため、実際の環境で物体がどのように照らされるかをより現実的にシミュレートできます。ただし、このアルゴリズムでは、立方体の環境スタンプをサンプリングし、環境スタンプのすべての方向からの入射光から物体の照明情報を計算する必要があります。このプロセスは非常に時間がかかり、GPUの並列処理でさえもリアルタイム完了できません。したがって、入射光と半球表面の材質の畳み込み計算を球面調和関数（Spherical Harmonic Function、SHと略称）の内積に変換して、リアルタイム計算のコストを削減することを提案しました。本日紹介する論文はIBLに基づいており、これに基づいてグローバルイルミネーションを導入し、リアルタイムのグローバルイルミネーションの効果を実現しています。

この記事は、2002年のSiggraphカンファレンスでPeter-PikeSloanが発表した論文です。グローバルイルミネーション計算にある不変の事前計算を保存し、リアルタイムレンダリング中に変更された部分を計算するだけでよい事前計算方法を提案します。これにより、リアルタイムレンダリングの時間コストが大幅に削減されます。この論文のアルゴリズムは、リアルタイムのグローバルイルミネーションを実現する最初のレンダリングアルゴリズムであり、その後、有名なPRT（Precomputed Radiance Transfer）である研究が盛んになってきます

次の図に示すように、まずこの論文のレンダリング結果を見てみましょう。
![物理ベースレンダリング-球面調和基底に基づくリアルタイムのグローバルイルミネーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4658c058-dd2a-5e97-871b-cd0a80a6c11a.png)



その中で、左図はグローバルイルミネーションなしの結果であり、右図はグローバルイルミネーションありの結果です。左側と右側を比較すると、右図にAO（AmbientOcclusion）が追加されているため、右側のモデルサーフェスのくぼんだ部分が左側よりも暗いことがわかります。同時に、右の図は、表面の多重反射照明の計算も追加しています。これらの効果はリアルタイムで計算されますが、モンテカルロレイトレーシング、ラジオシティ、マルチパスポイントライトなどの従来のグローバルイルミネーションアルゴリズムでは実現できません。

グローバルイルミネーション効果をリアルタイムでレンダリングするには、3つの難点があります。1）複雑なBRDFをシミュレートする必要がある、2）入射光の半球積分を計算する必要がある、3）オクルージョンを計算する必要がある。物体の表面に多重反射がある。
この論文の著者は、これらの複雑な照明計算プロセスを光伝達関数（Transfer Function）と見なし、入射光情報を関数の入力と見なしています。また、球面調和関数、光線伝達の線形性と事前計算を使用して、入射光が物体間での多重反射という複雑な計算を、簡単で高速な内部積計算に変更ます。著者は低次の球面調和関数を使用して表示しているため、低周波の照明情報のみが考慮されます（環境光のスタンプはあまり変化しません）。 PRTアルゴリズムのフローチャートを次の図に示します。

![Blog-Study_PRT-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/86fbb20a-8d98-5e95-feeb-5d318f7afd04.png)


上図はDiffuse材質のフローチャート、下図はGlossy材質のフローチャートです。上図からわかるように、PRTアルゴリズムは最初に環境光スタンプをSHに投影し、SH係数ベクトルを計算します。次に、オフライングローバルイルミネーションアルゴリズムを使用して物体のグローバルイルミネーションをシミュレートし、伝達関数を計算します。また、伝達関数をSHに投影して、係数ベクトルを取得します。最後に、リアルタイム計算では、物体の表面の光は、光のSH係数ベクトルと事前に計算された伝達関数のSH係数ベクトルの内積をとることによって計算できます。Diffuse材質は視線の方向に依存しないため、伝達関数は1つのベクトルだけで表せます。ただし、Glossy材質の場合、異なる視点から物体の表面の同じ点を観察するには、異なる照明を持ちます。したがって、Glossy材質の伝達関数は、異方向の視線次元を増やしてマトリックスにする必要があります。リアルタイム計算では、Diffuseと同じように、光ベクトルに伝達関数行列を掛けて、伝達された入射光ベクトルを取得します。次に、このベクトルを物体材質BRDFと畳み込み、すべての方向の反射光を表すベクトルを取得します。最後に、このベクトルから、視線の方向の反射光線が計算されます。次に、本稿の主な内容をご紹介します。

---

## 一、球面調和基底関数の紹介

PRTアルゴリズムは、重要な数学的ツールである球面調和基底関数を利用します。SHは、フーリエ変換が1次元変数で定義され、SHが2次元球面で定義されることを除いて、フーリエ変換に似ています。レンダリング方程式の積分は2次元球面の方向に定義されるため、SHはレンダリング方程式の計算問題を解決するのに非常に適しています。同様に、2次元球面で定義された関数は、SH基底関数と係数で近似できます。lとmを使用してSHの2つのパラメーターを表す場合、f（s）は球で定義された関数であり、ylmは基底関数である場合、SHでのf（s）の投影係数は次のように表すことができます。

![Blog-Study_PRT-GS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ab5f82ad-f917-64f1-ad25-a8d4a65848ff.png)


f（s）は、おおよそ次のように表すことができます。
![Blog-Study_PRT-GS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/cd317353-1b37-56ba-3677-27a1358b017d.png)



PRTは、SHの2つの特性、1）回転不変性と2）直交性を利用します。回転不変性により、環境光スタンプをSHに投影した後、物体の表面に対する任意の法線方向を回転してサンプルできます。直交性は、球面で定義された任意の2つの関数について、畳み込み計算を対応するSH係数の内積に変換できることを保証します。

---
## 二、伝達関数の紹介

### 2.1 Diffuse材質
物体の表面での多重反射を考慮せずに、材質がDiffuseである物体Oの場合、その表面上の点p∈Oでのレンダリング方程式は次のように表すことができます。

![Blog-Study_PRT-GS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/b148ef2b-f8a1-5848-ae8a-37a673fe31ae.png)


このうち、HNP（s）= max（Np。s、0）は余弦項、Npはp点の法線方向、ρpはp点の色、Lpは入射光、可視性関数Vp（s）→{0,1}、オクルージョンされている場合は0を取り、それ以外の場合は1を取ります。したがって、伝達関数MpDSは次のように表すことができます。

![Blog-Study_PRT-GS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4dc6a464-13e0-b3b8-cd36-5b2b49e36885.png)


その中で、LpとMpはそれぞれSHに投影され、TDSの積分計算はSH係数ベクトルの内積になります。
物体の表面での複数の反射を考慮する場合、点pのレンダリング方程式は次のように表すことができます。

![Blog-Study_PRT-GS5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6a3d763a-8299-6434-084f-c5a524fd0bf5.png)


ここで、L'P（s）は、s方向から点pに入射する物体Oからの光を表します。TDIの伝達関数MpDIの場合、完全な式で表現することは困難です。ただし、実装では、表面反射を複数回繰り返すことでMpDIを計算できます。

### 2.2 Glossy材質
Diffuse材質と同様に、Glossy材質のレンダリング方程式は次のように表すことができます。

![Blog-Study_PRT-GS6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/34cc530a-da1b-f1dc-5622-04f3cb8b22d7.png)


ここで、G（s、R、r）は点pでのBRDF、Rは反射光の方向、rはGlossyのパラメータです。Glossy材質は、光の入射方向sだけに関わっているだけではないため、その伝達関数をベクトルだけで表すことはできません。論文の著者によって提案された方法は、入射光LP（s）を伝達後の入射光L'P（s）に変換することです。GがRに関して対称であると仮定すると、最終結果は、L'P（s）をG（s、（0,0,1）、r）で畳み込むことによって計算できます。したがって、LP（s）からL'P（s）への伝達関数は次のように表すことができます。
![Blog-Study_PRT-GS7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/79fe899f-ad2f-b4f3-6b7f-be04eb191154.png)

---


## 三、事前計算とリアルタイムレンダリング

この論文の著者は、複数回シミュレーション方法で伝達関数を事前に計算しています。最初は、物体Oの点pについて、直接照明の結果のみが計算されます。そして、物体によって遮られる光線について、その方向から反射された光線を繰り返し計算し続けます。そして、その後の反復計算では、以前の照明結果がそれに追加されます。各点での伝達関数を計算するとき、論文の著者は10k〜30kの方向をサンプリングします。照明の計算と同時に、オクルージョン情報も計算されます。反復回数の増加に伴い、エネルギーが特定のしきい値に減衰したら、反復を停止して計算を終了します。

リアルタイムでレンダリングする場合、次の手順が実行されます。
1）物体Oの入射光Lpを計算します。
2）LpをO法線方向のローカル座標に回転させます。
3）LpベクトルとMpベクトルの内積を行うか、Mp行列を乗算します。
4）Glossy物体の場合、伝達後の入射光L'pをBRDFで畳み込み、R方向の反射光を計算します。

異なる物体間で複数の反射光線を計算する必要がある場合は、単一の物体と同じ反復計算が使用されますが、反復中に、それ自体からの反射光だけでなく、他の物体からの反射光も計算されます。

---

## 四、実験結果

論文の著者は、さまざまなシーンを使用して実験を行い、そのすべてがリアルタイムのフレームレートを達成できます。実験データを下図に示します。

![Blog-Study_PRT-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6ce0ac8b-3fd3-9074-323e-fdad89dc9045.png)


より多くのレンダリング結果の比較を以下に示します。

![Blog-Study_PRT-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6aab94a9-58ec-7080-3d9d-c5d228c42d89.png)
![Blog-Study_PRT-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/db7dd71d-7959-67df-a8dd-9bca776f42da.png)
![Blog-Study_PRT-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/cf04b06f-128f-1d43-7f04-cfea3a121d09.png)


---

## 五、まとめ

この論文の著者は、SHの回転不変性と直交性を利用して、事前計算で物体を照らすときの光伝達のプロセスをシミュレートし、このプロセスの伝達関数をSHに投影します。リアルタイムレンダリングでは、SH上の光源の投影係数を計算し、伝達関数のSH投影を使用して内積を実行して照明情報を計算するだけで済みます。このアルゴリズムは、グローバルライトをリアルタイムで計算する効果を実現します。

PRTは、リアルタイムのグローバルイルミネーションの方法を提供するだけでなく、さらに重要なことに、リアルタイムのレンダリングパフォーマンスを最適化するためのアイデア、つまり事前計算を提供します。どのレンダリング計算でも、事前計算とリアルタイム計算のバランスを見つけることができます。リアルタイムの要件が高く、ハードウェアのパフォーマンスが要件を満たしていない場合は、事前にいくつかの計算を行ってから、少量な必要な変数をいくつか保持することができます。リアルタイム計算では、テーブルを検索して事前計算結果を読み取り、簡単なフィッティングで最終結果を計算します。もちろん、事前計算方式を使用する場合は、サンプリングが必要であり、ストレージ容量が増加することを意味します。さらに、入力環境が変化しても、事前に計算された変数は変化しないため、必然的に制約が生じます。たとえば、この記事で紹介した論文のPRTは、伝達関数を使用して物体間の光線の伝達プロセスを事前に計算するため、静的物体のグローバルイルミネーションのみをリアルタイムで計算できます。物体間の幾何学的関係が変化すると、事前計算された伝達関数は無効になります。

---

## 六、論文情報

参考ビデオURL：https://v.qq.com/x/page/x0382thpc7b.html

著者について：
有名なコンピュータグラフィックス学者であるPeter-PikeSloanは、かつてMicrosoft Researchでグラフィックスの研究に従事し、現在はActivisionBlizzardでグラフィックスの研究を行っています。

有名なコンピュータグラフィックス学者であるJanKautzは、かつてmax planck institut informatik Instituteで学び、現在はNvidiaでグラフィックスの研究を行っています。

有名なコンピュータグラフィックス学者であるJohn Snyderは、かつてマイクロソフト研究院でグラフィックス研究に従事していました。

ダウンロードリンク：
[www-inst.eecs.berkeley.edu/~cs283/fa10/lectures/p527-sloan.pdf](https://www-inst.eecs.berkeley.edu//~cs283/fa10/lectures/p527-sloan.pdf)

---