VXGIはレイトレーシングなのか?

下記のような記事を見かけました。

NVIDIA、GTX 980でNASAの陰謀論解明に挑む【やじうまPC Watch】

すごく興味深くて面白い記事でした。が、ちょっと気になることがあったので書いてみます。本当に小さいところへの突っ込みなので、別に元記事が間違っているとか批判したいわけじゃありません。

元記事には下記のような一文があります。

グローバルイルミネーションは、物体に直接あたる光だけでなく、物体に反射した光も考慮した上でレンダリングを行なうもので、レイトレーシングと言った方が分かりやすいかもしれない。グローバルイルミネーションを使うことで、CGの写実性は格段に増す。

だが、グローバルイルミネーションでは、1本1本の光線の軌道を正確に追跡、再現するため、GeForce GTX 980クラスのGPUでも、演算には莫大な時間がかかる。そこで、VXGIでは、レンダリングするシーンをピクセル単位ではなく、ボクセルと呼ばれる立体に分解して演算を行なう。これにより、何十億という処理を、数百万にまで簡易化することができる。

この説明はちょっと不正確だと思います。私も専門家ではないので正確な記述は書けないのですが、まあ大体以下のような感じになっています。

まず、レイトレーシングとグローバルイルミネーションは別物です。レイトレーシングは光源とカメラを結ぶ線を探しだして、カメラに投影される二次元平面上の各ピクセルには何が写るかを計算する方法です。カメラと光源を結ぶパスを見つけ出すのはかなり時間が掛かります。なので、ゲーム等、リアルタイム(少なくとも数ミリ秒以内)にレンダリングしなければならない用途には不向きです。

対して、グローバルイルミネーション(GI)は日本語で大域照明と言い、物体に当たって反射した拡散光をなるべく正確に表現するための方法の総称です。拡散光を表現に組み込むとCGの写実性はぐっと向上します。しかしながら、拡散光を正確に表現するとなると先のようにレイトレーシングを利用して光が拡散していくパスを正確にトレースしなくてはならないので高速に処理することが難しいです。なので、それを大ざっぱに計算してそれなりに正確に見せよう、完璧を求めずに大体合ってることを目指そうというアルゴリズムが研究されてきました。たとえばAO(Ambient Occlusion)などがそれにあたります。これは詳細は省きますがかなりおおざっぱな手法ですが、人間が見るとそれなりの写実性は感じられます。

ちなみにソフトの世界ではこういうアプローチ(正確性を犠牲にして計算時間を短くする)は普通にあります。レイトレーシングだって反射回数が大きくなれば計算を打ち切ったりします。

GIを実現する最も有名なアルゴリズムはメトロポリス光輸送というものです。乱数を使ったアルゴリズムをモンテカルロ法と言いますが、メトロポリス法はそれの延長で、ある状態から別の状態を計算した時にそれを採択するか棄却するかに一定の判定条件を与えるものです。で、メトロポリス光輸送というものは明るい光が反射したところをより重点的にサンプリングして計算量を減らす(正確性も減る)工夫をこらしたアルゴリズムです。そして、このメトロポリス光輸送は反射光を調べ上げるのに光源とカメラからの双方向のパスを使います。

image from Metropolis Light Transport , Eric Veach and Leonidas J. Guibas, SIGGRAPH 97 Proceedings (August 1997), Addison-Wesley, pp. 65-76.

(↑メトロポリス光輸送をつかってレンダリングした画像)

つまり、GIで良く用いられるアルゴリズムとしてメトロポリス光輸送というものがあり、これは双方向のパスをトレースして実現しているので、その極小的な意味ではGIはレイトレーシングだと言えなくもないのですが、普通、レイトレーシングと言ったら前述のようなカメラと光源を結ぶパスを見つけるレンダリング手法そのものを指しますし、GIを実現する手法はメトロポリス光輸送だけではないのでこの点でも不正確だと思います。

では、GI処理がリアルタイムに行えるVXGIとはどんなアルゴリズムなのでしょうか。これもレイトレーシングの応用なのでしょうか。

記事本文中には下記のように記載されています。

だが、グローバルイルミネーションでは、1本1本の光線の軌道を正確に追跡、再現するため、GeForce GTX 980クラスのGPUでも、演算には莫大な時間がかかる。そこで、VXGIでは、レンダリングするシーンをピクセル単位ではなく、ボクセルと呼ばれる立体に分解して演算を行なう。これにより、何十億という処理を、数百万にまで簡易化することができる。

ちょっと私には「レンダリングするシーンをピクセル単位ではなく、ボクセルと呼ばれる立体に分解して演算を行なう。これにより、何十億という処理を、数百万にまで簡易化することができる。」というところが良く理解できませんでした。なので、VXGIについて調べてみると下記ページがわかり易そうでした。

NVIDIA's next-gen gaming graphics card, GeForce GTX 980 revealed!

これによる私の大ざっぱな理解は以下の通りです。まず、シーンをボクセル(Voxel)に分割します。ボクセルとは3次元立体単位のことです。ピクセルの3次元版、マインクラフトの世界みたいなものをイメージして頂ければよいかと思います。

image from NVIDIA's next-gen gaming graphics card, GeForce GTX 980 revealed!

そして、反射光を計算するときはボクセル単位に計算します。具体的には、下記のようにボクセルの面単位で光の流入、流出、反射を計算します。拡散方程式を勉強したことがあればイメージがつかみやすいでしょう。

image from NVIDIA's next-gen gaming graphics card, GeForce GTX 980 revealed!

で、得られたボクセルによる周辺反射光データにシャドウマップなどの他の情報を加味して最終的な画像を得るそうです。つまりVXGIがレイトレーシングという訳ではなさそうですね。

という訳で小さい突っ込みと、3Dレンダリングの世界の面白さをちょっと解説してみたつもりです。

ちなみに、元記事ではこれを使ってアポロの月着陸シーンを周辺光を加味して再現し、「シミュレーション結果と実際の写真がほぼ同じだからアポロの月着陸はねつ造ではないと証明できた」といったようなことが紹介されています。これは面白い試みですが、わざわざシミュレーションするまでも無く識者がまっとうに同様の説明をしてきたことではあります。本当に証明したいというよりは、話題を集めやすいからでしょう。と、言えど、ビジュアルで見てわかり易いのでやる価値は十分にあると思います。

また、本記事で「計算量を削減するために正確性を欠いたアルゴリズム」という表現を何度か書いていますが、これをもってして「シミュレーション画像は不正確な表現だから、月着陸写真が正しいという証明にはならない」という批判をするには無理があります。確かに計算量を省くための近似的な手法ではありますが、もしパストレーシングを繰り返してより正確なレンダリングを行ったとしても、人間の目にはほとんど同じように見えるはずです。

個人的には、アポロ陰謀説など一笑に付すレベルのものだと思います。