どうも、そばやです
大学生活がスタートすると、一度は「レイトレしてみたいなぁ」と思うこともあるでしょう。
そこで、そんな新入生の皆様のために人肌脱いでやってみました。
さっそくですが、パストレーシングとは何なのかをご紹介。
する前に、まずレイトレーシングというのをご紹介。
レイトレーシングとは?
レイトレーシング(ray tracing)とは3DのCGを作るときの技法で、カメラから仮想的な光線(ray)を飛ばして、その光線と物体が当たっているかどうかを調べることで少しずつ画面に出す色を決定するものです。
じゃあパストレーシングとは?
パストレーシング(path tracing)とは、レイトレーシングの一種です。
レイトレーシングの中でも、物体に当たった光線の反射方向を確率的に扱い、大量のシミュレーションの平均値を以て画面に出す色を決定する手法です。
kwsk
大変わかりやすく、かつ詳細な説明は各所にありますので、ここでは端的に説明します。
まず、レンダリング方程式があります。
これが
こうなります。
は?わからんが
私なりに調べたり理解したりしてみたところ、レンダリング方程式とはある点()において、ある方向()に向かう光の量()がどんなもんかを記述したもので、曰くそれは
- その点自体がその方向に出す光の量()
- あらゆる方向から来た光()が反射やら屈折やらなんやかんやを経て飛んでくる量()
の和であるということです。
それはそれでいいんですが、当然上記式に出てくるような複雑な代物を解析的に積分するのは(少なくとも一般には)難しいと思います。
積分ができないときは諦めてモンテカルロ積分をしろ、とおばあちゃんに教わった人も多いのではないでしょうか?
私もそんな一人です。
ということで、「あらゆる方向から来た光」というのを乱数で作り、その分布を上記式のに比例するかんじに設定しておけば、あとは残った式を平均化するだけで真の積分値に漸近していくはずです。
原理はわかったので実際にやってみます。
レイと平面の当たり判定を実装し、とりあえず部屋を出してみる。
一応部屋っぽい何かは出ました。
色は法線をRGBに変換して出しています。
では実際にレイを反射させてみる。
照明は天井に一箇所だけ設置し、レイがそこに当たるまで反射させてみる。
色はレイが当たった物体の色をいいかんじに混ぜ合わせたものを出してみる。
謎の情景が浮かび上がる。
レイを反射させるときは、適当にノイズをかけてやらないとダメっぽい。
(完全鏡面反射だと、部屋の壁が全部文字通り鏡になってしまう。乱反射させるためには反射ベクトルに適当にノイズを乗せる必要がある。)
ということがわかったので適当にノイズをかけてみます。
ゴミが出来上がりました。
よく考えたらモンテカルロ積分をするためには平均をとらなきゃいけないと気づく。
とりあえず平均とってみる。
なんか惜しいかんじ。
時間が経つとどんどん良くなっていきます。
(ここで5分ほど待つ)
できあがったものがこちらになります。
思ったよりそれっぽい何かが描かれていますね。
概ね方針は合ってそうなので、とりあえずモノを増やしてみます。
「コーネルボックス」で検索すると上のほうに出てくるやつをとりあえずパクってみる。
ボールも出してみる。
影がいいかんじにソフトになるのがいいですね。
調子に乗って屈折させてみる。
それっぽいですねぇ。
曲面がガラスっぽくなったおかげでレンズ効果で光が集中するのも出ていてキレイです。
です。
最後に凝った形を出してみます。
まずはただの直方体。
これを彫ります。
とある神デザインのロゴを用意します。
distance fieldを生成します。
ヌンッ!
形ができましたね。
あとは適当にマテリアルを充てると...
おや?このロゴは一体...?
あっ!!
このロゴはあの東工大でデジタル創作を中心に活動していてゲームやWebサービスを作ったり競プロ・CTF・LT・イベントなどなどを行っている最近公認化した東工大デジタル創作同好会traPのロゴじゃないか!!!!おめでとうございます!!!!
ということでご入学おめでとうございます。
明日はmds_boyくんの記事です。おたのしみに。