OptiXとはなにか?

レイトレーシングエンジン「OptiX」の前身となったのは世界最大規模のコンピュータグラフィックス学会「SIGGRAPH 2008」でNVIDIAが公開した「City Demo」のプロジェクトだったようだ。

これはNVSG(現NVIDIA SceniX)でのアニメーションセットアップやインタラクションを行い、レイトレーシングのプロセスはCUDAで行うものであった。レイトレーシングのアルゴリズム自体はWhitted氏のものを実装し、1,920×1,080ドットのフルHD解像度でQuadro Plex 2100 D4にて、24~40fpsのフレームレートを実現していた。

シーン自体のポリゴン数は200万。法線マップによるバンプマッピングを初めとしたテクスチャマッピングにも対応。光源は移動可能な動的光源に対応し、投げたレイの反射/屈折のバウンス数は5回まで。アンチエリアス処理にも対応。かなり本格的なシステムとなっていた。

NVIDIAのレイトレーシングエンジン「OptiX」の元となった「City Demo」プロジェクト

動画 - 「City Demo」

OptiXはこのときのCUDAベースのレイトレーシングエンジンを、より一般化した形態となっている。

OptiXは3Dグラフィックス用途のレンダリングのために使えるのはもちろん、大局照明に対応したライトマップの生成など、多目的に利用できる。しかも、ユニークなことに、3Dグラフィックス用途に限定されず、物理シミュレーションの衝突判定、人工知能用途の探索処理といった汎用目的にも利用できるという点が強調された。

「レイトレーシングで非グラフィック用途?」……というのは、もしかするとイメージしにくい読者も多いかもしれない。

レイトレーシングとは、突き詰めた上で喩えると、「ある起点から、ある方向に向かって少しずつ進む調査艇を発進させ、少し進むごとに自分に何が起きているかを司令室にレポートするシステム」のようなものだ。この調査艇がその時点での光量を司令室にレポートするならば、3Dグラフィックスレンダリングに結びつけられるだろうし、"誰"と"どういう力関係で衝突したか"をレポートすれば物理シミュレーションやAIに役立てられる。

「レイをトレースする部分」については、OptiXは3Dグラフィックス用途に限定しないAPIセットを持たせているのだ。

ただ、そうは言ってもメインの用途は3Dグラフィックスになることは間違いなく、投げたレイが衝突した際の処理については現在のGPUでいうところのプログラマブルシェーダ的な陰影処理によって実行がなされる。ちなみに、OptiXではレイをプログラマブルに増殖させたり、バッファをプログラマブルに生成することも可能で、かなり強力なプログラマビリティ・エンジンを有している。

また、投げたレイの衝突判定(交差判定)もプログラマブルに設定が可能。これは、つまり、ポリゴンモデルだけでなく、算術的な形状生成が出来たり、あるいはNURBSなどの高次曲面表現にも対応できることを意味する(詳細は後述)。

OptiXは、現在のプログラマブル・シェーダ・アーキテクチャの良さを、レイトレーシングエンジンなりの解釈を持って取り入れた設計になっているといっていいだろう。

そして、OptiXはCUDAベースのエンジンであり、CUDAが動作する環境でスケーラブルなアクセラレーションが実現される。すなわち、OptiXアプリケーションそのものを組み替えることなく、GPUの、世代が新しければ新しいほど、上位機であればあるほど、そのアプリケーションを高速に動作させられるということだ。

OptiXの基本コンセプト

OptiXはCベースのホストAPIで構成されている。データ構造はオブジェクトグラフに対応する(シーングラフには未対応)。また、GPUからのデータ取得、GPUへのデータ転送メカニズムを有し、またOpenGLとのリソース共有のメカニズムも持っている。Direct3Dについては将来的に対応予定としており、現状では未対応だ。

そして、OptiXの最大の特徴は、独自概念のレイトレーシング用のプログラマブル・シェーダ・システムを持つと言う点だ。

これはレイトレーシングの各種処理をプログラムできる……という意味であり、現行GPUに搭載されているラスタライズ法のプログラマブルシェーダ・ユニットそのものを活用するわけではない。シェーダプログラムはCUDA Cの文法で記述され、最終的にOptiXシステム上のシェーダプログラムは、GPU上ではCUDAプログラムとして実行される(3Dグラフィックスレンダリングのパイプラインで実行されるわけではない)。

OptiXのシステム概要

なお、OptiXのプログラマブルシェーダとしては、具体的には、

  • プログラマブル・マテリアル(Programmable Materials)
  • プログラマブル・インターセクション(Programmable Intersection)
  • プログラマブル・トラバーサル(Programmable Traversal)
  • プログラマブル・レイ・ジェネレーション(Programmable Ray Generation)

などが規定されている(詳しくは後述)。

オーソドックスなレンダリング手法であるラスタライズ法とOptiXレイトレーシングエンジンとのプログラマブルシェーダの概念的な比較対応は下図のようになる。

ラスタライズ法とOptiXレイトレーシングエンジンとのプログラマブルシェーダ比較。最下段3つはラスタライズ法には存在しないレイトレーシング法ならではの新概念プログラマブルシェーダとなる

左側がラスタライズ法の各プログラマブルシェーダ名で右側がOptiXレイトレーシングエンジンのプログラマブルシェーダ名になる。左側はOpenGL用語になっているので、FragmentはPixelを指していると思ってもらいたい。

この時点では、右側のOptiXレイトレーシングエンジンの方のそれぞれがどんな処理をするのかは分からなくても良い。詳細は後述する。あとで立ち戻ってこの表を見ると理解が深まることだろう。

重要なのは、このOptiXレイトレーシングエンジン側のプログラマブルシェーダのシェーダプログラムの作り方によって、多様な手法のレイトレーシング・アルゴリズムを実装できるというところだ。ある意味、この部分のシェーダプログラムの作り方を工夫することで、独自のソフトウェア・レンダリング・エンジンを構築できる……と言い換えても良いかも知れない。