2024年08月03日 - メタバース

Unityでライトベイク

clusterの温泉ワールド」を制作したさい、Blenderでライティングも含めたテクスチャをベイクしました。その結果、ワールドの質感は向上しましたが、オブジェクトの配置を変更するたびにBlenderで再ベイクし、UnityでFBXを再読み込みする必要があり、ワールドの更新性が低下してしまいました。そこで、Unityでライトベイクをする方法を調べました。

ライトベイクとは

ライトベイクは、光の計算を事前に行い、その結果をライトマップというテクスチャ画像に保存する機能です。
clusterは最近、リアルタイムライトの影の生成に対応しましたが、clusterのリアルタイムライトは同時に2つまでしか動作しないため、ライトベイクを使用することで、ワールドの質感を向上させつつ、リアルタイムのレンダリング負荷を軽減できます。

Unityでライトベイク

Blenderで簡単な部屋の3DCGモデルを制作し、Unityでライトベイクをします。3DCGモデルは、ライトベイクの結果がわかりやすいように、テクスチャを設定せずマテリアルのみを設定しました。

clusterのワールド制作環境を構築

clusterのワールド制作環境を構築します。
詳細は下記を参考にしてください。

シーンはMinmalSampleを使用します。
DirectionalLightは必要ないので削除します。

Blenderでモデリング

Blenderで簡単な部屋の3DCGモデルを制作します。モデリングについては、下記を参考にしてください。

BlenderでオブジェクトにUV2を追加

BlenderでモデリングしたオブジェクトにUV2を追加します。UV2はライトマップ用のUVです。

まず、オブジェクトのスケールをCtrl+Aで適用します。次に、プロパティの「オブジェクトデータ」タブでUVマップを追加します。名前は任意でかまいませんが、「UVMap2」とします。UV2をUVマップに重なりができないようにスマートUV投影などで展開します。スマートUV投影で重なりを避けるためには、アイランドの余白を設定します。また、UV2は全て範囲内に収めるようにします。

UnityでFBXを読み込み

BlenderでオブジェクトをFBXに出力して、Unityで読み込みます。詳細は下記を参考にしてください。

インスペクタの「静的」にチェックを入れる

ライトベイクで影をつけることができるのは動かないオブジェクトのみです。
UnityでFBXを読み込んだら、影をつけたいオブジェクトのインスペクタの「静的」にチェックを入れます。
また、影をつけたい場合はライティングの「投影」を「オン」にし、影を受けたい場合は「影を受ける」にチェックを入れます。

ライトのモードを「ベイク」に

ポイントライトを追加し、インスペクタの「モード」を「ベイク」に、「シャドウタイプ」を「ソフトシャドウ」にします。ライトの範囲と強さは好みの値を設定してください。

ライトについては下記を参考にしてください。

これでライトベイクの準備の完了です。

ライトベイクの開始

ライトベイクを開始します。まず、トップバーの「ウィンドウ > レンダリング > ライティング」をクリックして、ライティングを表示します。次に、「ライティングの生成」ボタンをクリックしてライトベイクを開始します。

「ライトマッパー」を「プログレッシブGPU(プレビュー)」に設定すると、品質は下がりますが、高速でライトベイクを行うことができます。シーンが複雑になるとライトベイクに時間がかかるため、まず「プログレッシブGPU(プレビュー)」で「ライトマップ解像度」を5にしてテストを行います。次に、問題がなければ「プログレッシブCPU」で「ライトマップ解像度」を10~40にして本番のライトベイクを行います。

複雑なシーンのライトベイク

Unityでのライトベイクは時間がかかる作業です。特にポイントライトが多い複雑なシーンでは、一度にすべてのライトを計算しようとするとメモリを大量に消費したり、時間がかかりすぎたりすることがあります。
たとえば、温泉ワールドの次に制作したカフェワールドには60個のポイントライトがありました。このような場合、シーン全体を一度にライトベイクするのではなく、部分ごとにベイクを行い、途中で影響を確認しながら進めました。