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でパストレーシング実装中

2014年1月10日金曜日

The Instration of Cisco VPN Client for CentOS 6

CiscoのVPN Clientのビルドが一筋縄ではなかったので、ここのインストールメモを残しておきます。

依存ライブラリのインストール

$ yum install ld-linux.so.2

カーネルのソースをインストール

$ yum install kernel-devel

インストールしたソースのカーネルのバージョンを確認

$ ls /usr/src/kernels/

現在のカーネルのバージョンを確認

$ uname -r

2つのバージョンが違ったらカーネルを更新

$ yum install kernel
$ reboot

cisco vpn clientのダウンロード

$ wget http://tx.nc-sec.co.jp/download/nc/vpn/linux/vpnclient-linux-x86_64-4.8.02.0030-k9.tar.gz
$ tar zxvf vpnclient-linux-x86_64-4.8.02.0030-k9.tar.gz
$ cd vpnclient

Makefileの変更

Makefileの
CFLAGS += -mcmodel=kernel -mno-red-zone

EXTRA_CFLAGS += -mcmodel=kernel -mno-red-zone
に書き換える

パッチの適用

$ wget http://www.lamnk.com/download/fixes.patch
$ patch < ./fixes.patch
途中でパッチを当てた形跡があるがどうする?と聞かれるが「n」を入力。
とにかく適用?と聞かれるが「n」を入力。

インストール
$ ./vpn_install

2014年1月8日水曜日

[3DCG] Scalaでパストレーシング実装中

最近は3DCGのプログラミングをしています。Scalaを使ってます。まだまだ実装途中ですが、ここまでの結果をログとして記録しておこうと思います。

今はパストレーシングを実装中。光源から光の届き具合を調べる為に、直接光が当たる部分と間接的に光が当たる部分の画像に分けて出力しました。ピクセル毎に500パスを使用して描画しました。以下は、その結果の画像です。ちなみに、まだ色は考えてないので、白黒の画像です。輝度のみです。

直接光による寄与

各ピクセルから500本の光線を飛ばし、拡散面で1度だけ反射して光源に到達した光線を描いた画像。手前の球に光源が映っているところがおかしい。ノイズがある。光線の本数が足りないのかなぁ。


間接光による寄与

直接光の画像と同じように、各ピクセルから500本の光線を飛ばしました。違いは、2度拡散面で反射し光源に到達した光線を描いたところが違います。全体的に光が分散してる感じなので悪くないのでは!?


直接光+間接光

上の2つの画像を足しあわせた画像。うーん、いまいち。何かが足りない感じ。参考にしている本によれば、100paht/pixelくらいで結構キレイな画像生成しているだけどなぁ。


あとは、これをもうちょっと改造して色をつけてって感じです。最終的にはフォトンマップまで実装しようと思ってます。