見出し画像

個人的VRChat(Unity)ライトベイク マニュアル(Unity2019対応版)

【注意】このマニュアルはBoothで販売している”SeaSideHome”や"浦手一番館"、”CIRCLE hOuse"用に書いたものになります。

この記事を読んでもわからないことがあれば、ワールドの方を買ってくれればより理解しやすいかもしれません

VRChat向けワールドモデル「SeaSide Home」
VRChat向け住宅『浦手一番館』-Sea Side Residence No.1-
VRChat向け住宅ワールドデータ「CIRCLE hOuse」

画像8
画像15
画像16


この記事は、
基本的にはVRC向けワールドにライトベイクをする人向け、
初めてベイクする人向けです。

ライトベイクというのは
「事前に光の反射や影を計算しておけば実際にそれをゲーム中でそれらにマシンパワーを食われない」ためのもの。

その代わり、事前計算された”ライトマップ”の容量が加わるので容量が大きくなるのがネックですが。

このマニュアルではUnityによるベイクとBakeryによるベイクについて説明していきます
バージョンはUnity 2019.4.31f1です

1.基本的なベイクと共通事項


まずはじめに、Lightningウィンドウを確認しましょう。
場所は右のInspectorの隣か、
無ければ上の”window>Rendering”の中にある”Lighting settings”です

画像16


一番下の「Auto generate」のチェックを確認します。
有効になっている場合、ライトとオブジェクトが揃うとUnityは勝手に計算し始めて唐突に重くなるので先に外しておきましょう。

ついでに最初からあるDirectional Lightを消すか、”Baked”にしておきましょう

次に、UnityとBakeryベイク共通の内容として、ベイク対象のオブジェクトのInspectorの設定があります

画像16

ライトベイクに関わる部分は
・右上のStaticチェック
Staticをチェックすると”ゲーム中には動かない”扱いとなります
ベイクするなら”ContributeGI”だけonになっていれば十分です

・Cast Shadows
・Receive Shadows
影を作る、受けてライトマップに書き込むなら必須です。
onにしてチェックを入れておきましょう

・Contribute Global Illumination
右上のStaticではなくこちらでもContributeGIを設定可能です

・Receibe Global Illumination
Global Illumination(間接光)をライトマップから受けるか、ライトプローブから受けるかを設定できます。基本的にはLightMapを選択します。

・Scale in Lightmap
Lightmap staticをオンにすると出てくる、オブジェクトごとにライトマップの解像度を
倍率で変更できます。
後に説明するLightmapResolution(Texels per Unit)の設定に対する倍率なので
20Tex/Uの場合、Scale in Lightmapを2に設定しておけばそのオブジェクトには40TpUの解像度が適用されます。
(Tex/U=Texels per Unit)

1Unitは1*1mの面積を指すとのこと。
TpUの値はBakeryマニュアルからの翻訳引用をすると
広い屋外エリア(都市):1-5
中程度の屋外エリア(路地等):10-20
高品質のインテリア:100
とされています。
但しTex/Uの値を上げすぎるとワールド容量がかなり大きくなります。
光源の当たらない部分、太陽光しか当たらない部分は解像度を落とすなどの工夫をする
と容量を抑えながらキレイなライトマップが生成されます

1.5 オブジェクトのライトマップ用UV作成

画像3


VRCのワールドで想定されるオブジェクトは様々な由来を持ち、
一部はライトベイクに適切なライトマップを持ちません。

結果、このように壊れたライトマップが発生することになります。
これを回避するためには、読み込んだオブジェクトのfbxファイルを選択します

画像4

一番下にある”Generate Lightmap UVs”をチェックした上で左下のApplyを押すとライトマップ用のUVが生成され、正しくベイク出来るようになります。


2.Lightコンポーネントを配置する

画像5

UnityのライトはこのLightコンポーネントを、
ライトを設置したいオブジェクト若しくはEmptyに追加することで利用できます
上のGameObject>Lightからでも可能です

Unityのマニュアルはこちら
https://docs.unity3d.com/ja/2018.4/Manual/class-Light.html

・Type
ライトのタイプです。
詳しい部分はUnityのマニュアルを参照してもらうとして、かんたんに説明すると

Spot - 1点から特定の角度と方向に向けて光を放つライト
Drectional -主に太陽光として使われるエリア全体に超遠距離から来るライトPoint - 1点から全周囲に光を放つライト。
Area - ベイクでないと扱えない”空間の表面から均一に放たれる”ライト

・Range
ライトの設置位置からの到達距離です。
基本的に大きければ明るくなり、小さければ暗くなります。反射にも影響を及ぼすので狭い場所だとこれを下げるとかなり暗くなります。Intensityと合わせて明るさの調整が出来ます

・Spot angle
Spotライトで光を発する角度です。円錐形状に光が出ていきます


