Ray Tracing: The Rest of Your Life
資料
方針
本の英訳を与えたり、ノートを作ることは目的としない。
自分がすでに理解していることはすっ飛ばす。
自分が新たに出会った概念に留めてメモをする予定。
完全に理解は仕切らない予定。
疑問だけ残して、後々の自分が取り組むことを期待する。
が、「何をやってるのか」レベルは最低限抑えたい。「なぜそうするのか」は二の次。
感じたことをメモするので脱線するかも
1. Overview
表面下散乱や入れ子状の絶縁体みたいな視覚効果をつけるためには、数学的知識が必要
実際の実用上でのレイトレーサーを作るぞ〜
ここまでやったら実用的なレイトレーサーをいじるだけの知識がついているはず!
制約
Monte Carlo法は一個の実装法しか取り扱わないし
双方向レイトレーシングも、光子マッピングも取り扱わない
この分野の数学や用語やコンセプトを抑えることのほうが大事だからね
2. A Simple Monte Carlo Program
<--- CG系だと正確さはそこまで重要じゃないから、こっちを重宝する。
時間をかければかけるほどもっと良い精度の答えが出てくる。
やっぱり英語が読みやすい....appbird.icon
2.1. Estimating Pi
$ \piを求める。Monte Carlo法がよく使われるやつ。
取り合えずある正方形$ Sに内接する円$ Cに点をいっぱい打つ。点が$ Cに入る確率から、$ \piが推定できる。
最初は素早く収束するけど、徐々に収束速度が落ちてくる。
We get very quickly near 𝜋, and then more slowly zero in on it.
zero in...?appbird.icon
動詞:狙いを定める
zeroって動詞になるんだ...appbird.icon
2.3 Stratified Samples (jittering)
NWJ.icon 実装
改良:プロットする場所をいくつかのグリッドに分け、それぞれの点に一つずつ打つ。
このように層別化(stratifying)することで、収穫逓減を防ぎたい(jittering) 収束速度も良くなる!
次元の呪い:次元が上がると、この速度は低減してしまう。 レイトレーサーの場合は高次元アルゴリズム:反射するたびに、反射角を表す二つの次元$ (\phi, \theta) \in S^2が加わっていく...。 これをどう層別化するかは複雑だが、ここあたりは面白い研究が現在進行形でいっぱいなされている。
折衷案として:層別化を各ピクセルのサンプリングに対して行おう。
今は一つのピクセルに対して
NWJ.icon 実装
エッジがあまりぼやけなくなった!
高周波成分の変化を持つ部分に対して効果がより発揮される
High frequency change can also be thought of as high information density. For our cornell box scene, all of our materials are matte, with a soft area light overhead, so the only locations of high information density are at the edges of objects. The effect will be more obvious with textures and reflective materials.
高周波成分はより高い情報密度をもつ.... そうかな...確かにそうかも...?appbird.icon
あぁでも局所的にめっちゃ情報が変化するという意味では、情報密度は高いと言えるかもね。
イラストでよく使う意味では確かに情報は高いか。
イラストに狭い窓関数を持ったDFTをかけたら特定の場所の情報量がわかるみたいな。 んで、ランバート反射するマット生地は拡散する、ソフトライトも拡散している どちらも低周波成分にしか影響を及ぼさない
If you are ever doing single-reflection or shadowing or some strictly 2D problem, you definitely want to stratify.
ここにおけるこれって、どういう状況を指しているのだろう?なぜstratifyが必要になるんだろうappbird.icon
こゆことGPT.icon
single-reflection
反射が1回だけで終わる評価。ある点で「次にどの方向へ飛ぶか」だけを積分するなら、方向の自由度は球面上の 2変数(極角・方位角)で済む。
shadowing
面光源に対する visibility を調べるとき、しばしば「光源表面上のどこを選ぶか」という 2Dの位置サンプル になる。
面光源の表面全体から、ある点 $ x に届く直接照明を足し合わせたいときがあるGPT.icon $ L_d(x,\omega_o)=\int_A V(x,y)\, f_r(x,\omega_i,\omega_o)\, G(x,y)\, L_e(y\to x)\, dA(y)
この時の要素$ A(y)は光源面である時には、$ A(y)のサンプリングが平面に対するものになり、層別化が機能する。
strictly 2D problem
問題そのものが2D領域上の積分になっている場合。まさにその章の円と正方形の例がそうだ。
"squint" ... 目を細めてみれば
3. One Dimensional Monte Carlo Integration
3.1 Expected Value
大数の法則によって、サンプル集合$ \{x_i\}_iの平均は期待値$ \mathbb{E}\lbrack X \rbrackに収束する その定義の方式はシンプルに説明しやすくて良いねって思った(確率変数を要素の列として説明する方式)appbird.icon
3.2 Integrating $ x^2
解析的に難しい関数でも、サンプリングをすれば積分が求められるappbird.icon
$ \mathbb{E}\lbrack f(X) \rbrack = \frac{1}{b-a} \int_{a}^{b} f(x) dx
$ \int_{a}^{b} f(x) dx = (b - a)\cdot \mathbb{E}\lbrack f(X) \rbrack
平均的にならせば長方形として評価できる、という意味。
$ \mathbb{E}\lbrack f(X) \rbrackは$ Xをサンプリングすれば求められる。
入力が確率的にしか得られなかったり、計算ができても解析的に表せない関数をCGでは扱う
---> モンテカルロ積分はすごく役立つ
3.3 Density Functions
ray_color関数
光源が小さい場合に、ほとんどのレイが光源に当たらない
カメラから飛ぶレイを無理やり光源側に寄せることができれば...。
じゃあ逆に、光源からカメラへレイを飛ばしてやるのはどうか?
そのままだと不正確なライティングになるが、うまく重みづけをしてやれば良い。
明るいピクセルの横に暗いピクセルが来ないようにしたいよね
3.4 Constructing a PDF
$ \int_{x \in \R} p(x) dx = 1
$ p(x = a) = 0
3.5 Choosing our Samples
一様でない確率密度関数に従ってサンプルを選び出す
関数$ fに対するPDFがあれば、$ f(x) \in Iになる確率がわかる。
シーンに対するPDFがあれば、光に向かうレイをうまく選び出すことができる。
どうすれば、不正確に明るくさせずにレイを偏らせられるだろうか?
そのためには、まず、PDFに従って、どう乱数$ x \in \lbrack a, b \rbrackを生成すれば良いだろうか?
一様な場合は簡単。一様に$ \lbrack 0, 1\rbrackから選び出すrandom_double()を使えば良い。
では、一様でない分布を表すPDF$ pに従ってサンプルするには?
つまり、$ X \sim \mathrm{uniform}(0, 1)に対して
$ f(X) \sim pなる$ fを構成できるだろうか?
アプローチ:PDF$ p(x)を半分に分つような$ x_0を探り、それぞれで一段階ずつずらしていく。
確率関数を取る2区分定数関数$ fを次のように構成する。
$ f(X) =
$ Z_0 \; \mathrm{where} \; X \leq x_0
$ Z_1 \; \mathrm{where} \; X > x_0
ただし、$ Z_0 \sim \mathrm{uniform}(a, x_0), Z_1 \sim \mathrm{uniform}(x_0, b)
このようにすれば、2区分定数関数の中でも最も良く$ f(X) \sim pを再現する。
この$ x_0は任意のPDFに対して実験的に得られる
$ \int_{a}^{y} p(x) dx = \frac{1}{2} \int_{a}^b p(x) dx... (*)なる$ yを見つけたい
左辺は確率の公理により$ p(x) \leq 0なので、$ yに対して単調増加である。
$ \int_{a}^{y} p(x) dx = (y-a)\mathbb{E}\lbrack p(X) | a \leq X \leq y \rbrack
$ Nを$ \lbrack a, b\rbrack間のサンプルの個数、$ N_yを$ \lbrack a, y\rbrack間の個数としよう。
左辺について、$ Nが十分に大きければ次が成立する。
$ \int_{a}^{y} p(x) dx = \frac{y-a}{N_y} \sum_{i = 1}^{N_y} p(x_i)
いま、$ N_y/N \simeq (y-a)/(b-a)である。($ Xは一様なサンプルであるため)
$ \int_{a}^{y} p(x) dx = \frac{b-a}{N} \sum_{i = 1}^{N_y} p(x_i)
従って、(*)に代入し直せば
$ \frac{b-a}{N} \sum_{i = 1}^{N_y} p(x_i) = \frac{1}{2}\frac{b-a}{N}\sum^N_{i = 1}p(x_i)
$ \sum_{i = 1}^{N_y} p(x_i) =\frac{1}{2} \sum^N_{i = 1}p(x_i)
求めたい$ yは$ N \to \inftyのもとでこれを必要十分に満たす。
従って、サンプルの和を$ x_iの小さい順から徐々に足し合わせて行けば、所望の$ yを近似的に求められる。
さて、$ x_0を求め$ p(x)を分割することを複数回行えば、分割統治法によって、任意のPDFに従ってサンプリングが可能となる。 しかし、$ O(n\log n)のソートが毎回挟まり、しかもサンプル数を$ 10^5などにしている場合は、計算量はとても無視できない。
3.6. Approximating Distributions
累積分布関数; CDF $ P(x) := \int_{-\infty}^{x} p(\xi) d\xi 任意の$ x\in \Rに対して
$ P(x)の確率で$ x以下の値がサンプリングされる
$ 1-P(x)の確率で$ x以上の値がサンプリングされる
従って、次を満たすように$ f(d)を定めると良い。
$ f(P(x)) = x
$ f(d): $ d \sim \mathrm{uniform}(0, 1)をとって、$ f(d) \sim pを満たす関数