gam0022のブログ

WebGL(three.js)のカスタムシェーダにチャレンジ中!!読者ターゲットは自分です。

レイトレ合宿4!? に参加しました!

8月27,28日に八丈島で開催されたレイトレ合宿4に参加しました!

忘れないうちに、レイトレ合宿前の準備から当日の様子などをまとめておきたいと思います。

時系列とは前後しますが、はじめに今回の合宿で提出したレンダラー "月灯(tsukihi)" の概要をまとめた資料を貼っておきます。

紹介スライド

作品のスクリーンショット f:id:gam-22:20160910113145p:plain

リポジトリ github.com

合宿の準備

PC購入編

前々からコンピュータ・グラフィックの研究用にハイエンドなPCが欲しいと思っており、良い機会だったので思い切って20万円弱のデスクトップPCを購入しました。

せっかくのPCも、購入後しばらくはスペックを持て余していました(笑)

パストレーシングの理論編

今回の合宿では、個人的な目標としてパストレーシングを極めようと思っていたので、まずは理論から!ということで、Computer Graphics Gems JPの2015年版の「パストレーシングで始めるオフライン大域照明レンダリング入門」を読みました。

放射輝度や放射照度のような基本的な用語の説明からはじまり、レンダリング方程式の解説、確率密度関数に従ったサンプリングの実装を踏まえた解説などが分かりやすく説明されており、とても素晴らしいパストレーシングの入門記事だと感じました。この章のおかげで、パストレーシングに最低限必要な知識を網羅的に得ることができました。

レンダラー実装編

パストレーシング×レイマーチング

holeさんが開発した、eduptというシンプルなパストレーシングのレンダラーをベースに、レンダラーを開発する作戦にしました。

eduptでは、表示できるプリミティブとして球体しか対応していませんでした。eduptのデフォルトのシーンはコーネルボックスですが、このコーネルボックスの壁も巨大な球体で表現されていました。

そこで、eduptをベースに距離関数によるオブジェクトも表示できるように改造しました。距離関数で表現されたオブジェクトとレイの交差判定はレイマーチングという手法を用いました。

これが、自作レンダラー第1号による作品です。なんと画像の生成には5時間かかっています! …今年のレイトレ合宿では、実行時間は5分以内という制限があったので、大幅にオーバーしてしまいました。

レンダリングに5時間もかかってしまった原因は、レイマーチングとパストレーシングを組み合わせたことにあります。

レイマーチングは漸近的に交差点を求めるため、1回のレイとオブジェクトの交差判定をするために、何度も距離関数を計算する必要があります。シーンの複雑さに依存するのですが、普通は50〜200回くらい距離関数を計算する必要があります。このため、CPUで処理するには重すぎる手法です。

また、パストレーシングはノイズが見えなくなるまで同じピクセルを何度もサンプリングする必要がありますので、やはり重たい手法だと言えます。 これもシーンに依存するのですが、数百〜数千回はサンプリングしないとノイズが消えた綺麗な画像にはなりません。

2つの重い手法を組み合わせてしまったため、掛算的に計算量が増えてしまったという訳です。

擬似表現

パストレーシングとレイマーチングを組み合わせるのは無謀だと感じ、結局パストレーシングを諦めることにしました。 しかし、パストレーシングなしでは間接照明を考慮しない不自然な画像になってしまいます。 そこで、擬似AOや擬似コーティクスで品質を向上させることにしました。

結果として、10秒弱でレンダリングを終了することができました!

擬似AO

f:id:gam-22:20160911121513p:plain 擬似AOの有無による結果の違いを比較しました。AOありの方が穴の部分が暗くなっており、より自然な印象になっていると思います。

f:id:gam-22:20160911121541p:plain 今回実装した擬似AOについて簡単に説明します。

length が2次レイが進んだ距離、distance は2次レイの先端からの距離関数です。 遮蔽がないとき(極端な例だと平面にぶつかったとき)は、distance = length の関係になります。 一方、遮蔽があるときは、distance < length の関係になります。 この性質を利用して、length - distance から遮蔽率を求めました。 擬似AOはデモシーンではよく使われている印象があります。

擬似コーティクス

f:id:gam-22:20160911122333p:plain コーティクスも擬似表現で実現しました。パストレーシングの結果と比較しても、形状はそれっぽくなったと思います。

f:id:gam-22:20160911122347p:plain 今回実装した擬似コーティクスは、かなりアドホックな手法です。 光源方向に2次レイを飛ばし、屈折オブジェクトの表面の法線との内積を元にしてコーティクスの明るさを計算しています。

飛行機の予約編(おまけ)

いざレイトレ合宿することを決意したものの、八丈島からの帰りの飛行機が満席で予約できませんでした…。

