LoginSignup
10
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-20

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

UE4 Doc: Volumetric Lihgtmap

この空間に分布されているVolume Dataを細かく調整したいという要望はよくあるかと思われます。そこで、ここでは以前検証した際の設定値による変化をシェアしたいと思います。こちらの設定ですがWorld SettingsのLightmassには以下の様に三種類ぐらいしかありません。
image.png

また、Volumetric Lightmap Desnsity Volumeにより一部のVolumeを詳細に設定することができます。ピンポイントで確実に分割させたい箇所などには有効な手法ですが、ボリュームを全シーンで手動で配置するのは大変かと思われます。
image.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
MaxRefinementLevels=3
image.png
MaxRefinementLevels=4
image.png

BrickSize

各階層の一辺にあるサンプルの数になります。デフォルトは4。2のべき乗に繰り上げされるので、5とかにすると一気に8まで跳ね上がります。試してみたところ確かに5, 6, 7とも同じ結果になりました。 絵はBrickSizeが4のときと5のとき。
image.png
image.png

SurfaceLightmapMinTexelsPerVoxelAxis

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

壁の方のライトマップ密度の高い部分にサンプルが細かくあり、逆にライトマップ密度の低い地面にはサンプルが少ない
image.png

LightBrightnessSubdivideThreshold

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

ライトなし: 空間分割されない
image.png

ライトあり: 空間分割される
image.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

SLLS=0.25 上の画像とVolumetric Lightmapの変化なし
image.png

朗報: 壁にも間接光データが作成されます

Volumetric Lightmapの良いところとして、PLVのようなサーフェイスのY方向という概念がなく、静的メッシュならば壁などでも間接光が細分化される点がある。壁走ったりなキャラクターなどに良さそうですね!
image.png

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

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7