レイトレ合宿4!?参加報告
こんにちはtatsyです。
先週末、八丈島で行われたレイトレ合宿4!?に参加してきました。
レイトレ合宿は合宿前に各参加者が実装したレイトレーシング等のレンダリングプログラムを実行し、それで得られた画像のクオリティを競うというのがメインイベントになっている合宿で、私は昨年から参加をさせていただいております。
ちなみに昨年私が出した画像は次のような画像です。
今年の実装方針
合宿用のレンダラを実装するにあたり、今年はいくつかの目標 (隠れ目標含む) を自分の中でなんとなく作っていました。
昨年からの変更目標
- 昨年はアセットをC++のコードでベタ書きしていたので、今年はローダを作る
- 昨年のシーンの床のチェッカー模様は別々のメッシュになっているので、今年はテクスチャでそれを実現する
- 昨年のシーンではBSSRDFを使ったので、今年はボリュームをやる
隠れ目標
- 2010年より後に発表されたレンダリングアルゴリズムを使う!
今年の実装結果
というわけで、一つずつ目標の達成状況を見ていきます。
1. アセットローダの実装
今回のレンダラを作成するにあたり、アセットをXMLで記述するようにEngine
というクラスを作成しました。
基本はMitsubaレンダラとほぼ同じ記法でシーンを記述できるようにして、レンダリング結果が正しいかどうかをMitsubaでもチェックできるようにしました。
2. テクスチャによるラフネスの指定
こちらに関しては、基本的にはテクスチャをどう扱うかという問題でしかないのですが、PBRT v3のコードを参考にしつつ、ImageTexture
とFloatTexture
というクラスを作成しました。
名前の通りですが、前者は各画素がRGBの三色を持つテクスチャで、後者は各画素がdouble1つ分の情報を持つテクスチャです。
3. ボリュームレンダリングの実装
ボリュームについてもPBRT v3のコードを参考にしつつ、HomegeneousMediumというクラスを実装しました。今回の画像では平均コサイン$g$は0になっていますが、内部的にはHenyey-Greensteinの位相関数を使って計算しています。
ここまでの結果を踏まえて今回作成した画像が次のような画像です。本番は24spp分しかレイが飛びませんでしたが、以下の画像は256sppまでレイを飛ばした画像です。
アセットローダに関しては、この画像からだけでは目標が達成できているかがわかりませんが、一応上記の3つの目標はクリアできています。
一番右のワイングラスにStanford Bunnyが水没しているのがポイントです!
隠れ目標について
今回作成した上の画像ですが、レンダリング・アルゴリズムはSPPMです。そうです、SPPMは2009年に発表されたアルゴリズムなので、隠れ目標が達成できていません!
今回ボリュームを短時間で扱うにあたり、Beam Radiance Estimateというボリュームを対象にしたPhoton Mappingの進化系のようなものを実装しようと考えました。
さらに2010年以降の手法を実装するという目標に従い、2011年に発表された「Progressive Photon Beam」を実装しようと考えました。
しかしながら、あまり実装に時間が取れず、上記の手法は実装することができませんでした…(完全に言い訳です)。
ですが、そこで諦めず、提出後に急いで実装をして、Progressive Photon Beamの前身であるBeam Radiance Estimateだけは簡易的な実装をすることができました。
それが次の画像です。
パストレーシング | Beam Radiance Estimate |
はい、明るさおかしいですし、ライトがすごくリークしてますね。のちのち完成目指します。
(本当はパスをつなぐときにPDFの取り方を変えないといけなんですけど、変えてないです)
まとめ
今回はテレビ石という素敵な景品もいただきました。去年は方解石だったので、毎年、石をたくさんいただいています(笑)
テレビ石は、細い繊維上の石が縦に並んだような構造になっていて、その1本1本が光ファイバーのようになっているらしいです。そのため、石をものの上に置くと、下の模様が浮き上がって見えます(下の画像を参照)。
来年こそは著名人Tシャツをもらえるようにがんばります。というわけで、レイトレ合宿4!?の報告でした。
合宿後は、八丈島を自転車でかけめぐるという無理難題をこなしてきました。翌日、筋肉痛でした。
台風も心配されていましたが、無事かえってこられて良かったです。
改めまして、主催者のqさん、holeさん、ありがとうございました。この場を借りて御礼申し上げます。