【Unity】HDRPを使ったありえん美しいリアルタイムVtuberライブ制作

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

以前UnityのURP(Universal Render Pipeline)を使ったVtuberのライブ配信の制作について[記事](https://qiita.com/Maron_Vtuber/items/18a26c06e72de6e78c1f) を書きました。

今回は、HDRP(High Definition Render Pipeline)を使ったライブ配信の制作をしたので、HDRPでライブ制作をする際のポイントについての記事です。
[該当の配信はこちら](https://www.youtube.com/live/SGbLFpM1K1M?si=68zGnWV4DXNVFJ7V)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/0cd2aa49-bc0c-f97c-bb43-7d0444cfd968.png)


# 1. HDRPのレンダリングの特徴とライトの機能
HDRPはよく **「フォトリアル」** や **「豪華なライティング」** と言い表されます。

HDRPが通常のUnityと大きく異なる点は、**Deferred Rendering(ディファードレンダリング)** であるところです。これにより **リアルタイムのライトによる負荷上昇が小さい** ので、リアルタイムライトをたくさん使えます。(説明は割愛)
**※Built-inのUnityはデフォルトではForward Rendering(フォワードレンダリング)です**


他にもHDRPの特徴はたくさんあります。
通常Lightコンポーネントはオブジェクトだけを照らしますが、HDRPではVolumetric Fog機能(ボリュメトリックフォグ)によって空間が照らされ、 **ライトの軌跡が見える** ようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/0575fa71-5d4f-2586-b3b0-3a7b9b6c1a73.png)

また、Light Layer(ライトレイヤー)を分けることで **キャラクターと背景3Dモデルに照射するライトを分ける** ことができます。(これはBuilt-inでもレイヤー機能で可能)

さらにShadow設定を変更することで **「キャラクターの影だけを床に映す」** ことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/f8ce5769-ae17-9dd5-8bb7-6332957e8e6c.png)
上の画像では、緑色のライトが床だけを照らし、キャラクターには緑色は乗らず、影は床に投影されています。(ついでに影色はピンクを指定しています)

従来だと専用のアセットを使ったり、シェーダーを書いて影だけを表示する床を作ったりしますが、標準機能で対応できるのが嬉しいですね。

# 2. HDRPのレイトレース系の機能
HDRPの見た目がリッチになる大きな要因が、Raytrace系(レイトレース)のポストエフェクトです。

①Screen Space Ambient Occulusion(スクリーンスペースアンビエントオクルージョン)
②Screen Space Global Illmination(スクリーンスペースグローバルイルミネーション)
③Screen Space Reflection(スクリーンスペースリフレクション)
など

①Screen Space Ambient Occulusionは、空間の隅を暗くするエフェクトです。従来でも使用できましたが、HDRPではRay Tracingモードが追加されています。このモードではより精密に空間を判定するので、従来より正しくアンビエントオクルージョンを適用できます。
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/bbdec896-8047-3c4b-561f-00a1e8b5b86f.png)


②Screen Space Global Illminationは、リアルタイムライトでは行われない反射光の計算をポストエフェクトとして疑似再現します。特に負荷が大きくなりやすいので、「Ray Marching」「Ray Tracing」「Mixed」「無効」をすべて試して見た目と負荷具合を調べておくのがおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/8ec3244e-4b49-c54c-69d3-c45545f20123.png)


③Screen Space Reflectionは、反射計算をポストエフェクトで行います。反射の再現は従来からReflection Probeが存在するので、どちらがいいかは負荷具合と合わせて検討しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/98cf9c2f-9469-09a6-548c-2a69e3eb53c6.png)


# 3. Timelineを使ったライト演出の制作
配信ではムービングライトを多数つかったライト演出をしました。

それぞれのライトの色や動きを一括で制御するスクリプトを作り、Timelineから色制御とライト強度の制御、ライトの向きの制御をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/ad0578f5-c4fc-6024-4837-0dda6e220c11.png)

