土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

#unity "Precomputed Realtime GI"の「事前計算」はいつなのかという話

 UnityにおけるGI(Global Illumintaion. 大域照明)は、"Baked GI"という、ビルド時(あるいはもっと前)にシーンの間接光を計算し、そのカラー値をライトマップと呼ばれるテクスチャに書き込む(「ベイクする(焼き付ける)」と言います)物を指します。間接光の計算には膨大な演算が必要で、毎フレーム計算するのは無理ゲーなので、ビルド前にベイクしておくわけです。

 とはいえ、ベイクしたライトは当然動かせないので、これでは「間接光を生み出すが、動く光源」を上手く表現できません(よく例で出されるのは太陽です)。そこで、UnityではEnligten(※1)というミドルウェアを使用する"Precomputed Realtime GI"というモードがあり、制限はあるものの、リアルタイムでの間接光計算を提供しています。「事前計算されたリアルタイムGI」と訳されます。

 「毎フレーム計算するのは無理ゲー」なのに、どうやってリアルタイムでGIするのかと言いますと、答えは簡単で、数フレームに分割してバックグラウンドで演算し、それが終わってから画面に反映するのです。太陽のようにゆっくり移動する光源であれば、それほど違和感が出ないことがわかっています。ただし、当然ながら実行時にその分のCPUとメモリのコストが余分に必要になります。

 でまあ、ようやく本題に入りますと、Unityドキュメントに限らず、"Precomputed"は「事前計算」と訳すのが一般的なのですが、この「事前」が、「ビルド以前(これはBaked GIの事)」なのか「実際に描画される前の数フレーム(こっちがPrecomputed Realtime GIの事)」なのかを文脈判断になることが多いように感じています。少なくとも土屋はドキュメントを読んでいて何度も躓きました(念のため書いておくと、原文読んでて"Precomputed"とあっても間違える)。

 なので、シェーダー本3では"Precomputed Realtime GI"を「直前計算リアルタイムGI」と訳すことにしました(一般的な訳語でないことには注釈を入れておくことにします)。こんな日本語ないけど、まあ言いたいことは伝わるだろう……(祈り)。

※1 Enlightenは元々UnityのGI全般を管理するミドルウェアですが、2018.1以降、Baked GIについては、Unity社とImagination Technologies社が協力して新規に開発し、以前から実験的に採用されていたProgressive Lightmapperというミドルウェアがデフォルト設定になっています。ちなみにEnlightenはシリコングラフィックス社の製品です。