【Unity】URPを使ってVtuberの配信を構築したら思ったより便利だった件

こんにちはっ🌟八ツ橋まろんです

UnityのURP(Universal Render Pipeline)を使ってVtuberのライブ配信を行ったので、URPを使ってよかったことについて書いていきます。(Unity2021を使用)

該当の配信はこちら。**背景消失・衣装変身の演出を含め渾身のHOT LIMITを披露したBΣretta Crossrain(ベレッタ・クロスレイン)さんの配信も是非見てみてください。**(46分30秒～)
https://www.youtube.com/live/0WGf1tdZRoU?si=H6914TAXuN1QwLi0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/034b9df2-01a0-74f4-eafc-8451f413ddc9.png)


# 1. URPのカメラスタック機能で簡単合成
URPのカメラにはスタック(Stack)という項目があり、カメラ映像の合成が簡単にできるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/ee6f0121-b3b5-24c0-f093-1265f025b14e.png)

従来だと2つのカメラの映像合成はカメラのDepthを調整して順番を制御したり、Render Textureを使ってCanvas上で重ねたりしていたりと、面倒な作業があった上に、カメラ映像をそのまま重ねることになるので前後関係が正しく反映されなかったりして、カメラの合成は困難でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/781364c1-fd9f-b11b-117a-2a918445946c.png)

URPのカメラスタック機能は、Stackの項目があることでどのカメラを重ねているのか視覚的にわかりやすく、さらに前後関係がきちんと処理されるのでカメラ合成が容易です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/043d6e3f-af14-c6c6-4cf6-0cefe4c4a37c.png)

さて、なぜわざわざカメラを合成するのかというと、**キャラクターに対してポストプロセスを追加したい**からです。

URPのカメラは、ベースとなるカメラのレンダリングの後、Stackに設定したカメラが上から順に処理されてゆきます。

下の図では、ベースとなるカメラはSkyboxだけレンダリングして、キャラクター(Avatar Camera)と背景(Environment Camera)をスタックしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/a868397d-a703-e0ed-5c30-1c6c4d839929.png)

ポストプロセスが有効になっているカメラは「PP」マークが右に付きます。

**スタックしているカメラは上から順に処理される**ので、この図では
⓪ベースカメラをレンダリング(Skybox)
①Avatar Cameraをレンダリング
②Avatar Cameraに対して有効なポストプロセスの処理
③Environment Cameraをレンダリング
④Environment Cameraに対して有効なポストプロセスの処理
の順に処理が行われます。

そのため、キャラクターは②と④で2回ポストプロセスが処理され、背景は④でのみポストプロセスが処理されます。

**④のポストプロセスで全体の色調整をした後、②のポストプロセスでキャラクターの追加調整ができる**ということです。(正確にはSkyboxも②の影響を受けるので少し気を付ける必要はある)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/e7318155-0ab9-6e76-c9ed-5908104f6588.png)

# 2. URPはカメラごとにレンダリング方法を変えられる
これが個人的にURPの一番の特徴だと思います。

URPはどのようなレンダリングを行うのかをアセットで設定します。
下図のアセット。デフォルトでは**URP-HighFidelity**に設定されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/a0384c2b-e0a8-dd2f-dbd9-1f9569ae6daf.png)

例えば**URP-HighFidelity**では**URP-HighFidelity-Renderer**の設定でレンダリングするようにRenderer Listで指定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/453d4f2a-8bf2-8d48-c632-5b1fd8ec83b9.png)

**URP-HighFidelity-Renderer**は
・Filtering項目にある通り全てのレイヤーをレンダリングする
・Forwardレンダリングをする
・追加でScreen Space Ambient Occlusion(SSAO)をかける
というレンダリング設定になっています。
(Built-inではポストプロセスの項目にあったSSAOですが、URPではここにあります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/7a2c8e7e-c4f1-4013-0857-3e4083406c40.png)

Renderer Listは複数登録できるので、キャラクター用と背景用、何もレンダリングしない用の3つを追加して使っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/c3d67706-1e88-92b8-454d-4f010cff5b33.png)


そして、URPのカメラ側で、どのRenderer Listに則ったレンダリングをするのか指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/5db071f1-acbe-2e9e-dbcc-491023df0800.png)

以上により、
・キャラクター用のカメラはForwardの方式でレンダリング
・背景用のカメラはForwardの方式でレンダリングした上に、SSAOをかける
という使い分けができます。

画像：SSAOにより部屋の隅が暗くなって立体感が出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/39daf73e-9afd-d10f-3456-04593b1876e8.png)

(Built-inだとキャラクターにもかかってしまうため扱いが難しい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/0767c2dc-3efd-81d6-c700-72295f443442.png)

また、背景だけDeferredレンダリングにすることで、背景に多くのリアルタイムライトを使用したシーン構築も可能になります。
(Deferredレンダリングではシャドウなしの複数リアルタイムライトの処理コストがForwardよりも小さいため)

※ソシャゲの『学園アイドルマスター』でもキャラクターをForward(正確にはForward+)、背景をDeferredでレンダリングしているらしい。
[CyberAgent DevelopersのYouTubeチャンネル](https://www.youtube.com/watch?v=LEi8r3OxLeE)


# 3. Visual Effect Graphが使える

URPではVisual Effect Graphを使ってGPUを使ったパーティクルエフェクトが使えます。Visual Effect GraphはパッケージマネージャーのUnity RegistryからインポートできるUnity公式のパッケージです。

Unityの通常のパーティクル(Particleコンポーネント)はCPUで処理していますが、Visual Effect Graphで作ったエフェクトはGPUで処理をするため、大量の粒子を扱うことが可能です。

通常のパーティクルでは数万や数十万の粒子を出すとフレームレートに大きく影響しますが、Visual Effect Graphなら問題ありません。

画像：配信中に使う水柱のパーティクルエフェクト。使っている粒子は水柱1本で10000粒ほど。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/c9530f24-a523-b5ce-bced-219d70538862.png)

パーティクルが多いとより映えるので、Visual Effect Graphを使えるのはURPの大きな利点の一つになります。

# おわりに
以上、URPに関連した有用ポイントを説明しました。

URPに関連しない制作Tipsについては、[こちらのツイート](https://x.com/Maron_Vtuber/status/1818427190415077439)で紹介しているので、ぜひ参考にしてみてください。

それではっ🌟