» VR開発メモトップへ

Unity ライトマップの焼き方メモ

最終更新日:2021年10月21日

Unityでのライトマップの焼き方の解説とTipsです。そもそもライトマップとは何かから順番に、引っかかりやすそうなポイントをフォローしていく形で書いてみました。

なお、著者は絵作りがそんなに上手くないので参考程度に!

更新履歴

(2021年10月2日)「スマートフォンで影が汚い・変な色が入る」を追加、間接光についての表現の誤りを修正
(2021年9月20日)とりあえず初稿


そもそもライトマップとは

3Dグラフィックスにおいてライティングはとても重い処理で、特に間接光の表現はリアルタイムで行うのが難しいため、あらかじめ3Dメッシュ上の光の強度や色を「ライトマップ」というテクスチャに焼き込んでおく(「ベイク(bake)する」とよく言います)テクニックがしばしば用いられます。

Unityでは、適切なシーン設定を行った上で、Lightingウィンドウでシーンのライトマップを焼くことができます。生成したライトマップはシーン名と同じ名前のフォルダに保存され、ビルドすると実行ファイルに含まれます。

広いシーンのライトマップをきちんと焼こうとすると、PCを一晩動かしっぱなしにして焼くようなことも往々にしてあり、陶芸の窯焼きか何かのような風情になります。失敗することも多々あります。結構大変です。

ライトマップのメリットとして、スマートフォンやOculus Questのようなモバイルデバイスでも低負荷でリアリスティックな絵を出せる場合があります。デメリットとして、焼くのが大変なのと、巨大なライトマップのテクスチャで配布サイズが増えます。また、焼き込まれた光はリアルタイムに変化させることができません。

Unityでとりあえずライトマップを焼いてみる

Unityで新規プロジェクトを3Dテンプレートで作成してください。シーンにPlaneとCubeあたりを適当に作成します。

ライトマップを焼くためのシーン設定をします。まず、Directional LightのModeをBakedに設定します。また、ライトマップを焼きたいすべてのオブジェクト、ここではPlaneとCubeについて、Inspectorの右上のStaticをオンにします。これによってそれらは「動かないオブジェクト」とみなされ、ライトマップの計算に含まれるようになります。

Windows > Rendering > LightingでLightingウィンドウを開きます。Unity 2020以降ではデフォルトでライトマップが無効化されていますが、New Lighting Settingsボタンをクリックするとライトマップが焼けるようになります。

LightingウィンドウのGenerate Lightingボタンを押し、しばらく待って、焼き終わったらCubeを動かしてみてください。影がCubeの動きについてこなくてその場に残っているようであればライトマップがきちんと焼けています。

シーンと同じ名前のフォルダにライトマップのテクスチャが生成されていることを確認してください。

Lightingウィンドウには設定がたくさんありますが、混乱したときはとりあえず新しくシーンを作るか、New Lighting Settingsで新しい設定ファイルを作って(Unity 2020以降)デフォルトに戻してみてください。ただし、最低限以下の2つの設定だけは確認しておいてください。

Auto Generate

Generate Lightingボタンの左にAuto Generateというチェックがあります。これをオンにするとシーンの変更に応じて自動的にライトマップが焼かれます。ただし、実際にライトマップ等のファイル群を生成・更新したいときはオフにしてGenerate Lightingを手動でクリックする必要があります。

Lightmapper

PCに高性能なビデオカードを積んでいる場合はProgressive GPUに変更しましょう。Progressive CPUよりずっと高速に焼けます。ビデオメモリが足りない場合はProgressive CPUにフォールバックされるので注意が必要です。

ライトマップを速く焼けるようにする

さて、ここまでで単純なシーンは焼けるようになったと思いますが、少し複雑なシーンを焼こうとすると、やたら時間がかかって全然焼き終わらない上に、だいたい設定ミスをしていて全然上手くいかないと思います。たぶんこの辺で9割くらいの人が挫折します。

ライトマップはLightingウィンドウの下記のいくつかの設定を変更するだけでとても速く焼けるようになります。実際、小さいシーンでProgressive GPUなら数秒ほどで済みます(もちろん結果はかなり雑になりますが)。速く焼ける設定にしてライティングを調整したり試し焼きをしてから、パラメーターの数値を上げてきちんと焼くというワークフローがおすすめです。ライトマップを焼くのを練習したり、機能を調べるときにも、まずは速く焼ける設定に変更しましょう。

Lightmap Resolutionを下げる

ライトマップの解像度です。焼き時間に大きく影響します。大きくすると影がくっきりし、下げると影がぼやけますがとても速く焼けます。1まで下げると影の形がまったく分からなくなってしまうので、5や10程度に下げます。

各種サンプリング数を下げる

Direct Samples、Indirect Samples、Environment Samplesをそれぞれ最低の1、8、8に下げてしまいます。特にIndirect Samplesの影響が大きいようで、Indirect Samplesだけ8にしてもいいかもしれません。

Asset Storeからインポートしたアセットを焼く

さて、こうしてライトマップの焼き方を覚えて意気揚々とAsset Store等からインポートしたアセットを焼こうとすると、たぶんこれまた全然上手くいかないと思います。

ライトがBakedになっているか、オブジェクトがStaticになっているかをチェックするのはもちろんですが、一番多いのは、影がきちんと落ちなかったり、明らかにおかしな形の影が落ちるケースです。おそらく3DモデルにライトマップのUVが含まれていませんので、3Dモデルを選択して、ModelタブのGenerate Lightmap UVsをオンにしてApplyで再インポートしてください。これで焼けるようになることが結構多いです(アセットのメッシュ割り等によってはどうしようもない場合もあります。3DCGツールを使うのでなければ、素直に他のアセットを探したほうがいいです)。

