三葉レイさんのレイトレをやってみた
ゲーム制作の息抜きに三葉レイさんのレイトレを追いかけるのやってみようと思います。C++右も左も分からないのだけどまあなんとかなるでしょ。
— 折登 いつき (@MatchaChoco010) August 6, 2019
ということで、こちらの動画を参考にレイトレ入門してみました。
まず最初は画像を表示するところから。 ピンク一色の画像を生成しました。
次に、シーンに球を一つおいて、球にヒットしたところをピンクに、 それ以外を黒に塗りつぶします。 アスペクト比を計算していないので横に伸びていますが。
ヒットしたところの法線を色に出力します。
球を2つおいてみます。重なっている部分もきれいに解決されています。ラスタライズ法ではデプスバッファなどを使いますが、レイトレーシングだと何もせずともレイを飛ばせばきれいになってくれますね。
視点を変えました。パースペクティブなカメラになりました。
球だけでコーネルボックスを作ってみます。
球に色のパラメータをもたせました。
カメラの位置にライトがあると仮定してランバート反射を実装しました。ランバート反射をやるならレイトレーシングする意味もあまりないですね。
先程のコーネルボックスに色を付けました。このシーンをレイトレできれいに表示するのが目標です。
ピクセルごとのレイのサンプリング数1で反射回数1回でレンダリングしました。よくあるレンダリングソフトのレンダリング途中の画面みたいになってテンションが上ります。
上にあるのが照明です。ランダムな方向の反射の結果ライトに到達した場所が白くなっていて、ライトに到達できなかった場所は黒い色です。レイの反射はランダムにサンプリングしているのでライトの方に反射するのはまれなのでこんな感じになっています。
サンプリング数を1000回に上げました。ランダムに反射する1000本のレイの平均値を色として表示しています。反射回数は1回なので直接光だけ計算していることになりますね。
プログラムはOpenMPを使って並列化しています。プログラムを走らせるとCPUを使い切れます。
次は反射回数を10回まで引き上げたものです。
レンダリングにかかった時間は35分ちょっと。 球に壁から反射した色が写り込んでいるのも観察できます。
簡単にレイトレに入門できて楽しかったです。 鏡面反射に対応する動画もあるようなので、また今度試してみたいと思います。