[UE4] Volumetric Lightmapをlightmass.iniをいじって調整する

UE4は4.18より、Movableなオブジェクトへの事前計算ライティングの1つの手法として**Volumetric Lightmap**を実装しました。オフィシャルドキュメントにもその効果の詳細が記載されています。

[UE4 Doc: Volumetric Lihgtmap](https://docs.unrealengine.com/en-US/Engine/Rendering/LightingAndShadows/VolumetricLightmaps/index.html)
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/50b98f60-009b-d835-1269-9607a54f764d.png width=50%>

この空間に分布されているVolume Dataを細かく調整したいという要望はよくあるかと思われます。そこで、ここでは以前検証した際の設定値による変化をシェアしたいと思います。こちらの設定ですがWorld SettingsのLightmassには以下の様に三種類ぐらいしかありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/c79d9065-60e1-c008-bdb6-06cfa073cc2b.png)

また、Volumetric Lightmap Desnsity Volumeにより一部のVolumeを詳細に設定することができます。ピンポイントで確実に分割させたい箇所などには有効な手法ですが、ボリュームを全シーンで手動で配置するのは大変かと思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/81754a2f-0e81-3c95-2145-aa87d1b3aa04.png)

ですので、全体をより詳細に一括で調整したい際は、みんな大好きEngine/Config/Baselightmass.ini内部の[DevOptions.VolumetricLightmaps]以下をいじる必要があります。

```
[DevOptions.VolumetricLightmaps]
BrickSize=4
MaxRefinementLevels=3
VoxelizationCellExpansionForSurfaceGeometry=.1
; Static Geometry using Volumetric Lightmaps needs neighboring bricks to be refined for higher quality, since neighbor dilation does not operate across bricks with different densities
VoxelizationCellExpansionForVolumeGeometry=.25
VoxelizationCellExpansionForLights=.1
TargetNumVolumetricLightmapTasks=800
MinBrickError=.01
SurfaceLightmapMinTexelsPerVoxelAxis=1.0
bCullBricksBelowLandscape=true
LightBrightnessSubdivideThreshold=.3
```
今日は、こちらの設定の中から調べたいくつかの設定とその効果などをシェアしたいと思います。


## MaxRefinementLevels
MaxRefinementLevelsを2, 3, 4とすることでクラスタリング階層の深さを変えられます。最小の幅はVolumetricLightmapDetailCellSizeで固定するので、空間的には拡大していく感じです。ボリューム内を細分化していくわけではないので注意が必要です。
**MaxRefinementLevels=2**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/369531be-647f-5f91-72a5-5b7cfbe87a7b.png)
**MaxRefinementLevels=3**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/e4af594f-0d03-a943-4a57-524f91529e6a.png)
**MaxRefinementLevels=4**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/deec4cab-1615-a922-030b-d43385985d7f.png)

## BrickSize
各階層の一辺にあるサンプルの数になります。デフォルトは4。2のべき乗に繰り上げされるので、5とかにすると一気に8まで跳ね上がります。試してみたところ確かに5, 6, 7とも同じ結果になりました。 絵はBrickSizeが４のときと5のとき。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/4dd3d169-dc5f-ce91-58e0-099035924f57.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/7cbea33c-4bb8-3be2-58fb-8dba384c98f6.png)


## SurfaceLightmapMinTexelsPerVoxelAxis
各オブジェクトの表面のLightmap密度の粗密を考慮してVolumetric Lightmapも作成されます。PLVと同様、オブジェクトのライトマップ解像度が大きいと、その周りのVolumetric Lightmapも細分化しないようにデフォルトで設定されています。ライトマップがボケボケなら間接光も同じくらいボケボケで良いというコンセプトです。。その閾値がSurfaceLightmapMinTexelsPerVoxelAxisです。

**壁の方のライトマップ密度の高い部分にサンプルが細かくあり、逆にライトマップ密度の低い地面にはサンプルが少ない**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/932bd970-0ee8-45a8-25f3-f4d4b2f8648a.png)

## LightBrightnessSubdivideThreshold
Lightに近い部分など輝度が高い部分も考慮して細分化してくれます。つまりPointLightやSpotLightの範囲内のボクセルも再分割の対象になります。ボクセル内の複数サンプル点のどれか一つで、ライトからの直接光が閾値よりも高い場合に分割する。その閾値がLightBrightnessSubdivideThresholdでDefaultで0.3です。

**ライトなし: 空間分割されない**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/ebf2bf26-a812-df8d-2aa2-315e7d85bfbb.png)

**ライトあり: 空間分割される**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/f3a73a08-25c4-2eab-c9e4-c63bc7d94de6.png)


##その他
ボクセルを実際の大きさよりもスケールして再分割をより促すVoxelizationCellExpansionForGeometry/ForLightとかのパラメータもあありますが、すみませんこちら未検証です。

以下は、lightmass.iniではないですが、知っておくと良いVolumetric Lightmapの特徴です。

## 朗報: Volumetric LightmapのSample数はStatic Lighting Level Scale(SLLS)に依存しない
地味に嬉しいのですが、このVolumetricLightmapはStatic Lighting Level Scale (SLLS)と分離されていて、SLLS細かくしてもSample数が増えません。
PLV(Precomputed Light Volume)の方は影響を受けてしまうので、ライトマップクオリティを上げたいだけなのにPLVのデータ量が跳ね上がったりしてしまうことがあるのですが、こちらは問題ありません！

**SLLS=1.0**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/f6dfa3b3-8dc0-12cd-d43e-f131a6d8fc9e.png)

**SLLS=0.25 上の画像とVolumetric Lightmapの変化なし**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/8e588ac2-8239-2b45-f5fc-ddaae364a115.png)

## 朗報: 壁にも間接光データが作成されます
Volumetric Lightmapの良いところとして、PLVのようなサーフェイスのY方向という概念がなく、静的メッシュならば壁などでも間接光が細分化される点がある。壁走ったりなキャラクターなどに良さそうですね！ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/2ca764ba-ad92-1323-d4e5-c5734f941dab.png)


以上です。雑多ですが、まとめてみました。皆様も幸せなライトマスライフをお送りください。