いうのも前回参考にした方法でももう少し頑張ればまともな絵が出せそうな気はしてたが、それ以前に処理速度の低下が激しかったので内心やばいなと思ってた。迷走中、という感じだが、しかし今回はそれが功を奏してやっとまともな絵が計算できるようになった。これは分類上「フォトンを直接可視化する方法」になると思うんだけど、フォトンを一千万個も使ってるにも関わらず、処理時間は3分4秒、メモリ使用量は以前一千万フォトンやったときの5分の1以下。この方法を自力で考え出せたとしたらどんなに素晴らしいかと思うけど、やはり今回もネタ元が存在する。Himatsubushiこの1ファイルだけのたった128行で、プログレッシブフォトンマッピングという方法で箱のシーンを描くプログラムとなっている。私が今やってるこのフォトンベイカーを作ろうと思ったきっかけは色々あるんだけど、その中のひとつとして、ParthenonというGIレンダラを使ってみて「もっと自分が使いやすいものを作ろう(機能・性能的に劣るだろうけど)」と思ったというのがある。今回参考にしたソースの作者とParthenonの作者は同一人物なんですね。発見してからとりあえず寝て、用事があったので朝から出かけて寿司食ったりして、昼過ぎから作業を開始し2,3時間で解読して、半日程度で自分のプログラムに組み込んだ結果が冒頭の画像。自分のプログラムはレンダラではなくベイカーなので、物体表面の位置情報や法線情報はすでにテクスチャ化されており、今回組み込むにあたって専用のデータ構造は用意せず、輝度の情報もそのままテクスチャに書き込むようにした。テクスチャを使ってる関係で、全体的に単精度浮動小数点を使ってるのでもしかしたら精度の影響が画像に出てるかもしれない。今後問題が出るようなら一部のデータはvector<double>にいれてしまうかも。コードを短くするためにちょっと読みにくくなってるので、読みやすくするために改行やスペースをきちんとして重要な変数名を省略無しのバージョンに変更した程度のリファクタリングをしつつ解読したけど、リファクタリングしてしまえば構造が素直で非常に読みやすかった。(コードを短くするためだと思うけど物体を全部球で表現してるのが面白いと思った。処理内容を説明すると、(自分のプログラムはこれとはまた別の流れとなっている)まずカメラを始点として画素にレイを飛ばして、拡散面にぶつかったらその地点を表すデータ(地点データ)を生成。次に光源からフォトンを飛ばして物体表面にぶつかったら、その衝突地点をもとに地点データを検索し(ハッシュを使うので速い)、該当のデータに輝度の情報を書き込む。フォトンを飛ばし終わったら、地点データを全て舐めて最終的な画素の色を決定。