みなさんこんにちは今出川DENXのくるーておです。最近はUnityで下の画像のようなステージ作りにチャレンジしています。今回はこんな感じで作業しているとき、ややこしかったライティングのベイク周りについて記録しておきます。
早速ですが試しにベイクしたデータから、少し勉強してみましょう。次のライトマップデータは以下の条件でベイクしてみました。 * ベイクモードをMixedにし、Lighting ModeはShadowMaskに設定 (↑今は分からなくとも、記事を読んでいただけると、分かるようになると思います。) * 青いマテリアルが静的オブジェクト、白が動的オブジェクト * リアルタイムの影は分かりやすいようにハードシャドウに設定
三枚目の画像がライトマップデータですが、自動で生成されたフォルダに格納されています。
大前提として、動的なオブジェクトはライトマップにベイクできないことを覚えておいてください。故に三枚のライトマップは、青いPlaneのもので、黒い部分は青いSphereの影ということがわかります。(SphereのライトマップはUVスペースを食ってわかりづらかったので、ここでは別にしています。)
それぞれどのような役割があるのでしょうか。名称は左から「Intensity ライトマップ」「Directionality マップ」「Shadowmask」です。
①. Intensity ライトマップ 通常通りの輝度、照明情報のデータです。要は光のデータを格納しますから、これぞ文字通りのライトマップといえるでしょう。
②. Directionality マップ こちらは方向性、すなわち法線データも動作させた場合の光の拡散データです。よりリアルな影を得るためのデータといってもよいでしょう。ちなみに②のDirectionality マップが不要の場合はDirectionalモードをNon- Directionalにすることによってなくすことができます。モバイル向けや、セルルック調の時は消しておくことでパフォーマンスを高めましょう。
③. Shadowmask 最後の赤と黒のマップは影のデータです。ここでややこしいのが「シャドウマスク」と「シャドウマップ」は別物ということです。
シャドウマスク・シャドウマップとは?
簡単に押さえておきたいのであれば、静的オブジェクトの影情報を格納しているのがシャドウマスク、リアルタイムの影情報を格納しているのがシャドウマップという理解でよいと思います。ただし、シャドウマスクはライトのBakeModeがMixedの時のみ使用可能となっています。
ライトマップデータと用語を確認したところで、本題のベイク周りを見ていきましょう。
1. リアルタイムライティング
ベイクモードがRealtimeだと影はすべてシャドウマップで記録され、サイズや解像度はEditのqualityから調節できます。またRealtimeの場合はベイクしていないので上記の①②③のライトマップは存在しません。
2. Bakedライティング
ベイクモードbakedだと静的オブジェクトの影は①②のライトマップに完全に焼かれてしまうので シャドウマップ・シャドウマスク関係は関係ありません。③のシャドウマスクは生成されず、①と②のみが生成されます。解像度はライティングウィンドウのライトマップセッティングのResolutionあたりを調節して確認しましょう。また光源の位置は記録されないので、スペキュラーライティングは配給されません。
3. Mixedライティング
間のベイクモードMixedライトですがこれまたややこしいことに3つのライティングモードがあります。それぞれ影の扱いが違います。 ⑴ Baked Indirectモード ⑵ ShadowMaskモード ⑶ Subtractiveモード
これらの違いは影のデータを何で管理するのかが少しずつ違ってきます(シャドウマスク、シャドウマップ、ライトマップ)。
公式リファレンスにわかりやすく表でまとめてあるのでそちらをご確認ください。
表をまとめるの面倒くさかった。
https://docs.unity3d.com/ja/current/Manual/LightMode-Mixed.html
一つだけ例をとして紹介しておきます。例えばSubtractiveモードは静的オブジェクトが静的オブジェクトに影を落とす際、その陰と照明の情報は①②のライトマップにベイク(つまりBakedと一緒状態に)されますが、 動的オブジェクトはしっかりシャドウマップで影を落としてくれるため、スペキュラーライティングを含めたライティングを配給してくれます。(つまりRealtimeと一緒状態)
日頃何となくで行っていたライトマップのベイクですが、少し整理することができました。今後はシャドウマップを自作とかしてみたいですね。