【Unity】Unityのライトマップ設定の各項目の説明(Progressive Lightmapper編)

UnityのProgressive Lightmapperの設定項目についてまとめました。

Unity2018.3.1

はじめに

本記事ではUnityでライトマップをベイクする際のLighting Settingsの項目について検証しています。

f:id:halya_11:20190126214913p:plain

LightmapperはProgressive CPUを使って検証しましたが、
他のLightmapperでも共通する部分はあるかと思います。

一覧

まずは項目ごとの説明を簡単に書きます。
重要な設定項目に関しては次節から個別に説明を書きます。

設定項目名 説明
Lightmapper
└Priortize View
チェックするとシーンビューに映っているオブジェクトを優先的に計算する
Lightmapper
└Direct Samples
直接光のサンプリング数(後述)
Lightmapper
└Indirect Samples
間接光のサンプリング数(後述)
Lightmapper
└Bounces
レイの跳ね返りの最大数
大きい値を設定するとベイク時間が長くなるもののクオリティは上がる。
ライトまでの障害物が多い室内などのシーンでは大きくするべき
Lightmapper
└Filtering
最後にノイズを軽減するためのフィルタリング方法
Lightmap Resolution 1Unitあたりのライトマップのテクセル数(後述)
Lightmap Padding オブジェクト毎のライトマップ間の余白
どういうケースで調整する必要があるのか不明
フィルタとか圧縮の設定によっては大きくしないとなのかも?
Lightmap Size 1枚のライトマップテクスチャの最大サイズ
入りきらなければ2枚目以降もつくられるので注意(後述)
Compress Lightmaps 生成したライトマップを圧縮するか
Ambient Occlusion AOを有効化するか(後述)
Directional Mode Directionalモードを有効化するか(後述)
Indirect Intensity ライトマップの明るさを調整する
どういうときに使うのか不明
Albedo Boost ベイクの計算時に反射率(アルベド)の値を強める
どういうときに使うのか不明

Direct Samples

Direct Samplesは直接光のサンプリング数です。
Lighting ModeSubtractiveにしている場合など、シャドウをベイクしているときに
この値を小さくしすぎると、シャドウが荒くなるようです。 特に理由がなければ初期値でいいと思います。

f:id:halya_11:20190127002158p:plain

Indirect Samples

Indirect Samplesの値は小さすぎると結果が汚くなるケースがあります。

効果を知るために、パストレーシングのレンダラでノイズが生まれやすいような状況を再現してみます。
下記のシーンは隙間から光が差し込む閉鎖された空間を表しています。

f:id:halya_11:20190127002710p:plain

このシーンでSample数を変えてライトマップをベイクしてみます。

f:id:halya_11:20190127003324p:plain

サンプリング数が低いとかなりノイズが生まれることがわかりました。
ちなみにFilteringNoneにすると結果の違いはより顕著になります。

f:id:halya_11:20190127003654p:plain

全てが参考になるわけではありませんが、パストレーシングでノイズが発生しやすい状況については
下記の記事でまとめていますので参考にしてください。

light11.hatenadiary.com

上記の内容から基本的にIndirect Samplesの値を大きくすれば結果は綺麗になりますが、
ベイクする時間が大幅に長くなるという問題が起こります。

ノイズが生じやすいかどうかもシーンごとに異なるので、
最適な設定値はシーンごとに調整する必要がありそうです。

Lightmap Resolution

Lightmap Resolutionは1Unitあたりにライトマップの何テクセルを割り当てるかを表します。

f:id:halya_11:20190127004833p:plain

上図の通り、この値が大きいほどライトマップの品質は上がりますが、サイズも大きくなります。
この値を2倍にするとライトマップテクスチャの容量は4倍になるので注意深く設定する必要があります。

ライトマップの総容量はLighting Settingsウィンドウの下部の統計情報から見れます。

f:id:halya_11:20190127010909p:plain

Lightmap Size

ライトマップ1枚当たりの最大サイズです。

あくまで最大サイズであることに注意が必要です。
つまり、そこまでのサイズが不要であればライトマップは小さくなるし、
逆にそれ以上のサイズが必要な場合は2枚目、3枚目…とライトマップが作られます。

ライトマップの総容量を小さくしたい場合には前節のLightmap Resolutionを調整する必要があります。
前節にも書きましたが、ライトマップの総容量はLighting Settingsウィンドウの下部の統計情報から見れるので、
ライトマップを総合したサイズを見るときはこちらを見る必要があります。

f:id:halya_11:20190127010909p:plain

Ambient Occlusion

Ambient OcclusionをONにすると他のオブジェクトにより光が遮蔽されている部分がより暗くなります。

f:id:halya_11:20190127144607p:plain

またONにした場合、「どのくらい離れているオブジェクトまでを遮蔽の対象にするか」とか、
生成される影の濃さなどを設定できます(詳細はここでは割愛します)。

f:id:halya_11:20190127144926p:plain

Directional Mode

ライトマップをベイクするときには、通常ノーマルマップは影響しません。
しかし、Directional ModeをDirectionalにするとノーマルマップの影響を受けるようになります。
これはEnvironment Reflectionを単色にしてみるとよくわかります。

f:id:halya_11:20190127150922p:plain

よってDirectionalに設定するほうがクオリティは上がります。
しかし「対応するライトマップのテクセルにおいてライトが入ってくる方向と強さ」を表すテクスチャを生成するので、
テクスチャの容量が2倍になるという大きなデメリットがあります。処理負荷も若干増えます。

また、環境光の計算にはノーマルマップは反映されるので、
Environment ReflectionをSkyboxにすればそれなりにノーマルマップが反映されているようには見えます。

f:id:halya_11:20190127151311p:plain

テクスチャ容量とクオリティとのトレードオフを考えて検討すると良いと思います。

ちなみにマニュアルは下記です。

docs.unity3d.com

参考

docs.unity3d.com

docs.unity3d.com

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com