コード書とる??
レイトレ合宿2!!アドベントカレンダー7週目!!
オレは人生初レイトレ!!
昨年末に催されたCG系プログラマ飲み会に参加した時、勢いで「オレもオレも!!」と手を挙げていたレイトレ合宿2!!に参加中なのだ。
「人間、レイを飛ばしてナンぼ」
だそうな。その時のワシはいたく感激したよ…(ほろ酔い補正アリ)
確かにレイを飛ばしてみたら楽しかった!!
というわけで、以下はレイ初心者がボチボチレイを飛ばし始めてみた顛末記。これからレイを飛ばしてみようという人にとって参考になれば幸い。ならないかも。
環境編
- Xcode5.1.1
- VisualStudio2013
- Emacs24.3
まっさらなWindows7で動作する事というレギュレーションなので、普段はXcodeで実行テスト時々VS2013で確認。つまりワシの普段の開発体制。やっぱ慣れてる環境がいいよね。
もちろんC++11でガリガリ書くよ!!
準備編
OpenGLを使った3D描画で普段から使っているライブラリは以下の通り。これを利用した超簡易フレームワークを土台に作業を始める。 使い慣れた道具は手に馴染んでてよい。
OpenGLを使った3D描画で普段から使っているライブラリは以下の通り。これを利用した超簡易フレームワークを土台に作業を始める。 使い慣れた道具は手に馴染んでてよい。
実装編
初心者がいきなりレイを飛ばしていいものか悩んだ結果、まずはリファレンスてきな絵をモデリングツールとOpenGLで用意。Assimpで読み込んだモデルをGLFWで生成したOpenGL実行環境で表示。まずはこれと近い感じに表示されるのを目指すのだ。

ここまではサクッと実装。慣れてますから。このとき、透視変換行列やモデリング行列なんかの計算はEigenを使う。その処理をレイトレースに転用すれば、レンダリング結果が一致するであろう…という目論見。
んで、いよいよレイを飛ばしてみる。球体とレイが交差したらその場所に色を付けるぜ。ここではgluに用意されている関数gluUnProjectを転用。これでスクリーン座標→ワールド座標の変換ができる(MESAの実装を参考にして自分で書いた)。もうひたすらレイを飛ばす。生成されたイメージはlibpngで書き出し。

うむ。やはりレイ手始めには球体1個が手頃っぽそうだ。球とレイの交差判定はゲームプログラミングのためのリアルタイム衝突判定を参考にしたよ。
続いて、拡散光を実装。これはOpenGLプログラミングガイド原著第5版を参考に。球の場合はレイとの交差座標がわかっていれば法線もわかるので楽ね。

スペキュラーもサクッと実装したった。OpenGLでのスペキュラーの計算は簡易的な手法なので、光源ベクトルを球表面で反射させたベクトルを求める方法で実装。
お次は複数モデルに挑戦。コード量が増えてきたのでこのあたりから機能を関数に分割し始める。マテリアル情報も追加開始。

だいぶん調子に乗ってきたので影も実装。OpenGLでの実装経験が役に立ちまくりんぐ。

さらにさらに、レイと三角ポリゴンとの交差判定も実装。いい感じじゃないですか〜
最終的にこんな感じになった。

左がオレ実装で、右がリファレンスとしてCheetah3Dでレンダリングしたもの。けっこう近いよねw
ここで一区切り。一日で書いたコード量は300行程度。うーん、楽しい!!
参考にさせて頂いたサイト
多謝!!
終わりに
レイトレって、実行環境に「DirectX必須」とか「OpenGL必須」とか、そういう制約が少なくていい。なのに、いい感じの絵が出来上がってくる。すんばらしくいいね。こんな素晴らしい機会を与えてくれたレイトレ合宿の主催者や参加者の皆さんに最大級の感謝!! この機会と出会わなければ、たぶんレイを飛ばす事はなかったと思う。
人間、レイを飛ばしてナンぼ!!
ではまた次回!!