・Use Color Temperature mode
色温度モードです。このスライダーを使えばライトの色を自然に変化させることが出来ます
・Color
ライトの色を指定できます。SSHでなら色温度モードのほうが良いでしょうね

・Mode
ライティングモードの設定です。
重要です。なぜならここをBaked若しくはMixedにしていないとライトベイクをしませんので。

・Realtime
一番基本的なライトです。難しい設定も、事前の計算も不要でワールドの容量も少なくなります。が、実際にVRCやゲームをしているときの計算量が増えてしまい動作が重くなる原因になります。
(何より見た目に劣る)

・Mixed
混合ライトです。今回は話が複雑になるので扱いません。

・Baked
今回必要なモードです。

光源からの光を複数回反射させたりとリアルタイムライトでは(レイトレーシングをVRCが実装しない限り)出来ない事が出来ますが、アバターに光が当たらないのがネックかも知れません。

重要:VRCで使う場合、アバターに対して有効なRealtimeライト、若しくはライトプローブが必ず必要です。

詳細は後述します

・Intensity
ライトの明るさです。大きくすれば明るく、小さくすれば暗くなります

・Indirect Multiplier
光が反射したときの減衰率です。
間接光が不要な場合には0、0から1の場合は反射するごとに暗くなり、1以上だと反射するごとに明るくなります。

・Shadow Type
影のタイプを指定しますが、ベイクする場合は基本的にSoft Shadow以外は使わないと思います。
No shadowはRealtimeライトを軽量化する場合には必要です

・Drow Halo
Haloは空気中の細かい粉塵の印象を与えるのに使用される、光源周辺の明るいエリアです。

・Flare
レンズフレアを発生させる場合に使います

・Render Mode
描画優先度です。Autoで問題有りません

・Culling Mask
光を当てる対象を選択できます。
Inspector右上にある”Layer”ごとに選択することが出来ます。

基本的に普通のワールドオブジェクトは”Default”で配置されているため、
Defaultを外せばアバターや他のプレイヤーなどにだけ当たる光源を設定できます

3.Lightingウィンドウを設定する

よく使うさあ、シーンにオブジェクトを配置して、ContoribteGIを設定して、ライトも配置したらついにベイクです。
Unity公式のマニュアルはこちら。
https://docs.unity3d.com/ja/2019.3/Manual/GlobalIllumination.html

個人的に余り使わない、把握していない項目の説明は飛ばします。

Environment(環境)

画像16

Environment(環境)
・Skybox material
ここからSkyboxを変更できます。
Unity Asset Storeに無料のskyboxが複数あるので好みで入れ替えましょう。

・Environment Lighting
シーン全体の明るさ、環境光です
『空気中の塵や水分による屈折や反射等による非常に弱い光』の再現に使います。

・Source
Environment Lightingの色などを設定できます。基本的にはSkyboxで大丈夫

・Ambient Mode
Bakedにしてください。グレーアウトしてたら放置。

Lightmap settings

画像17

・Lightmapper
ベイクのモードを切り替えます
Enlighten
ProgressiveCPU
ProgressiveGPU
の3種類があります。

Unity2018やUnity2019.1の頃はProgressiveGPUがろくな結果を出さないので
ボロクソに書いていましたが、
デノイザーが実装されたからか、その頃から比べると非常に綺麗で実用的なライトベイクがCPUよりも遥かに短時間で可能になりました。
(個人的な感想としてはまだBakeryに劣りますけど)

ProgressiveCPUとProgressiveGPUの設定項目は同一で、結果はほぼ同等ですが、
GPUで不具合が出る場合はCPUを使うようにしましょう。
Enlightenも有用な場面もありますが、今回はProgressiveのみ解説します。

・Prioritize View
Unityの画面上に表示されている部分を優先してベイクするモードです。
一部のベイクを早く確認したい場合に使います。これを有効化するとどの程度の精度でどの程度の時間の差があるのはは未検証です

・Direct Samples/Indrect Samples/Environment Samples
精度に関する項目です。
シーンの広さ、ライトの数、求める制度等で適切な数値は変わってきます。
値を高くすれば高精度になりますが、ベイクにより時間がかかるようになります。
幸いにしてGPUベイクが短時間で完了するので、試行錯誤をするのもよいかもしれません

・Light Probes Sample Multiplier
LightProbeを作成している場合に使う項目です。

