🔆

Bakeryでライトベイクをしてみよう【Bakeryでするライトベイク入門編】

2023/12/06に公開

この記事は「Cluster Creator #1 Advent Calendar 2023」の6日目の記事です。
https://adventar.org/calendars/8609

UnityのライトベイクはBakeryで最強になれるらしいぞ!

「Unityのリアルタイムなライトは重いので、ライトはベイクしておこう。そうすれば軽くなるよ!」
という話はよく言います。というか、そもそもライトベイクってなんなん?って話からしていきましょう。

❓ライトベイクとはなんなのか、その目的

ライトベイクという単語の意味からひも解くと、ライトを焼く(Bake: ベイク)という意味です。
通常ライトベイクをしていない状態のリアルタイムライトは、毎フレーム毎にライトの計算が行われます。
そのため、「リアルタイムなライトは重い」と言われるのです。
https://docs.unity3d.com/ja/current/Manual/LightMode-Realtime.html

🤔ライトベイクは何をしているのか

ライトベイクをすることで、ライトを照らすことによって照らされる面の光の色や、影をオブジェクトのテクスチャに焼きこみます。
事前に計算を行ってテクスチャとして焼きこんでおくことで、リアルタイムのライトとほぼ大差ない環境を表現できます。

ライトベイクによって生成されたライトマップ

ベイクされたライトマップを適用したシーン

ベイクされたライトマップのみをプレビューしたシーン
clusterでのワールド制作で、影を表現したい場合は、ライトベイクは必須です。
ドキュメントに書いてある通り、clusterのワールドではリアルタイムシャドウが生成されないと明記されています。
そのため、ライトベイクされていない影は、Unity上で影が見えていてもアップロードすると影が消えてしまいます。
https://docs.cluster.mu/creatorkit/world/lighting-world/

✅ライトベイクをする利点

ライトの情報がテクスチャと化しているので、リアルタイムのライトのように毎フレームの計算が必要になりません。

🍀Ambient Occlusionはいいぞ

また、Ambient Occlusionを計算することが可能です。
Ambient Occlusionを使用することで、オブジェクトとが接地した面に現れる接地影を描写することができます。
PostProcessing VolumeにもAmbient Occlusionがありますが、こちらはスクリーンスペース・アンビエント・オクルージョンのようなものなので、高いクオリティでリアルタイムで描画されます。描画コストは高く、unlit系のシェーダーが半透明に描画されることもあるという問題もあります。
https://ja.wikipedia.org/wiki/SSAO

Ambient Occlusionなし

Ambient Occlusionあり (Intencity: 1.5)
Ambient Occlusionをつけると、のっぺりとした雰囲気にはならず、リアリティが出ます。Ambient Occlusion使いましょう。使うと空間がぐっと引き締まります。

Unityのライティング/ライトベイクを始めよう

💰Bakeryを買おう

今回の記事は、Bakeryを使用することを前提に進めていきます。
Unity標準のライトベイク機能は、1回のベイクにとても時間がかかります。GPUでライトベイクを行うモードもありますが、所要時間が短くなることが期待できますが、多少のノイズが発生するなど、実用面での問題がある面もあります。
作業の効率化、クオリティの面から、Bakeryというアセットを導入することをおすすめします。
https://assetstore.unity.com/packages/tools/level-design/bakery-gpu-lightmapper-122218?locale=ja-JP
BakeryはGPUを使用して短時間でライトベイクを行うためのツールです。Unity標準のGPUライトベイク機能よりも実用上問題のないクオリティの高いベイク結果が期待できます。

🌤Bakery用のライトをセットアップしよう

Bakeryでライトベイクを行うには、Bakery専用のライトコンポーネントを使用してライティングを行う必要があります。
Unity標準のライトコンポーネントでライティングを行っても、Bakeryでは認識されずに、何も描写されていない真っ黒のライトマップが生成されるだけです。特にライトがセットアップ済みのシーンをライトベイクする時などに注意しましょう。
Light ProbeとReflection ProbeについてはUnity標準のものがBakeryでも使用できます。(Reflection Probeについては後述します)

ライトを作成する

Bakeryをインポートすることで、Unityのツールバー上のBakery => CreateからBakery用のライトを作成できるようになります。

ライトの種類 (Bakeryのコンポーネント名)

Directioal Light (Bakery Direct Light)
減衰せず、太陽光のように振る舞います。
Unity標準のDirectional Lightと似た挙動をします。

Skylight (Bakery Sky Light)
SkyboxやHDRI画像を環境光として使用します。

Point Light (Bakery Point Light)
球体上に広がる光源で、中心から遠くなるにつれて減衰します。
Unity標準のPoint Lightと似た挙動をします。
使用するためには、Bakery Point LightコンポーネントのProjection maskをOmniに設定します。

Area Light (Bakery Light Mesh)
発光する板型のライトです。Createメニューから生成すると、Emissionが適用された板ポリゴンも生成されます。
Unity標準のArea Lightと似た挙動をします。

Spotlight (Bakery Point Light)
コーン型のライトです。Unity標準のSpot Lightと似た挙動をします。
使用するためには、Bakery Point LightコンポーネントのProjection maskをConeに設定するか、Cookieに設定して、テクスチャを設定します。

