こんにちは。Unityサポートエンジニアの黒河です。

このコーナーでは、クロカワが雑談形式でツラツラといろんなことを喋っていきます。
今すぐ役に立つTIPSというよりも今すぐ役に立つチップスというよりも、いつか役立つかもしれない事をつらつらと喋っていきます。

前回お喋りしたように、リアルタイムレンダリングに利用されているラスタライズ方式ではそれっぽく見せることで速いレンダリングを実現しています。

しかし、ラスタライズ方式では苦手な部分というのはどうしても出てきます。
それを補うための一つとしてライトのベイクがあります。

ライトベイクについて

百聞は一見に如かず、実際ライトベイクをすると、どうなるか見ていただきましょう。

Before

After


ライトベイクすることで、すごく雰囲気が出てきましたね!(画面全体の明るさがベイクで少し変わってしまっていますが…)

もう少し細かく見てみましょう。
画面右側の赤い壁から照り返された光の影響を受けて赤みを帯びています。
反対側も同様に緑色の壁から照り返された光の影響を受けて緑色を帯びています。
光源から直接放たれた直接光だけでなく、物に当たって反射した間接光も考慮した形です。

グローバルイルミネーション??

照り返された間接光の影響も考慮することをグローバルイルミネーション(Global Illumination)と呼んでいます。
グローバルイルミネーションのおかげで、リアリティーが増しています。

レイトレース方式では、追跡する光線量が多ければ、この現象を再現出来ます。しかし、ラスタライズ方式ではこの現象の再現は非常に困難です。なので、ライトベイクが登場します。

動くものと動かないもの(static)

ライトベイクはこの間接光のデータを事前に計算して埋め込んでおくことで、実行中の負荷を下げようというアイディアになります。
事前に計算して埋め込む形なので、光源及び間接光を出す物は動かないという前提が必要になってきます。
動かない前提のものをStaticオブジェクト、動く可能性があるものをDynamicオブジェクトと便宜上わけて扱う事によって、グローバルイルミネーションとインタラクティブの両立を実現しています。(例えば、建物自体は動かない物として扱い、キャラクターなどは動く物として扱うと言った形で分ける事が出来ます。)

光源及び間接光が動かないという前提条件があるなら、間接光や影などを事前に焼き付け(ベイク)しておくことが出来ます。なのでライトベイクですね。
このライトベイクは、かなり重い処理となっており、かなりの時間を要します。
(焼き付ける解像度や広さに依存しますが。。。)

※ちなみにunityではチェックボックスいれるだけ扱いを変更することが出来ます

余談…

ちなみに余談ですが…。
リアルタイムレンダリングにグローバルイルミネーションの技術が確立されたのは、約10年前頃です。
日本ではSEGA社が制作したビデオゲーム「ソニックワールドアドベンチャー」がいち早くリアルタイムのグローバルイルミネーションを実現していて当時は話題になっていました。
こちらの記事をご参照ください。
実際のゲーム画面でグローバルイルミネーションありなしの比較もあり、非常にわかりやすいです!

まとめ

事前にライトベイクすることで、物から照り返された間接光を考慮したグローバルイルミネーションをリアルタイムでも実現しクオリティをあげる事が出来ます。
しかし、このライトベイクすごく時間かかります。
そこでCPUではなくGPUで処理することで高速にしようという話があります。Unityでも2018.3という最近のバージョンで対応しました。
GPUにするとライトベイクが速く出来るようになります。

ということで、次回はCPUとGPUのお喋りします。