・Bounces
光源反射回数です。多いほうがリアルな光の表現ができますが、計算に必要な時間が非常に長くなるため、あまり多くすることはおすすめしません。
ただし、ProgressiveGPUの場合は余り気にせず4にしても問題有りません。
(Bakeryを使う場合は5回反射でも短時間で綺麗にできます

・Filterling
デノイザー関連を設定できます。分からなければAutoで。

・Lightmap Resolution
ライトマップの解像度設定です。
この値によってライトマップの容量、ひいてはワールドの容量とベイク時間が決まります。
現在筆者が作成販売しているワールドでは40Texel per Unit(TpU)程度必要のようです。
それ以下だと異常な部分が発生します。
また、部分的に高解像度が必要な場合や
光があまり当たらない場所や変化の少ない場所は
Objectの方にあるScale in Lightmapの値を小さくしたり大きくしたりすることで
容量を抑えたり、局所的に解像度を上げることが出来ます

Generate Lighting
これを押すと設定に基づいてライトベイクが始まります。
所要時間はそれぞれのPCのスペックや設定内容に依存します。

4.VRCにアップロードする前に

ライトベイクしたシーンには、アバターに対して当たる光源は基本的に有りません。

これを解消するのに一番簡単な方法は、
以下のような「オブジェクトに対して当たらないNo shadowのリアルタイムライトを設置する」事です

画像7

この設定で、あとはCullingMaskからdefaultのチェックを外せば完了です。場所によってアバターの明るさを変更する場合はライトプローブが必要ですが説明は省きます。

新規で作成したプロジェクトの場合、
上のVRChatSDKのShow Control Panelからコントロールパネルを表示し、
ログインした後Builderを出して
Setup Layers for VRChatを実行しないとVRCに適切なレイヤーが設定されないので、CullingMaskがうまく行かない場合は確認してください。

画像18

Bakeryとは


Geforce及びQuadroシリーズのGPUで高品質かつ高速実行が可能なライトマッパーです。
Unityの標準のLightMapperで実行するライトベイクよりも光がより現実に近いものとなり、
好みの問題もあり、使い分けも必要ですが筆者はBakeryを使うことの方が遥かに多いです。

Unity搭載のLightMapperでは不可能な光の表現ができるようになります。

https://assetstore.unity.com/packages/tools/level-design/bakery-gpu-lightmapper-122218

搭載されているGPUがGeforce及びQuadroでない場合、
また、Geforceでも700番台(Kepler)よりも前のGPUの場合は使えません。


Unity Asset Storeで購入することができ、価格は60.5USDです。
セールの時は半額になったりするのでそれを狙っても良いかもしれません。
Unity標準の場合とはライト設置の時点から別になります。
つまり1.5まではUnityのライトマッパーと同じなのでそちらを参照してください
Bakeryの公式マニュアルはこちら。
https://geom.io/bakery/wiki/index.php?title=Manual

Bakery自体の簡易的な日本語マニュアルはこちら
https://note.com/snc885/n/n06c553ba73cc

1.BakeryLightコンポーネント

Bakeryライトにはタイプが存在せず、コンポーネント毎に動作が異なります

設置方法はUnityのものと同じ、Add Componentから、
若しくは上のBakery>Createから行います

・Bakery Direct Light
Directionalライトは“Bakery Drect Light”と対応しています

画像9

扱い方はUnityのライトとあまり変わりません。
Intensityで明るさを調節し、Indrect intensityで反射減衰を調節します。
Colorも夕方の場合などには変えますが基本太陽光は白なので白のままです。

・Bakery Point Light
BakeryPointLightはProjection maskによって特性が変わります
OmniはUnityのPointライトと同じです
ConeはSpotライトと同じです

画像10
画像11

CookieでもSpotライトと同じような挙動をしますが、
自分の環境では原因不明のエラーによるベイク失敗が多発する原因になったのでおすすめしません。

・Bakery sky Light

Bakery sky Lightは環境光です。Environment Lightingと対応しています
設定項目はIntensity以外基本弄りません。

画像12

Direct、Point、Skyの三種以外は高度な使い方になるので省略します

1.5 Bakery Renderウィンドウ

一番面倒くさく複雑なものです。詳細説明してられないので、最低限の説明をして
あとは自分が使っている設定を載せておきます
BakeryRenderウィンドウは上の”Bakery”から”RenderLightmap”を選ぶと出てきます。

詳細を把握したい方は「簡易的日本語マニュアル」か「公式マニュアル」をどうぞ

画像13

Bakeryをインポートしてすぐはこの画面が出てるかもしれません。
このままRenderを押せばレンダリングが開始されます。
設定的にはこの状態でも何ら問題有りません。

SSHではTexels per Unitの値が40以上であれば概ね問題なくベイク出来ます。詳細な設定をする場合は、一番上の”Simple”を”Experimental”に変更することで設定項目が出てきます

画像14

現在自分が使っている設定ですが、
ほぼほぼ標準設定そのままです。

注目するべき点はTexels per unitとSamples。
つまりライトマップの解像度と精度くらいで他のところはほぼ弄りません。
Samplesも最終的にアップロードするとき以外は16もあれば十分すぎます。
64となると結構時間がかかります。

適当に使ってもそれなりにきれいになってしまうのがBakeryの恐ろしい所。その上ベイク自体が早いのでトライアンドエラーもやりやすいという割と脳死上等な仕様です。

この記事が気に入ったらサポートをしてみませんか?