Volume
UnityのLight Probeのような振る舞いをします。
(あまり触ったことがないので、今回は省略します。というかclusterで動くのか未検証)

🗒️パラメーター

共通パラメータ

Color
光源の色を設定します
Intensity
光源の強さを設定します
Samples
影のサンプル数を指定します。
この数値を上げるほど、影のレンダリングの回数を増やすため、品質が上がります。影にノイズが発生している時などに数値を上げます。
(PointLightでSamplesを0にすると、影を無効にすることができます)

Bakery Sky Light

Sky texture
スカイボックスを設定します。
[Match this light to scne skybox]
ボタンを押すと、Light Settingsの設定をロードして、パラメータを再現します。
[Match scene skybox to this lgh]
ボタンを押すと、Light SettingsにこのSky Lightのパラメーターを設定します。

Bakery Point Light

Shadow spread
影のぼやけかたを設定します。0から1に近づくほど、影がぼやけていきます。

Range
光源の広がる範囲を指定します。

Projection mask
ライトの形状を指定します。

  • Omni
    • Unityのポイントライトと同等の点光源です
  • Cookie
    • Cookie textureでマスクされた形状のライトを一方向に照らします
      Cookie texture マスクするテクスチャを指定します
      Angle: 投影する角度(面積)を設定します
  • Cone
    • コーン型の形状で一方向に照らします
      Outer angle 投影する角度(面積)を設定します

すでに設定されているUnityのライトのパラメーターを基に、Bakeryのコンポーネントを設定する

アセットを購入して、そのシーンをBakeryでライトベイクしたい時などに使える機能です。

Area Lightの場合

Area Lightが設定されているオブジェクトに、Bakery Light Meshをアタッチして、**[Match lightmapped to area light]**を押します。

Point Light / Spot Lightの場合

Point Light / Spot Lightが設定されているオブジェクトに、Bakery Point Lightをアタッチして、**[Match lightmapped to real-time]**を押します。

Directional Lightの場合

Directional Lightが設定されているオブジェクトに、Bakery Direct Lightをアタッチして、**[Match lightmapped to real-time]**を押します。

✅オブジェクトをStaticにマークする

ライトベイクを行うには、ライトベイクをされるオブジェクトをStaticにマークしておく必要があります。
これはライトベイクを行う対象のメッシュがあるオブジェクトすべてに、行う必要があります。
たまに、とりあえずStaticにマークするという話もありますが、ライトベイクをするという目的では、画像のようにContribute GlReflection Probe Staticが有効にされていればライトベイクがされます。

🌤いざ、ライトベイク

ライトを配置しよう

環境光を設定する

Skylightを作成して、Directional LightオブジェクトにDirectLightをアタッチします。Skylightは**[Match this light to scne skybox]*を押して、Lighting Settingsの設定をSkylightに読み込んでおきます。DirectLightは[Match lightmapped to real-time]**を押して、Directional Lightのパラメータに合わせておきます。

ライティングをする

お好みのライトを配置していきましょう。

Staticにオブジェクトを設定する

オブジェクトをStaticにマークするを参考に、静止しているライティング対象のオブジェクトをStaticに設定します。

ライトベイクの設定をする

今回はライトベイクの設定の深堀はしません。(またどこかで取り上げれたらします)
Bakeryの設定画面を開きましょう。ツールバーのBakery => Render lightmapを選択して開くことができます。

いつも自分が使っている設定を載せておきます。
詳細設定を表示するために、最上部のSettings modeAdvancedに設定します。

設定画面の下部にあるRenderボタンを押すことで、ライトベイクを開始します。
前の項で述べた、Ambient occlusionの設定は、Ambient occlusionの折り畳み内にあります。
レンダリングの結果をもとに、Intensityを調整して、影の強さを調整してください。

ここまで、bakeryを使ったライトベイクの解説でした。ライトベイクをして、さらにクオリティの高い空間表現をしていきましょう。

小ネタ ネットワークベイキング

Bakeryには、ネットワークベイキングという機能があります。
この機能を使用することで、ライトベイクをUnityを開いているPCとは別のPC(Unityが動作しているPCでも可能)で行うことができます。
Bakeryのライトベイクは、ベイク中にシーンが閉じられて作業ができなくなりますが、ネットワークベイキングの場合、ライトベイクを別PCで行っている最中でもシーンの編集が可能です。 
https://geom.io/bakery/wiki/index.php?title=Network_baking

手順

Unityプロジェクト内のAssets/Editor/x64/Bakeryをライトベイクを実行するPC上にコピーします。
ベイクを実行するPCではフォルダ内のftServer.exeを起動しておきます。
最上部のSettings modeExperimentalに設定し、Network Bakingの折り畳み内にあるBake on remorte serverを有効にします。
IP addressには、ftServer.exeを実行しているPCのIPを指定して、Connect to Serverを押します。

Server: Idleと表示されれば、準備完了です。
通常通り、Renderを押してライトベイクを開始すると、ftServer.exe上でライトベイクが開始されます。ステータスには、ベイクの進行状況が表示されています。
ベイクが完了すると、ステータスがServer: Idleに戻ります。Get dataを押すと、ライトベイクの結果をシーンに反映します。

Discussion