【Bakery】Unityでライトベイクをしつつ動的アイテムにリアルタイムライトを用いて影を落とす方法

こんにちは。Till0196(@till0196_vrhcat)です。
ここ2年ほど継続して「VRChatterにとって最高のVRChatホームワールド」を目指してワールド制作をしています。
この記事ではライトベイクとリアルタイムライトの併用について自分の中で分かったことを書いています。

私はCGの表現やUnityに精通しているわけではない普通のVRChatterなので、「私の単純な間違いや、ここではこう書いているけどホントはこうだよ」などあればDiscordのDMなどで教えていただけると幸いです。

ライトベイクの難しさ

Unityのライティングは、よくできていて難しいことを考えずにUnityのデフォルトのライティング設定でVRChatのワールド制作をしていれば、当たり前のようにピックアップアイテムやアバターに影が落ちます。
しかし、全てリアルタイムライトで制作していると軽量化やリッチな画作りをするにあたって大きな障壁になると思います。
そこで、人々は光源データを焼き込むライトベイクに行き着くかと思います。

しかし、ライトベイクは本当に奥が深く、中々思ったように行かないことがあります。特にベイクライトのみの設定だとピックアップアイテムやアバターの影はなくなります。

そこでリアルタイムライトとライトベイクを組み合わせて使用する方法を調べたのですが、なかなか答えを見つけきれず、どうしようもないのかなと思っていました。

ところが、ある日のことlilToonの作者であるlilさんが、リアルタイムライトとライトベイクの併用に関する解決策を下記のようにツイートしていたのを見かけました。

この記事ではその内容を参考に作成しました。

一般的に、リアルタイムライトは描画の綺麗さを犠牲にして、高速で影や明るさを制御するため品質が悪くなることがあります。
一方、ライトベイクは、時間をかけて影や光情報を計算して記憶させることができるため、リアル世界顔負けの光表現や影の表現ができます。
しかし、リアルタイムライトとライトベイクを併用すると、見た目に統一感がなくなることがあります。このような背景から、リアルタイムライトとライトベイクを併用することは珍しいと思われます。また、ベイクライトとリアルタイムライトを併用するとリアルタイムライトのみに比べれば負荷が少ないですが、ベイクライトだけに比べると負荷は上がるので、そこはトレードオフな部分だと思います。

リアルタイムライトとライトベイクを併用するには

適切なライトプローブの設置、ベイクライトの設置と設定、ベイクモードのシャドウマスクへ変更が必要です。
ライトプローブは、リアルタイムライトによる負荷を軽減するためだけでなくシャドウマスクの利用時には非常に重要になります。

この記事ではUnity内蔵のライティング機能を使わず、Unity Asset Storeで販売されている有料アセットBakeryを用いた設定方法を記載しています。
未検証なので確信がないのですが、シーン内のライトが4つ以下ならBakeryなしでも同じようなことができるかもしれません。

ライトプローブの設置

私は、ライトプローブの配置にProbeGridAndCutという無料アセットを用いて四方あたりに◯×◯×◯個を設置するという風にしています。
アセットを頼らずに手作業で設置することもできますが、あまりにも手間で大変だと思います。
このアセットの他の機能として色の差が閾値以下ならプローブの玉を削除するということもできます。
私は持っていませんが、Magic Light Probesという定番の有料アセットならもっと簡単にできるかもしれません。

ライトの設置

次にライトを設置します。今回はポイントライトの画像を利用していますが、ディレクショナルライトでも同様の設定をすることができます。 Bakeryは、Unity標準のライトコンポーネントを削除して代わりにBakeryのコンポーネントのみでも動作しますが、共存することもできます。

上記画像のように、Unity標準のライトコンポーネントのモードを「混合(※英:Mixed)」に変更し、BakeryのライトコンポーネントのBake contributionを「Shadowmask and Indirect」に設定します。

Unity側のライティング設定

Unityエディタ上部の「ウィンドウ」→「レンダリング」→「ライティング設定」からライティング設定を開きます。

この設定画面で「混合ライティング」の項目にある「ベイクしたグローバルイルミネーション」へのチェックと、「ライティングモード」を「シャドウマスク」に変更します。

Bakeryの設定

Bakeryのレンダリング設定を変更します。
「Render Mode」を「Shadowmask」に、「Occlusion probes」のチェックボックスをオンにします。

以上の設定でBakaryのRenderとRender Light Probesを実行するとリアルタイムライトとベイクライトの併用ができるようになると思います。

まとめ

この手順で目標達成ではあるのですが、現行のVRChatは負荷軽減のためなのかシーン側で設定した品質設定が無視されていて、品質低い影しか表示できないようです。
実在感を出すための影描画ですが、負荷との兼ね合いや設定や調整が難しいことが多く、乗り越えるべき課題は山積みのようです。

これは個人的な見解で蛇足な話ですが、3DCG初期のプレステ時代の影や「どうぶつの森シリーズ」のようにリアルなシャドウを実現するより抽象化した丸影を表示したほうが、UX的にも負荷的にも良いような気もします。