2014年1月17日金曜日

パストレーシングはいつ収束するのか?

前回はパストレーシングで光源からの物体に届く光の量を推定しました。各ピクセルから500本の光線を飛ばしましたが、ノイズが残っていて滑らかに明るさが変化していませんでした。そこで今回は、各ピクセルにどのくらいの光線を飛ばせば、ノイズが減り、滑らかに明るさがへ変化するかを調査してみました。

どのように調査するのか?

画像全体で調査するとかなり時間がかかるので、とりあえず、前回の図の一部分(下の図の赤い線に囲まれた部分)だけの明るさに注目して、その部分の隣り合うピクセル同士が滑らかに変化しているかを調査することにします。

ヒストグラムにして比べてみる


この赤い部分の各ピクセルに届く直接光の本数を左のピクセルからカウントした結果をヒストグラムにしました。ヒストグラムは4つあります。これら4つの違いは各ピクセルから発射した光線の本数の違いです。それぞれ発射した本数は、順に1000本/ピクセル、10000本/ピクセル、30000本/ピクセル、50000本/ピクセルです。各ヒストグラムの横軸は、画像の場所を表しています。縦軸は、そのピクセルに到達した光源からの直接光の本数です。例えば、最初のヒストグラム(1000 photons/pixel)の横軸が60のとこの縦軸の値は60くらいを示しています。これは、赤い部分の左から60ピクセル目には、直接光は60くらい届いたよってことを表しています。横軸の0~10の間は、縦軸が0になっていますが、これは赤い部分の左端の真っ黒な部分を表しています。

では、各ヒストグラムを比べてみます。最初のヒストグラム(1000 photons/pixel)は、ガタガタしていて決して滑らかであるとは言えません。これは各ピクセルの輝度が滑らかに変化していないこと示しています。つまり、画像にノイズが多いってことですね。1000 photons/pixel程度では、きれいな画像は生成できないのでしょう。次のヒストグラム(10000 photons/pixel)は、射出した光線数が10倍になっているだけあって、結構滑らかになっています。最後のヒストグラム(50000 photons/pixel)になれば、かなり滑らかになっていることがわかります。これくらい光線を飛ばせば、きっときれいな画像を生成できるんじゃないでしょうか(かなり時間はかかりますが)。

いつ収束するのか?

では、各ピクセルから飛ばす光線の数によって、それぞれ生成された画像がどの程度滑らかになっていくかを数値化してみます。こうすることで、どの程度の光線数で充分かがある程度推測しやすくなります。

滑らか度を数値化すると言っても、どういった方法で数値するのが正しいのか分からないのですが、ここでは、隣のピクセル同士の直接光から光線数の差の割合dyの平均値と、dyの値自体にばらつき(標準偏差)によって数値化することにしました。ヒストグラムの横軸をx、縦軸をyxとすると、dy、平均値μ、標準偏差σは、次のようになります。
dyx = |yx - yx-1|/yx
μ = Σxdyx/n
σ = √1/(n-1)Σx(m - dyx)2
平均値μ、標準偏差σは、1つのヒストグラムにつきそれぞれ1つづつ計算されます。上のヒストグラムは4つしか載せてないですが、実際には各ピクセルから飛ばす光線の数は、1~50000本まで1000本づつ増やしていきました。なのでヒストグラムは50個生成されています。この50個のヒストグラムに対して、平均値μ、標準偏差σを計算し、それをグラフにしたのが下の図です。

横軸は各ピクセルから飛ばす光線の数、縦軸は平均値μ、誤差棒は標準偏差σです。光線の数が多くなるにつれて収束していってるのがわかります。30000本あたりからあまり変化がなくなってきているので、これ以上光線を増やしても、時間がかかる割に生成された画像は、それほどキレイにならないんだと思います。

まとめ

この記事では、パストレーシングに充分な各ピクセル数から射出する光線数は、
30000本
とします。
でも、これじゃ画像生成するのに時間かかりすぎだよなぁ。そろそろフォトンマップに移った方がいいのかも。

関連記事
Scalaでパストレーシング実装中

0 件のコメント:

コメントを投稿