前回はリアルタイムライティングについて調べてみました。今回は事前計算によるライティングを調べてみたいと思います。
まずは準備として基本形状のCubeを組み合わせた部屋のシーンを用意します。これは前回の紹介したものと同じものです。
まずは確認として、環境光と環境反射光の影響を無しにしてみます。メニュー:Window > Lighting > Settingsを選択。[Lighting]ウィンドウ > [Scene]ボタンをクリック > Einvironment > EnvironmentLighting > Intensity Multiplier: 0に変更、Environment Reflections > Intensity Multiplier: 0 に変更。[Game]ビューでみると光の当たらない部分は真っ暗になりますね。
では、[Hierarchy]ウィンドウでCubeオブジェクトのグループをすべて選択します。([Ctrl]キーを押しながら順にすべてクリックで複数選択)そして[Inspector]ウィンドウ >オブジェクト名の右側にある”Static”のチェックを入れます。すると次のようなダイアログが表示されます。”すべての子階層オブジェクトも同様に有効にしますか?”ということで[Yes, change childlen]ボタンをクリック。
すると、[Inspector]ウィンドウ下に進行バーが表示され、計算処理が始まります。
計算処理が終わったら[Game]ビューを見てみましょう。先ほどまで真っ暗だった影の部分がぼんやり明るくなっています!
これはどういう事か?Unityの公式マニュアルの「静的ゲームオブジェクト 」を読んでみました。
ゲームプレイ中にオブジェクトが移動できるかどうかを知ることによって、多くの処理の最適化を行うことができます。静的 (動かない)オブジェクトは多くの場合、位置が変わらないので、エディターの段階で事前に計算することが可能です。例えばレンダリングは batch と呼ばれる静的なオブジェクトを大きなオブジェクトとして1つにまとめることで最適化を行うことができます。
ざっくり言うと、オブジェクトを「静的ゲームオブジェクト」に変更したので「事前計算ライティング」が有効になったということです。じゃあ、「事前計算ライティング」とはなんなのか?これも公式マニュアルの「ライティングの概要 」にある「ライトマップのベイク」の項目を読んでみます。
Unity では、静的で複雑なライティング効果を計算することができます(グローバルイルミネーションやGIと呼ばれる技法を使います)。計算結果は、ライトマップと呼ばれる参照用テクスチャマップに保存されます。この計算のプロセスをベイク(焼き付け)と言います。
ライティングをベイクして生成されたライトマップには、ゲーム中に変更を加えることができません。そのため ‘静的(スタティック)’ と呼ばれます。リアルタイムライトは、ライトマップされたシーンの上から加算的にオーバーライドして使うことはできますが、ライトマップ自体を変化させることはありません。
ざっくり理解した感じでは、静的ゲームオブジェクトでは直接光や間接光の複雑なライティングの計算してライトマップという画像に保存してオブジェクトに上書きできるよ。ということですね。
しかし、ややこしくなるのが「事前計算されたリアルタイムグローバルイルミネーション」というの別のライティング方法が存在することです。試しにメニュー:Window > Lighting > Settingsを選択。[Lighting]ウィンドウ > [Scene]ボタンをクリック > Realtime Lighting > Realtime Global のチェックを外してみましょう。
なんと![Game]ビューを見ると。また影の部分が真っ暗になってしまいます。どういうこと?
では先ほど影の部分が明るくなったのは「事前計算されたリアルタイムグローバルイルミネーション」だったのか?ということになりますがどういうことでしょうか?今度はライトの設定をちょっと変えてみます。[Hierarchy]ウィンドウ > Directional Lightを選択。[Inspector]ウィンドウ > LIghtコンポーネント > Mode [Baked]に変更します。
これが完全な「事前計算ライティング」または「事前計算グローバルイルミネーション」ということのようです。実際は他にも設定が色々あるようですが現状理解できた範囲で事前計算処理の切り替えについてまとめると次のような形になります。
「事前計算されたリアルタイムグローバルイルミネーション」は太陽の動きのようなオブジェクトは動かないけどライトは動くよ、というような場合に効果的だそうです。またいずれ試してみたいと思います。
最後に試したのが次の設定。これを[Game]ビューでみると真っ暗闇になりました。ライトのMode [Baked]に変更した静的ライトで、Staticのチェックをオフにした動的オブジェクトを照らすことはできないということでした。