ムービングライトは全部で29個です。これらはすべてリアルタイムライトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/4306c552-1dd8-18a4-c16f-31fe2683bd47.png)

ライト演出は以下をたくさん使いました。ライト演出を作ったり、ライト制御のスクリプトを自作したい人は参考にしてみてください。

・サーチライト
![Gif_10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/2f8e807f-bf93-acd1-c137-0573ff496b31.gif)


・Look at target
![スクリーンショット 2025-01-20 103708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/21e78e75-c9f7-8815-9cd2-6acb00ca52fd.png)

・単発のフラッシュ
![Gif_14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/f9a20fa3-52fd-b570-f041-cff42a129611.gif)


・BPMに合わせてフラッシュ
![Gif_13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/f20d83cf-01f8-f644-1b63-3eef2dc06a5e.gif)



・ランダムに明滅
![Gif_11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/ceaf0d32-1e46-02a1-7d55-0c10cf40efa7.gif)

また、配信で使用したライト制御のスクリプトは[pixivFANBOXで配布](https://maron.fanbox.cc/posts/8565652)しています。

# 3. 観客モデル
観客モデルを大量に配置して、リアルタイムにアニメーション制御しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/b5e07a13-a53b-d401-0e51-ce1ee630aa62.png)



普通のアニメーションで制御するとGPUスキニングのコストが大きく大量には扱えないため、シェーダーアニメーションによって制御しています。
詳しくは[pixivFANBOXの記事](https://maron.fanbox.cc/posts/8835556)で解説しています。

シェーダーアニメーションを実現するのに有用なのがGPU ECS Animation Bakerアセットです。これを元に、観客をTimelineで操作するスクリプトを作成して配信で使いました。
(詳細は[pixivFANBOXの記事](https://maron.fanbox.cc/posts/8837483)にて)

# 4. Visual Effect Graphによるパーティクル表現
パーティクル表現はVisual Effect Graphで作成しています。
(まだ勉強中なので語れることは多くありませんが)

衣装変更のパーティクルでは、コライダーを設定して床を転がるようにしています。
![Gif_15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/7f2d88d5-ba0c-ec29-9a24-631c304dea14.gif)


# 5. 描画負荷の軽減対策
HDRPはリッチな表現ができる反面、設定を間違えるとすぐに高負荷になってしまうので、適切に対策をする必要があります。どの機能の描画負荷が高いのか、事前に検証して順位付けするのがいいでしょう。


以下は、一般的な負荷対策ポイントです。

**・影ありのライト数は制限する**
ディファードレンダリングにより、大量のリアルタイムライトを使ってもそれほど負荷が高くなりませんが、影の描画はその数だけ負荷が増えるので、影ありのライトは最低限の数にします。

**・レイトレース系の機能は一通り試す**
特にScreen Space Global IllminationとScreen Space Reflectionは

Ray Marchingモード
Ray Tracingモード
Mixedモード
無効

の4種を試して、プロジェクトに合った負荷を選択するのがいいと思います。

**・Dynamic Resolutionを活用する**
Dynamic Resolutionは、小さい画面で描画したあと引き延ばして目的の解像度にする機能です。これにより、フラグメントシェーダーの処理やポストエフェクトの処理が軽くなります。

代わりに引き延ばしの処理のための時間が増えますが、削減分の方が大きいです。
特にレイトレース系の処理の軽減には有効だと思います。
[過去に試したツイート](https://x.com/Maron_Vtuber/status/1826245968561578133)

以上、HDRPを使ったリアルタイムライブ制作のポイントでした。

上で紹介している[ライト制御スクリプト](https://maron.fanbox.cc/posts/8565652)・[観客制御のスクリプト](https://maron.fanbox.cc/posts/8837483)は、pixivFANBOXで詳しく紹介しているので、興味のある方はぜひ見てみてください。

それではっ🌟