UnityのMixed Lighting/Light Probe/Refrection Probeのまとめ

ライティング負荷を減らしたいが近くの影は綺麗にしたい

動かない影は事前計算で焼いて置き
動く影はリアルタイムでしっかり計算したい

今回はライティングを事前計算による焼きこみとリアルタイム計算で表示する機能を簡単にまとめました

# Mixed Lighting（混合ライティング）
https://docs.unity3d.com/ja/2018.4/Manual/LightMode-Mixed.html

> 混合 ライトは、ランタイムにトランスフォームや視覚関連プロパティ (色や強度など) を変更できますが、厳しい制限内でのみ可能です。混合ライトは静的ゲームオブジェクトと動的ゲームオブジェクトの両方を照らし、常に直接光を提供し、必要に応じて間接光を提供できます。混合 ライトで照らされた動的ゲームオブジェクトは、常に他の動的ゲームオブジェクトにリアルタイムの影を落とします。

Mixed Lightingには３つモード(Mixed type)があります
- Baked Indirect
- Shadowmask
- Subtractive

※設定変更したらGenerate Lightingしないと反映されません

## Baked Indirect 

> Unity は間接光のみを事前に計算し、影の事前計算は行いません。影は Shadow Distanceの範囲内では、完全にリアルタイムです。つまり、Baked Indirect モードのライトは、間接光を追加した リアルタイムライト のように動作しますが、<b>Shadow Distance を超えると影を作りません</b>。

| ShadowDistance=10 | ShadowDistance=150 |
|:---:|:---:|
| ![BakedIndirect_baked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/2791888f-762b-c759-bcec-0cfe0627fb60.png) | ![BakedIndirect_realtime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/2dccd99c-a809-c923-cd44-9a5e3b99ff8a.png) |
| ShadowDistance外なら影を表示しない | ShadowDistance内ならRealtime影 |

> Baked Indirect モードの良い使用例は、廊下でつながる複数の部屋内でのシューティングゲームやアドベンチャーゲームを作成する場合です。 視距離は限られているので、見えるものはすべて通常は Shadow Distance 内に収まります。 このモードは、霧を使って離れた場所の欠けた影を隠すことができるので、霧のかかった屋外のシーンを構築するのにも役立ちます。

## Shadowmask
> Shadowmask: 影を作る静的ゲームオブジェクト。常にベイクした影を使用します。
> Distance Shadowmask: <b>Shadow Distance (シャドウディスタンス) に達するまでリアルタイムの影を使用し、それを超えた場合はベイクした影を使用します。</b>

| ShadowDistance=10 | ShadowDistance=150 |
|:---:|:---:|
| ![Shadowmask_baked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/0fa77e43-ca0c-3142-9f55-12b4f40fb832.png) | ![Shadowmask_realtime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/4f814d55-ef37-1696-5da4-5843e8316305.png) |
| 静的物体のBaked影はShadowDistanceより遠くても表示 | 静的物体も動的物体もShadowDistance内ならRealtime計算 |



## Subtractive
> Subtractive モードは直接光をライトマップにベイクするただ 1 つの混合ライティングモードです。このモードは、他の混合ライティングモードで動的な影と静的な影の合成に使用する情報を使用しません。ライトはすでにライトマップにベイクされているので、Unity がランタイムに直接光の計算を行うことはできません。

> Subtractive モードでは
> ・静的ゲームオブジェクトは混合ライトからスペキュラーまたは光沢のあるハイライトをまったく表示しません。また、主要なディレクショナルライトを除いて、動的なゲームオブジェクトからまったく影を受け取ることはできません (これについての詳細は以下を参照してください)。
> ・動的なゲームオブジェクトはリアルタイムのライトを受け、光沢のあるリフレクションをサポートします。 ただし、動的なゲームオブジェクトは ライトプローブ を使った静的ゲームオブジェクトの影だけしか受けられません。

> Subtractive モードでは、動的ゲームオブジェクトから静的なゲームオブジェクトにリアルタイムの影を投げる光源は、主要ディレクショナルライト (通常は太陽) だけです。 静的なゲームオブジェクトから他の静的なゲームオブジェクトに投げる影は、主要ライトであってもライトマップにベイクされます。そのため、Unity はベイクした影とリアルタイムの影の正しい合成を保証できません。したがって、Subtractive モードには [Realtime Shadow Color] フィールドがあります。Unity は、シェーダーでこの色を使用して、リアルタイムの影とベイクしたシャドウを合成します。これを行うと、動的なゲームオブジェクトによって影を落とされた範囲でライトマップの効果が削減されます。Unity があらかじめ決めた正しい値というものがないので、任意のシーンに対して有効な値を選択するのは、ユーザー自身の美感に基づいた選択に基づきます。

| ShadowDistance=10 | ShadowDistance=150 |
|:---:|:---:|
| ![Subtractive_Baked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/ece8d591-776b-1410-ae43-af84665cb1f0.png) | ![Subtractive_Realtime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/a9d3d2ca-d863-5210-4fdf-d09b2101ba5e.png) |

> Subtractive モードが役に立つ良い例は、外部レベルと少ない動的ゲームオブジェクトを持つトゥーンシェーディング (つまり、漫画スタイルの) ゲームを構築する場合です。

静的オブジェクトがスペキュラーやハイライトがないので
Baked IndirectやShadowmaskと違ってシェーダーから参照される想定な気がします


# Light Probe
https://docs.unity3d.com/ja/2019.4/Manual/LightProbes.html

観測点（Probe）に間接光を保存しておき、
リアルタイムライティング時に近場の観測点を参照することで計算を簡易化する機能です

観測点の配置はコツがいります

| 部屋の外 | 部屋の中 |
|:---:|:---:|
| ![LightProbe設定サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/7e263422-b754-d4e8-0cca-283d7d355ab5.png) | ![LightProbe設定サンプル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/d1993d16-f5bb-d998-3b3d-0b44ee57b531.png) |
| 壁の内側と向こう側の観測点は注意して配置すること<br>うっかり壁の向こうの観測点を参照するとライティングが明らかにバグる<br>入口付近もRealtimeと交わるので細かく配置する | ライト付近は一定距離で置かないとライティングがおかしくなる

### 編集方法
![LightProbeGroup_Inspectro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/91452e93-f779-dd6e-501a-a15bd7a8e84a.png)

Add Probeすると8個のLight Probeが追加される
Light Probeは選択が可能なので範囲選択かAll Select
あとはDuplicate Selectedで量産していくのが簡単

# Refrection Probe
https://docs.unity3d.com/ja/2019.4/Manual/ReflectionProbes.html

観測点（Probe）からみた景色を保存しておき、
Metalicな物体の反射に利用する機能です

| Skybox | Cubemap |
|:---:|:---:|
| ![ReflectionProbe_MissSample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/7d933eca-f985-7a60-5fe9-2a8fe1c3d468.png) | ![ReflectionProbe_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/33d58c53-f4a6-61a4-f65d-46b51879f172.png) |
| Metalicな球体が壁を無視してSkyboxを描画してる | Metalicな球体が部屋の中の環境光を保存して描画してる |