最近、3Dソフトの実験として「パストレーシングを自作できないか」と思い、試しに作ってみました。
私が普段使っている3Dソフトはパストレーシングに対応していないため、以前から少し不満を感じていました。そこで、3DモデルをVRML形式で書き出し、それをJavaScriptで読み込んでレンダリングする方法を試してみました。
実際にやってみると、思っていたよりも難しくはありませんでした。パストレーシングの仕組み自体は、光がポリゴンに当たり、その反射を計算しながら最終的な色を求めていくものです。もちろん実際には複雑な処理がたくさんありますが、基本的な考え方を理解するだけなら意外とシンプルでした。
ただし、問題もあります。
一番苦労したのはVRMLデータの読み込みです。自分で作成したモデルでも正しく読み込めない部分があり、さらにネット上で公開されているVRMLサンプルを試してみても、ほとんど正常に読み込めませんでした。原因はまだ特定できていませんが、レンダリング以前の段階で課題が残っています。
現在の状態では、あくまで実験レベルです。最低限のパストレーシング表現はできていますが、実用的なレンダラーにはほど遠い状態です。
本格的に作るのであれば、
リアルタイムレンダリングへの対応
テクスチャマッピング
環境マッピング(HDRI)
マテリアル表現の強化
ノイズ除去(デノイズ)
高速化のための最適化
など、多くの機能が必要になります。
今のところカメラを動かすことはできますが、リアルタイムでレンダリング結果が更新されるわけではなく、静止画に近い使い方になります。
とはいえ、自分でパストレーシングの仕組みを実装してみたことで、「レンダリングがどのように行われているのか」を以前より深く理解できたのは大きな収穫でした。
実用性という意味ではまだまだですが、技術的な実験としてはなかなか面白い経験だったと思います。今後さらに改良するかどうかは未定ですが、とりあえず「JavaScriptでパストレーシングを動かしてみる」という当初の目的は達成できました。