一瞬空席が発生したタイミングで運良く便をおさえることができました。

合宿当日

観光

台風10号の影響が心配だったのですが、結果的には何の問題もありませでした。 八丈島は豊かな自然に囲まれて、とても綺麗な場所でした。

まず海が綺麗でした!写真では分かりにくいですが、水面に雲が反射してるのはすごいですね。

Xカートという乗り物で、島を走り回ったのですが、南国のような彩度が高い景色が広がってました。

夜になると信じられないくらい星が綺麗でした。 大気が綺麗なのに加え、人工の明かりがほとんど無いため、肉眼でもはっきりと天の川が見れました。写真が無いのが残念です。

空港で食べた島寿司も最高でした!

最終日にはuimacさんにシュノーケリングセットをお借りして、ホテルの目の前の海で泳ぎました。

セミナー

セミナーのざっくりとした感想をまとめます。

セミナーの詳細については、うしおさんレイトレ合宿4!? 参加レポートにとても丁寧にまとめられているので、そちらも参照してください。

Open Problems in My Little Raytracer(ラウンドテーブル)

レイトレーサーを開発する上でのノウハウをラウンドテーブル形式で話し合いました。

オフラインレンダリングをするときに、皆さんがどのような工夫をしているのか知ることができました。 今回のように制限時間が5分と短いとデノイズが必須だと思っていたので、デノイズの話が聞けたのは特に収穫でした。 先ほど紹介したCG Gemsでもデノイズの章がありましたし、今はホットな分野なのかなと感じました。

残念ながら、今回はパストレーシングから逃げることで、空間分割からもデノイズからも逃げてしまったので、ぜひ次回に活かしたいです。

発表資料

BSSRDF -理論と実装

@Shocker_0x15さんによる「BSSRDF -理論と実装」はレベルが高かったです。

サブサーフェイス・スキャタリングを高速に行うために、BSSRDFをDiffusion Dipoleで近似する手法と、それをパストレーシングに統合するお話を聞くことができました。今の自分にはレベルが高すぎたので、ちゃんと理解できるようになりたいです。

発表資料

レンダラーのアピール発表会と結果発表

5分間で各自のレンダラーのアピールを行いました。 発表資料は公式ページにリンクされています。

予想はしていましたが、全員レベルが高かったです。

西山さんが、レイーマイングと擬似表現という、まさに私と全く同じアプローチで攻めてきたのが驚きでした。 Twitterでも結果画像を拝見していましたが、とても綺麗だったので、まさか擬似手法だとは思っていませんでした。 アピール発表では、方向性が似ているためか、非常に実りのある話を聞けました。 GLSLの組み込み関数風のVectorクラスを実装するのに時間を消費しすぎたので、OpenGL Mathematicsは使えば良かったととても後悔しています。

また、自分と西山さん以外にもレイマーチングを実験的に実装された方もいらっしゃっいましたが、やはりレイマーチングはパストレーシングと組み合わせるには重すぎるという結論でした。 最初のレンダラーの処理が遅かった理由として、実装の見落としも疑っていたので、ちょっと安心しました。

また、大半の参加者は自力でモデリングをされていて、すごいなと思いました。特に上位陣はみんなモデリングができるという印象を持ちました。

1位のBSSRDFによる雪の表現をした@Shocker_0x15さんも、 2位の超クールな商用のCDジャケットみたいな作品の@Pheemaさんも、 3位で、あのLightmetricaで有名な@hi2p_perimさんも、全員自分でモデルを作ったそうです。

uimacさんもエキシビション枠で女の子を自分でモデリングしたと聞いて、すごいと思いました。

正直に言うと、モデリングする能力が無くてレイマーチングに逃げている部分があるので、見習いたいなと思いました。

最後に

楽しい合宿で、あっという間の2日間でした。 主催のqさんholeさんに、この場をお借りしてお礼を申し上げたいと思います。本当にありがとうございました!

途中でパストレーシングを断念してしまったため、当初の「パストレーシングを極める」という目標は達成できませんでしたが、理解は確実に深まったと感じています。また、オフラインレンダリングという貴重な経験をすることができて、今後の励みになりました。

次回のレイトレ合宿に参加する際には、擬似手法ではなく、ちゃんとパストレーシングしたいと思っています。 また、制限時間がますます厳しくなると思いますので、BVHのような空間分割による衝突判定の高速化はぜひ試したいです。 他にも、今回の自分の作品のように小さな光源がポツンとあるシーンの場合、パストレーシングの収束が非常に遅いと分かったので、IBLによる光源のシーンでの収束の速度を検証もしたいですし、余裕があればNext Event Estimationもチャレンジしたいです。