前回はRealtime Lightingでの影の品質を調整する方法をピックアップしました
しかし影の品質を簡単に上げるならもっと簡単な方法があります
今回はBaked Lightingをまとめてみました
↑↑サンプルシーン、ライティングはBakeを使用
Baked Lightingとは
事前にライティング結果をテクスチャに書き込んでおく(ライトマップ)
実行時にこのライトマップを参照することで、軽量にライティングを行うことができる
何を焼くか
太陽光の影だけでない
赤い物体の反射光は周りに影響を及ぼす。
赤い物体と青の物体の周りは混ざって紫になる
太陽光の光を直接光
周りの物体の反射光を間接光
↑↑右の青い壁が青い間接光を放って床を青くしている
これに環境光(Skyboxなどライト以外の影響を受けたもの)を加えたものを
大域照明(Global Illumination/GI) と呼びます
Baked LightingのライトマップにはこのGIがすべて書き込まれます
Unityの左上メニューから「Baked Lightmap」にすると
Bakeされたライトマップが確認できるので便利です
GIとは
Bakeはどうやってるの?
Bakeの技術的なロジックは意外と普通です
Bake時に各ピクセルからランダムにRayを飛ばし、光源にたどり着いたらその光源の影響を受けます
オプションで直接光のサンプル数、間接光のサンプル数、光が跳ね返る回数、が指定でき、
その設定で光をシミュレーションしてライティング結果を算出します
フィルタリング(Filtering
ランダムにRayを飛ばしているので、ピクセルごとに光源に辿り着く/辿り着かないが起こりムラが発生します
フィルタリング機能でこのムラを減らすことができます
アンビエントオクルージョン(Ambient Occulusion)
物質の端が少し暗くなる現象を疑似的に表現する機能です
ONにすることでリアリティが増します
UVチャート
Baked LightingにおいてUVsは重要らしい
Lightmap UVsは日陰と日向で被ってはいけないので、albedo UVsとは別に作ることになる
UVのアイランド間では距離を置くようになってるが、稀にピクセルを共有しておかしくなる。これをオーバーラップと呼ぶ
オーバーラップ確認画面で赤く表示される。ただつぶしてるときりがないので、影響度を見て無視できるものは無視したほうがいい
Bake結果のテクスチャ(ライトマップ)
ライトマップはシーンのBaked Lightingで直接光・間接光の計算結果をシーンに焼き付けたテクスチャのこと
マスの大きさがライトマップの解像度割り当てになってる
マスが大きいほうが情報量が少なく、マスが小さいほうがより情報量が多い
UVのアイランド間で距離を置いているのが分かる
オマケ:どのオブジェクトの影をBakeするか?
Baked Lightingは負荷軽減に大きな効果をもたらしますが
影を変えることができないので多くの制限があります
何をBakeして何をBakeしないかはよく考えましょう
多くの場合、Mixed LightingでRealtime Lightingと併用することになると思います
- プレイヤー・敵などの移動物はもちろんBakeしない
- 移動物の影とBaked影の帳尻を合わせるにはMixed Lightingでライトプローブを利用することになると思います
- 草や木々は風で揺らすのでBakeしない(揺らさないのであればBake可)
- 破壊オブジェクトの影はBakeしない(破壊しても影が残る)
- 光源が移動する場合はBakeできない
- 昼夜を表現したいならライトマップを差し換えるなどで代用する手も
オマケ:シャドウマップとライトマップの違いは?
名前は似てますが利用されるシーンは別々です
Unityではリアルタイムの影をレンダリングするためにシャドウマッピングと呼ばれる技術を使用しています
光線がサーフェスをヒットするまでに移動する距離の情報をシャドウマップに入力されています
これでサーフェスから光源の距離と比較すると、影になっているかがわかります
デプスマップと似ていますが視点は光源なのでこれも別物です
参考資料