また、アセットに不要なライトや発光するオブジェクトが含まれていることがあります。Light Explorerを使用すると、シーンに配置されているライティングに影響するオブジェクトを一覧表示できますので、これで確認してみてください。Windows > Rendering > Light Explorerで開きます。

動くオブジェクトのライティング

ここまでで動かないオブジェクトの影や間接光を焼くことはできるようになったと思いますが、動くオブジェクト(たとえばプレイヤーキャラクター)にはこれらは反映されず、見た目が不自然になってしまいます。

ライトマップの仕組み上ある程度の矛盾が発生するのは仕方がありませんが、「ライトプローブ」を用いると、Staticでないオブジェクトにも事前計算された周囲の光が反映されるようになります。シーン内の必要と思われる場所に適宜ばらまいて使用します。

ライトプローブを設置するには、Hierarchyウィンドウで右クリック > Light > Light Probe Groupを設置して、Edit Light Probesボタンを押してAdd Probeで追加していきます。

リアルタイムシャドウとの兼ね合いについて

ライトマップで焼いた影とリアルタイムシャドウの影の兼ね合いについて、適宜Lighting Modeを設定します。

Subtractive

とにかく軽くしたいときはSubtractiveにします。LightmapとDirectional Lightmapが生成され、Directional ModeをNon-Directionalに変更するとLightmapのみが生成されます。

メインの1つのDirectional Lightのみからリアルタイムシャドウが落ちます。Subtractiveには、ライトマップの影にリアルタイムシャドウの影が二重に落ちてしまう弱点があります。Environment > Realtime Shadow Colorを調整して同じような(溶け込む)色にする必要があります。

Shadowmask

高品質にしたいときはShadowmaskにします。Subtractiveで生成されるテクスチャに加え、Shadowmaskが生成されます。ライトマップの影とリアルタイムシャドウの影がきちんと混じり、複数のMixedのライトからリアルタイムシャドウの影が落ちます。

Baked Indirect

間接光のみがライトマップに焼かれ、直接光の影はリアルタイムシャドウになります。

Tipsおよびトラブルシューティング

ライトマップを焼く際にありがちなエラーや困りごとをいくつかまとめてみました。

小さなオブジェクトのライトマップが綺麗に焼けない

たとえば広い大地に落ちている小石や、部屋に置いてある小さなランプ等のライトマップを焼くと、不自然な境目のある影が発生したりして汚くなりがちです。こうしたオブジェクトではライトマップを焼かず、ライトプローブを使用することで見た目がよくなり、また、ライトマップの節約になります。

具体的には、Mesh RendererのReceive Global IlluminationをLight Probesに変更します。

屋内のライトマップを焼く場合

デフォルト設定だと室内にも空の色が落ちて青く照らされてしまいます。Reflection Probeを設置してBox Projectionをオンにし、部屋の形にあわせてサイズを調整してください。

リフレクションプローブはいわば影響範囲を限定したスカイボックスです。たとえばMetalicを1にしたStandardシェーダーのオブジェクトを配置すると、リフレクションプローブの範囲内はリフレクションプローブで、範囲外ではスカイボックスが映り込むようになります。

また、密閉された部屋だと真っ暗になってしまうので、現実と同じようにライトや窓から差し込む光をArea LightやPoint Lightで配置します。Indirect Intensityを上げると部屋の隅や影に光が回りこんでやわらかい感じになります。

影をやわらかくしたい

Area Lightでサイズのある光源を作ると影のエッジがやわらかくなります。また、BakedのポイントライトはBaked Shadow Radiusで影のエッジをやわらかくすることができます(単位メートル)。

現実世界の光源は必ず大きさがありますので、基本これらを使って大きさのある光源を設置するのがよさそうです。ためしに現実世界で周りを見回してみてください。輪郭がくっきりした影はおそらくどこにも存在しないと思います。

部屋の隅を暗くしたい

Ambient Occlusionをオンにします。影の濃さはIndirect Contributionで調整するのが良さそうです。

メッシュごとにライトマップ解像度を調整したい

左上のプルダウンメニューからBaked Lightmapに変更して、一番下のShow Lightmap Resolutionをオンにするとメッシュごとのライトマップ解像度が視覚的に確認できます。解像度が過剰だったり不足しているメッシュはMesh RendererのScale in Lightmapで調整できます。

ライトマップのサイズを小さくしたい

LIghtingウィンドウでLightmap Sizeを調整するほか、Directional ModeをNon-Directionalに変更するとDirectional Lightmapが生成されなくなります。詳細は以下を参照してください。

ライトのモードをMixedやBakedに設定できない

LightingウィンドウのBaked Global Illuminationがオフになっているとこれらの設定が無効化されます。

スマートフォンで影が汚い・変な色が入る

Project SettingsでスマホのLightmap EncodingがLow Qualityになっている可能性があります。プラットフォームごとに別設定になっていますので、NormalかHighに上げてみてください。Unityのドキュメントでは下記ページに解説があります。

Unty 2019でもGPUでライトマップを焼きたい

BakeryというアセットがVRChat方面でよく使用されているようです(使い方調べたい)。WindowsでNVIDIAのGPU専用とのことです。

スクリプトでライトマップを利用する際のTips

マルチシーンでライトマップを有効にする方法

マルチシーンの場合、現在アクティブなシーンのライティング設定およびライトマップが使用されます。以下のようにLoadSceneMode.Additiveでシーンを読み込んだのちにSetActiveSceneを呼ぶことで、読み込んだシーンのライトマップが有効になります。

SceneManager.LoadScene(roomName, LoadSceneMode.Additive);
SceneManager.SetActiveScene(SceneManager.GetSceneByName(roomName));

以下φ(..)メモメモ中

書いた人:こりん(@korinVR
» VR開発メモトップへ