こんにちは、前回では自作Skyboxの作り方について書きました。
今回はその続きで、Skyboxを環境光によるライティングの事前計算結果の焼き付け(bake)を行う方法について書きたいと思います。
これによって、環境光やAmbient Occlusion(環境光遮蔽)を考慮したしっとりとした陰影を入れる事が出来ます。
この方法は背景モデルや建築など、シーンが静的(static)な場合にのみ使えます。
動的のオブジェクトばかりの場合は影が正しく描画されないのでリアルタイムで計算する必要があります。
ここでいう動的とはオブジェクトが動くかどうかです。
例えば建築のライティングの太陽の方向が決まっているのであれば、その影を事前に計算しておくことで、
VR視聴の際のパフォーマンスを損なうことなく、レンダリング結果を確認する事ができます。
リアルタイムシャドウは本当に必要な時にだけ使いたいですよね。
それでは、早速Lighting設定を確認してみましょう。
目次
Unityのbake機能のデフォルト設定とモデルの準備
Lighting設定はLightingタブからいじる事が出来ます。
まずはタブを出してデフォルトを確認し、結果が確認できるようなモデルを用意します。
bake機能のデフォルト設定
Window>Rendering>LightingからLightingタブを出します。
するとデフォルトでは下図のようになっていると思います。
Environment設定をクリックすると、前回のSkyboxを自作している場合、下図のようになります。
Sun SourceはDirectional Light(デフォルトでシーンに配置されている)になっている事に注意します。
この設定は一体なんだ??と思うと思いますが、その謎に踏み込むことなく、取り合えず良い結果を出す最短ルートを探ります。
せっかく設定をいじっても、結果が見えないと何が変わったのかわからないので、とりあえずオブジェクトを幾つか置くことにします。
Unity内での結果確認のためのモデル作成
ヒエラルキーウィンドウを右クリックしてCube、SphereやPlaneを適当に配置します。
Direct Lightingのアイコンが邪魔なので非表示のボタン(右上)でオンオフを切り替えます。
Planeの上にキューブが乱雑に積まれて、球が置いてあるというような状況ができました。
デフォルトの設定では、影の部分と光の部分にあまりグラデーションが無く、
オブジェクトに反射した光は再現されていないことが分かります。
UnityのLightingとshadowの挙動の確認
一旦bakeの事は忘れて、ライティングの挙動を確かめてみましょう。
先ほどSun Sourceに指定されているデフォルトのDirectional LightをYのRotationをいじってグルグル回してみます。
影も一緒にグルグル回りますね。という事は現段階では影はリアルタイムライティングによって照らされている事が分かります。
UnityのLightmapがない事の確認
念のためLightmap(焼き付けされた影の情報)が焼かれているかどうかもチェックしてみましょう。
デフォルトでは右上のアイコンを押すと分かる通り、Shading modeがShadedになっています。
これをBaked Lightmapにしてみましょう。
たぶん何も表示されないはずです。オブジェクトをヒエラルキービューでクリックしてもアウトラインしか出てきません。
ここにオブジェクトが出ないという事は、静的オブジェクトがないという事が確認できています。
そして、ライトマップの陰影が見えないという事はLightmapが計算されていない=リアルタイムシャドウでレンダリングされている事がわかります。
それでは、前置きが長くなりましたが、早速ベイクしてみましょう。
Unityのbake設定と静的(static)オブジェクト
Unityのモデル側の処理としてStaticをオンにする
一旦Shading modeに戻り、ベイクしたい3Dオブジェクトをすべて選択します。
この状態でStaticにチェックを入れます。
するとshading modeをBaked Lightmapにした時にテクセルの細かさがグリッド上に表示されるようになります。
テクセルとは影の解像度のピクセル単位のようなものだと私は理解しています。
これが細かければ細かいほど影の解像度が上がり、綺麗な影が出る代わりにBake時間が長くなるといったイメージです。
UnityのBakeのためのLighting設定(Shadowmask vs Subtractive, Enlightened vs Progressive)
まず、New Lighting Settingボタンを押し、ライティング設定ファイルを作ります。
新しいライティング設定がセーブされ、自動的に適用されたことが確認できます。
今回使用するのは▼Mixed (混合) ライトです。(Mixed Lighting)
詳しい説明はリンク先のUnity公式ページに譲るとして、今回はQuestにVRを持っていく事を考慮しパフォーマンスを優先します。
よって、デフォルトではShadowMaskになっていますが、今回はSubtractiveにします。詳しいことは上のリンクを参照してください。
▼Machio_Kinniku’s diary:UnityのLight関連を完全に理解する(第1章)
上の記事もかなり参考になりました。Lighting周りについてかなり詳しく書いてあると思います。
それから、LightmapperはデフォルトではProgressive CPUになっていると思いますが、これはEnlightenedに変更します。
粗くてもすぐに見てる方向からの結果を表示し、かつ段階的に細かくなっていくProgressiveと、
全体の計算を優先して最終成果物が出来たらベイクが完了するEnlightenは、どちらが良いかは時によりけりだと思います。
今回はEnlightenを使います。最終成果物がバラつくと結果の再現性に問題が残るので、こちらの方が分かり易いと考えます。
用意された設定でとりあえずBakeしてみる
とりあえず、Enlightened+Subtractiveの設定でGeneratingLightingを押してみます。
すると、しばらく計算のために待たされますが、数秒で上のような結果が出ます。
Baked Lightmapを確認するとしっかりと陰影が焼き付けられている事が確認できます。
ただし、あまり良い結果は得られません。これは何故でしょうか。原因を探ってみましょう。
まず、Sphere(2)に注目してみましょう。Sphere(2)をクリックして、
Inspector上でBakedLightmapの横の▼をクリックしライトマップ情報を確認してみます。
1024x1024ピクセルのライトマップ情報にモデルのUV(マテリアルがどこにマップされるかの座標情報)が格納されています。
この黄色の部分がSphereのライトマップです。
それでは、これをより良くするにはどの設定をいじれば良いでしょうか。
Indirect ResolutionとFinal GatherとAmbient Occlusionと
恐らくはライトマップ解像度ではないかと思いました。
しかし、ライトマップサイズを上げても圧縮をオフにしても改善せず、
色々設定をいじった結果、結論はIndirect Resolutionを上げる事で解決しました。
これを読む限り、RealtimeGIにチェックが必須と書いてありましたが、チェックしなくてもIndirect Resolutionは効くようです。
要するにIndirectResolutionとは影のクオリティのようなものだと思います。
数値を大きくすればより滑らかに細かくなりますが、レンダリング時間がかかるというようなことのようです。
それから、上の公式ドキュメントを読むと、Final GatherとAmbient Occlusionをオンにした方が良さそうです。
Final Gather:これを有効にすると、GI で最終的な光のバウンドを計算するときに、ベイクしたライトマップと同じ解像度で計算します。 これによって、ライトマップの視覚的な質は向上しますが、エディターでベイクするのにより長い時間がかかります。
Ambient Occlusion:これを有効にすると一群の設定が表示され、アンビエントオクルージョン の表面の相対輝度を設定できます。値を高くすると、覆われたエリアと完全に照らされるエリアのコントラストがより大きくなります。このプロパティは GI システムで計算された間接ライティングにのみ適用されます。この設定は、デフォルトで有効になっています。
デフォルトでは両方ともオフになっているので、オンにして計算し直してみます。
概ね良い感じになりましたが、まだ若干ですが十分に細かくない所があります。
Final GatherのRayCountを2048まで増やしてみました。ソコソコきれいになったかと思います。
この値が大きいほどきれいな影になり、時間もかかるみたいなパラメーターのようですね。
どれもそんな感じのパラメーターなので、なかなか理解が追いつきません。
後ろから見てみます。だいぶ背景に馴染んだかと思います。
これでも解像度の足りない影についてはUV、ScaleInLightmap、LightmapResolution、LightmapCompression辺りの理解が必要そうです。
これについては余力があれば別記事で紹介したいと思います。
まとめ
今回の記事では綺麗なライティング環境光の焼き付け方をご紹介しました。
Staticにチェックがいる事、リアルタイムライトと、bakeの違いや、LightMapの確認方法等についてお話しています。
それから、綺麗に見せるための設定としてShadowmask vs Subtractive, Enlightened vs Progressiveのお話に軽く触れ、
最終的にIndirect ResolutionとFinal GatherとAmbient Occlusionのパラメーターを調整しました。
上の絵はマテリアルをメタリックにしています。
マテリアルについても今後機会があれば詳しく触れていきたいと思っています。
それでは、また!