Unity6でAdaptive Probe Volumesを使ってみる

Unity6で使用できる新しいライトプローブ関連機能である「Adaptive Probe Volumes」を使ってみたので、導入とちょっとしたメモなどを軽くまとめてみました！
※ライティング初心者なので、間違っていたことを書いていたらご一報ください...!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/e460ba9e-a99d-c364-8d54-d4040eea6a14.png)

挙動を確認した環境
Unity 6000.0.26f1

# Adaptive Probe Volumesとは？

:::note
**そもそもライトプローブって？**
空間上の光の情報を一定間隔の情報にして、あらかじめ保持(ベイク)しておく機能です。
この情報を使って、わざわざランタイムで複雑な光を計算しなくても綺麗な環境光が再現できます。

公式：https://docs.unity3d.com/ja/2023.2/Manual/LightProbes.html
(こちらは旧ライトプローブの解説ですが、参考になります)
:::

Adaptive Probe Volumesは従来のライトプローブを扱いやすく、さらに高機能にしたライティング関連機能です。

今までのライトプローブは手動で配置するのが煩雑だったり、精度を高く間接光を取得できないなどの問題がありました。

これを手軽に、精度高く実現できる機能です！
公式の解説なども参考にしてみてください。

[(youtube)Unityの新しいライティング機能 Adaptive Probe Volumes](https://www.youtube.com/watch?v=4eIAWo-Gmiw)

https://unity.com/ja/blog/engine-platform/new-ways-of-applying-global-illumination-in-unity-6

https://docs.unity3d.com/6000.0/Documentation/Manual/urp/probevolumes.html

# Adaptive Probe Volumesを導入してみる
その前に、自分が試した環境と状況を書いておきます。
よりAdaptive Probe Volumesの効果がわかるように、リアルタイムライトなし(Directional LightのModeをBaked)、影はライトマップに焼き込みます。

- Unity 6000.0.26.f1
- Render Pipeline: **URP**
- Platform: Android
- Directional Light
  - Mode: **Baked**
- Lighting Settings
  - Lighting Mode: **Subtractive**
- 環境オブジェクトはライトマップを適用

## Adaptive Probe Volumesの有効化
Adaptive Probe Volumesを有効にするには、`Universal Render Pipeline Asset`(URPの設定)を編集する必要があります。

Lighting -> 「Light Probe System」を`Adaptive Probe Volumes`に切り替えましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/e4e1a840-974c-fee7-649f-d979d419e647.png)

## オブジェクトの配置
次に、オブジェクトを配置しましょう。
これはお好みで...

今回はライトマップも焼こうと思うので、オブジェクトはstaticにしてMesh Renderの`Receive Global Illumination`は`Lightmaps`に設定しました。

ライトプローブの影響を受けるオブジェクトとして、Capsuleを追加しました。
このオブジェクトはデフォルトのLitシェーダがMesh Rendererに指定されています。

![スクリーンショット 2024-11-25 21.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/75385fe0-e065-9716-185a-a5e3e7763447.png)


最後に重要な`Adaptive Probe Volume`コンポーネントを持つGameObjectを追加します。

ヒエラルキーでCreate -> Light -> Adaptive Probe Volume で追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/9da2e964-36c6-6220-468c-195d2ad0cb1e.png)

Modeを`Scene`にしましょう。
`Scene`にするとそのシーンに配置されているMeshの範囲に応じて有効範囲を定めてくれます。
範囲を手動で絞りたい場合は`Local`で編集すると良さそうです。

この時点で`Adaptive Probe Volume`に警告が出ているかもしれませんが、次の工程を踏めば消えるはず...です。

## Probe Volumesのベイク
次に、Window -> Renderering -> Lighting  でライティング設定を表示しましょう。
今回は以下の設定のようにして...`Generate Lighting`ボタンを押しましょう！

（補足１：Lighting Modeは目的に応じて設定してください。今回は`Subtractive`にしてあります。）
（補足２：上記以外はデフォルトのままになっています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/27a681ed-47ce-d924-e3aa-4ceaecb4fe83.png)

少し待つとベイクが完了します。
ウィンドウの右下あたりに進捗が出ていますね(macで確認)。

## ベイクできてるかどうか確認
ベイクが終わると、今回はライトマップも焼いているので見た目が綺麗になります。
...が、コレだけだと本当にライトプローブもベイクされているのかわからないので、便利なデバッグ機能を使いましょう。

Window -> Analysis -> Rendering Debugger からツールを開きます。

そして、Probe Volumesタブの`Display Probes`をチェックして有効化しましょう。

![スクリーンショット 2024-11-25 21.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/a2bb4e2d-2404-0188-0f9c-e30b32a3a7fd.png)

そうすると玉がたくさん表示されるはずです。
このような表示になれば、ライトプローブは正しくベイクできております。

![スクリーンショット 2024-11-25 21.24.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/f96c9ab0-6a54-08b9-a31f-d6e8719307eb.png)

## ライトプローブの挙動確認
動的オブジェクトのCapsuleくんを動かして、挙動を確認してみましょう。

![apv_preview-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/70593726-9059-2b7e-2540-7f273fdbf3f8.gif)

ちょっとわかりづらいですが...影の中に入ると色が変わっていますね！

## Android環境での注意事項
実際に自身の既存プロジェクトで遭遇したのですが、ライトプローブをベイクしようとすると下記のエラーが発生しました。

![スクリーンショット 2024-11-25 18.50.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/aced68ae-5b1d-26fc-f04f-10c1ab85037a.png)

こちらは、Player SettingsのGraphics APIに`Vulkan`を追加すれば解消されました！

![スクリーンショット 2024-11-25 18.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/0d1b4b3f-bc24-d7ad-b391-b28007a0e79c.png)

## おまけ
自身の既存プロジェクトではUnity Toon Shader(現時点の最新版は0.10.2)で使用しようとしたのですが、うまくいきませんでした...

微細な影響はみられたのですが、実用の範囲内ではなく...

正し、従来のライトプローブなら問題なく動作していたので、対応待ち...ということになりそうです。

# まとめ
準備が整えば、あとはコンポーネントからのベイクからも行けそうです。
ベイク時間もそんなにかからず、神機能ですね！

略してAPV...この機能が発表された時から心待ちにしていた機能なんですが、なるほどシェーダー側での対応も必要っぽいですね...
Unity Toon Shaderの対応を心待ちにしております... :wink: