Lightmass Deep Dive
vol.1 Lightmap編
篠山 範明
Epic Games Japan
Senior Support Engineer
Lightmap編
Lightmap編
の前に
Lightmassってなに?
Lightmassって何?
Unreal Engine4が用いる
事前計算ライティングのアプリケーションです。
ライティングビルドの場所
押すと
ライティングビルドが走ります
そして失敗したりします。
このときにUE4 Editorの裏で
ライティング計算しているのが
lightmassです。
ソースコードは公開
Program/UnrealLightmass
Lightmassの問題は?
大きく分けて三つ。
Lightmassの問題①
クオリティ
Lightmassの問題②
ビルド時間
平気で数時間単位にスケールする
ライトビルド
Lightmassの問題③
容量
Memory File Size
Lightmassの問題は?
クオリティ ビルド時間 メモリサイズ
Lightmassの問題は?
真茅さん
クオリティ ビルド時間 メモリサイズ
Lightmassの問題は?
SQEX
斎藤さん
クオリティ ビルド時間 メモリサイズ
Lightmassの問題は?
これらを調整するためには、
ライトマスの動作の仕組みや設定方法を
最初に篠山が説明します。
クオリティ ビルド時間 メモリサイズ
Lightmassが出力するデータ
Lightmass
Input
Output
Lightmassが出力するデータ
Light
Map
Shadow
Map
Precomputed
Light
Volume
(半透明用のシャドウマップもありますが、そちらは今回は触れません。。)
Light
Map
Shadow
Map
Precomputed
Light
Volume
③真茅さん
LightMapとShadowMapは
アクター単位で持たれます。
Lightmapの実際に作られたテクスチャは、
World Settingsで見ることができます。
Light
Map
Shadow
Map
Precomputed
Light
Volume
④ SQEX斎藤さ
ん
ViewのメニューでDebug表示できます。
Light
Map
Shadow
Map
Precomputed
Light
Volume
すみません。今回の講演では省きます。
Light
Map
Shadow
Map
Precomputed
Light
Volume
すみません。今回の講演では省きます。
Shadow Mapを理解するためには、
その前に、Stationary Lightの挙動を理解する必要があります。
Stationary Lightの影については、
上記ブログが参考になります
http://darakemonodarake.hatenablog.jp/entry/2015/12/16/UE4/Stationary
Light
Map
Shadow
Map
Precomputed
Light
Volume
Lightmap
をベースに
Lightmassの基本アルゴリズムを学ぶ
Lightmass -> Lightmap
の流れを理解すれば、
他の二つは、
部分的な拡張として理解できます。
おしながき
1. Lightmassによる、Lightmap 作成アルゴリズム
2. Lightmap作成のためのLightmass設定方法
おしながき
1. Lightmassによる、Lightmap 作成アルゴリズム
2. Lightmap作成のためのLightmass設定方法
そのまえに注意点三つ
1. 説明するアルゴリズムは概要です。
概念の理解を最優先にしており不正確な部分もあります。
Lightmassの実際の実装を追っているエンジニアの方達は
回れ右してソースコードに戻ってください。
例えば、IrradiancePhoton, CacheOnSurface, IndirectPhotonPathなどについて触れておりません。
わかりやすさのためIndirectPhotonのEmitもDirectPhotonのEmitからシーケンシャルに行われるように説明しており
ます。
2. Lightmass debugging…
これから、こういう非常に簡単な図が沢山でてきますが、
基本的にはUE3の名残の機能であり、現在正式サポートはしていないので
使い方などの説明は省きます。
アルゴリズム説明の際のイメージと捉えてください。
3. Base Scene
これから、こういう非常に簡単な図が沢山でてきますが。。。
3. Base Scene
このような、一面が開いたボックスの中に、
球体があるシーンをイメージしてください。
Lightmap作成の目標
ライトマップの各テクセルに
自身のライティング情報を格納する
具体的な挙動になる前に。。
ライティングを二つに分けます。
Direct
Lighting
Indirect Lighting
Direct
Lighting
Indirect Lighting
Direct
Lighting
Indirect Lighting
Direct
Lighting
ライトからの直接(Direct)のライティング
二次反射以降がないので影部分は黒い。
Direct
Lighting
Indirect Lighting
Indirect Lighting
二次反射。照り返し。レフ版。
複数回バウンドしたライティング
直接光で届かない場所へ、光が回り込む。
Direct
Lighting
Indirect Lighting
Direct
Lighting
Indirect Lighting
Direct
Lighting
Indirect Lighting
では、
ライトマスがこの二つをどのように計算するかを
見ていこうと思いま。。。。。。
Direct
Lighting
Indirect Lighting
しかし、
ライトによって計算の方法が変わります。
説明を更に二分します。
Photonを
出す
Light
Photonを
出さない
Sky Light
OR
これでこのようなマトリックスが出来ます。
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting
Indirect
Lighting
Direct
Lighting
Indirect
Lighting
Photonを
出す
Light
Photonを
出さない
Sky Light
まずはこちらから。
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting
Indirect
Lighting
Direct
Lighting
Indirect
Lighting
Photonを
出す
Light
Photonを
出さない
Light
Lightmap作成
アルゴリズム
Point / Spot / Directional Light 編
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting
Indirect
Lighting
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Direct Lightingは
ライトへ、レイを飛ばして行います。
※Photon Mappingは関与しない
Direct LightingPhotonを出す Light の
Light のSource Radius でライトの大きさを変えられます。
ライトにレイを直接飛ばします。
影のボケなどはここで調整します。
Direct LightingPhotonを出す Light の
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Indirect
Lighting
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Indirect
Lighting
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Indirect
Lighting Photon Mappingで
シミュレーション
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Photon Mapping
Photon Mapping
ライトからPhotonを放出し、
光の複数回バウンスをシミュレーションする。
ライトからPhotonを放出する
当たらないPhotonは消失
Photon Mapping
壁に衝突したフォトンは。。。
Photon Mapping
壁に留まり、反射(バウンス)を表す
新たなPhotonを放つ
バウンスしたら。。。
バウンスしたら。。。
更にバウンス
沢山のフォトンを沢山反射させ、
Indirect Lightingを実現する
Direct Photons
Indirect Photon Path
フォトンが蓄積されたので。。。
Lightmapのテクセルのライティングを
周りのPhotonから見積もってみる。
Lightmapのテクセルのライティングを
周りのPhotonから見積もってみる。
Photon Mapping
preview (radius = 50cm)
Photon Mapping
production (radius = 50cm)
Photonが足りない!!
設定をいじくりProductionよりも
Photonの数を上げていく…
増やしていけばいずれたどりつけそうだけ
ど。。。
いつになったらPhotonがたりるのでしょうか?
Photon Mapping Only
このテクセルに届く
Photonはどれくらいでしょう?
Photon Mapping Only
(Direct Photon)
ポイントライトから全方向にランダム
Photon Mapping Only
(InDirect Photon)
あたった面から。。。
Photon Mapping Only
(InDirect Photon)
あたった面から。。。
ランダムに反射する。
?
?
?
?
Photon Mapping Only
各テクセルを見積もるには不十分
PhotonMappingだけの場合、
非常に沢山のPhotonを放出し、
そのバウンスを計算しなければいけない。
Photon
mapping
Final Gathering
Final Gathering Concept
Photon Mappingだけならば
近傍のフォトンだけ。
これでは不十分なら。。。
Final Gathering Concept
(InDirect Photon)
あたった面から。。。
ランダムに反射するならば。。
?
?
?
Final Gathering Concept
逆に、各テクセルからレイを飛ばし、
もしもそのフォトンがこっちに飛んで
きたなら、
どれぐらいの影響があるかを調べる。
?
?
?
Final Gathering Concept
みずからレイを飛ばして、
遠くのフォトンからの影響
を調べにいく。
見るフォトンの数が増える。
Photon Mapping -> Final Gathering
Final Gathering
テクセルからレイを飛ばし、
フォトンを自分から取りに行く。
Final Gathering
Photon Mapping -> Final Gathering
すごいですね。Final Gathering
Photon Mapping -> Final Gathering
かなり見え張りました。
Photon Mapping -> Final Gathering
かなり見え張りました。
Production: ILQ 10
Photon Mapping -> Final Gathering
かなり見え張りました。
Production: ILQ 10Preview: ILQ 1
Photon Mapping -> Final Gathering
ビルド時間 体感でおよそ100倍
Production: ILQ 10Preview: ILQ 1
Final Gathering…
隣のテクセルとの整合性がないので、
サンプリングノイズが多発する。
正しく見積もるには
沢山のレイを出す必要がある。
Photon
mapping
Final
Gathering
ちょっとAdvance…
Final Gathering Concept
の時に、下のように説明しました。
本当は、
自身の近くの
Photonは探索しません
これが正解。。。なぜ?
Direct Lightingは、
直接ライトへレイを飛ばして
計算するからです。
それと別に近傍のPhotonをとると。。。
実際は、Final Gatheringだけをし、自身の
Photonの近傍を探索しません。
直接光成分を二回
計算してしまいます。
FGだけにすれば、
Direct Photonの影響を省けます。
Final Gathering
Photon
mapping
Final
Gathering
Irradiance Caching
Irradiance Cachingコンセプト
ファイナルギャザリングをすべ
てのテクセルでやるのか。。。。
時間もかかるし。。。
ノイズが。。
Irradiance Cachingコンセプト
君たち、
間接光成分
だいたい一緒でしょ?
Irradiance Cachingコンセプト
どこかFinal Gathering
したら。。。
Irradiance Cachingコンセプト
その情報をキャッシング
Irradiance Cachingコンセプト
どこかFinal Gathering
したら。。。
Irradiance Cachingコンセプト
その情報をキャッシング
Irradiance Cachingコンセプト
テクセルがもしもキャッシュに
十分に入っていたら。。。
Irradiance Cachingコンセプト
近くのキャッシュから見積もる
Only FG With IRC
近くのキャッシュから見積もる
• キャッシュの半径は?
• どのような補完が適切?
Irradiance Caching (Production)
Irradiance Caching (Preview)
Final Gathtering -> Irradiance Caching
Previewだと探索半径が大きくなり、
ノイズが減るがディティールも消失
FG + IRC: PreviewFG: Preview
Photon
mapping
Final
Gathering
Irradiance
Caching
アルゴリズムまとめ
Indirect LightingPhotonを出す Light の
Final Gathering
Irradiance Caching
各テクセルに対して。。。
近くに十分な
IRCある?
NO!!
YES!!
なら補完して
値を格納Photon Mapping
Scene Setup
Indirect LightingPhotonを出す Light の
Photon Mappingを軸にした
様々なアルゴリズムで動いています。
Indirect LightingPhotonを出す Light の
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Indirect
Lighting Photon Mappingで
シミュレーション
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Photonを出さない
Sky Light編
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Indirect
Lighting Photon Mappingで
シミュレーション
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
SkyLight は360度無限遠方からの
ライティングです。
SkyLight
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Final Gathering時に
直接参照
Indirect
Lighting Photon Mappingで
シミュレーション
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Final Gathering
SkyLight
この青いレイ達。
Final Gathering
SkyLight
?
少なくない??
例) Skylightだけのシーン
にじみだらけ。
Final Gathering
SkyLight
?
こっちにレイを
飛ばしたい。
Lightmass Portal
Lightmass Portal
Final Gatheringの再分割を強制させる。
SkyLight
P
o
r
t
a
l
Lightmass Portal
Final Gatheringの再分割を強制させる。
SkyLight
P
o
r
t
a
l
Lightmass Portal
Final Gatheringの再分割を強制させる。
SkyLight
P
o
r
t
a
l
実際にレイを見てみます
Lightmass Portal
なし vs あり
Lightmass Portal
なし vs あり
例) Skylight+Portalのシーン
にじみがなくなる。
Lightmass Portal
なし vs あり
LightmapのPaddingの問題が。。。
Skylightで屋内を照らす際、
Final GatherでSkylightを
重点的にサンプリングできるように、
Lightmass Portalを窓などに配置しましょう。
Direct Lighting
Photonを出さない
Sky Light
の
Lightmap作成のまとめ
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Final Gathering時に
直接参照
Indirect
Lighting Photon Mappingで
シミュレーション
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Lightmap作成のまとめ
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Final Gathering時に
直接参照
Indirect
Lighting Photon Mappingで
シミュレーション
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Sky LightはPhotonを放出しない
SkyLight
けど間接光は出したい。
SkyLight
Final Gathering
Irradiance Caching
各テクセルに対して。。。
近くに十分な
IRCある?
NO!!
YES!!
なら補完して
値を格納Photon Mapping
Scene Setup
Mini Final Gather
For Sky Lights
本来のFinal Gatheringの前に…
SkyLight
本来のFinal Gatheringの前に、
SkyLight用の非常に小さなFinal Gatheringをシーンで
行い、キャッングしておく。
SkyLight
Cache!
本来のFinal Gatheringの前に、
SkyLight用の非常に小さなFinal Gatheringをシーンで
行い、キャッングしておく。
SkyLight
本来のFinal Gatheringの前に、
SkyLight用の非常に小さなFinal Gatheringをシーンで
行い、キャッングしておく。
SkyLight
本来のFinal Gatheringのとき、
SkyLight
本来のFinal Gatheringのとき、
前もってキャッシュしておいたSkyLightの情報を取
得してそこからの照り返しを計算する。
SkyLight
example
スカイライトのみで照らしたシーン
example
天井に、地面の照り返しが来てるのがわかるかと思います。
問題点
Skylightの二次以上の反射を取れない
SkyLightここのSkylightingの事前キャッシュの値は?
問題点
Skylightの二次以上の反射を取れない
SkyLightここのSkylightingの事前キャッシュの値は0
問題点
Skylightの二次以上の反射を取れない
SkyLightこの周辺の事前キャッシュのライティング値は0
問題点
Skylightの二次以上の反射を取れない
SkyLight
この時に、こんなオブジェクトがあったとします
問題点
Skylightの二次以上の反射を取れない
SkyLight
Final Gathering!!!
問題点
Skylightの二次以上の反射を取れない
SkyLight
Final Gathering!!!
してもサンプリングするのは闇
example
example
example
まっくろ。
どんなに設定を上げても、
二次以降のバウンスは存在しない
Indirect Lighting
Photonを出さない
Sky Light の
Lightmap作成アルゴリズムのまとめ
Point
Spot
Directional
Light..
Sky Light
Direct
Lighting ライトに
直接レイを飛ばす
Final Gathering時に
直接参照
Indirect
Lighting Photon Mappingで
シミュレーション
Final Gathering前に
事前キャッシュ
(二次以降バウンスなし)
Direct
Lighting
Indirect Lighting
Photonを出す
Light
Photonを出さない
Sky Light
Final Gathering
Irradiance Caching
各テクセルに対して。。。
近くに十分な
IRCある?
NO!!
YES!!
なら補完して
値を格納Photon Mapping
Scene Setup
Mini Final Gather
For Sky Lights
おしながき
1. Lightmassによる、Lightmap 作成アルゴリズム
2. Lightmap作成のためのLightmass設定方法
おしながき
1. Lightmassによる、Lightmap 作成アルゴリズム
2. Lightmap作成のためのLightmass設定方法
Lightmass.ini
Lightmassの設定パラメータファイル
• Engine/Config/BaseLightmass.iniにLightmassの設定があります。
• Game/Config/DefaultLightmass.ini
などを記載することでゲームで上書きできます。
• Lightbuild時に毎回参照されるので、パラメータを変えても、再起動す
る必要はありません。
Lightmass.ini
Lightmassの設定パラメータファイル
• 問題は、そのパラメータが150個以上あること。
• Photon Mappingのパラメータだけでもこれぐらいあります。
いやですよね。
パラメータを一括で調整する機能が
エディタにあります。
• World Settingsの “Lightmass”タブ
特に、一番重要かつよく触るであろう上記4パラメータ
を本日は説明します。
ここでは、それらがアルゴリズムにどのように
影響していくかを説明します。
真茅さんが次の講演で
これらがどのように
絵作りに影響をあたえるのかを、
実際のシーンで説明してくれます。
大前提:
Lightmass Importance Volume
Photonの放出範囲などを決める大事なもの。
ないと、UE4が大きさを自動で判断するが、
基本的には使い物にならないと思ってよい
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
必要な設定項目を振り返る
World Settings:
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
World Settings:
Static Lighting Level Scale
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
Lightmass内部のWorld Grid.
どれぐらいスケール
するかを設定する。
小さくすればするほど
ビルド時間が激増します。
World Settings:
Static Lighting Level Scale
SLLS = 1.5 SLLS = 0.5
SLLSを小さくすると、Irradiance Cacheの半径も小さくなり
FGすべきサンプルが増えます。
ディティールが向上しますが、
それだけビルド時間が増えます。
World Settings:
Num Indirect Lighting Bounces (NILB)
Photonが何回反射するか?その
最大数を設定できる。
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
World Settings:
Num Indirect Lighting Bounces (NILB)
このサンプルシーンで確認してみる。
マーキングされているテクセルが参照するフォトンの
バウンスを確認
World Settings:
Num Indirect Lighting Bounces (NILB)
0th Bounce (Direct Photon)
World Settings:
Num Indirect Lighting Bounces (NILB)
1st Bounce
World Settings:
Num Indirect Lighting Bounces (NILB)
2nd Bounce
World Settings:
Num Indirect Lighting Bounces (NILB)
3rd Bounce
World Settings:
Num Indirect Lighting Bounces (NILB)
4th Bounce
World Settings:
Num Indirect Lighting Bounces (NILB)
50th Bounce
World Settings:
Num Indirect Lighting Bounces (NILB)
Direct Photon 1st Bounce
1回目のバウンスでフォトンが激減するので、
ビルド時間への影響が少ない
World Settings:
Num Indirect Lighting Bounces (NILB)
Photonが何回反射するか?その
最大数を設定できる。
こちらは数を上げてもビルド時
間にさほど影響しない。
基本は固定値で5とかにしてお
けば問題ないかと。
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
World Settings:
Indirect Lighting Quality (ILQ)
Final Gather 時のサンプリングの
レイの総数を決める際、この値
が掛け算される。
ビルド時間は増大するが、
にじみやノイズの除去につなが
る
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
World Settings:
Indirect Lighting Quality (ILQ)
ILQ=1 ILQ=3
World Settings:
Indirect Lighting Quality (ILQ)
ILQ=1 ILQ=3
World Settings:
Indirect Lighting Smoothness (ILS)
Irradiance Cachingのキャッシュ半径
を制御する
値を大きくすることで、ビルド時
間は減り、にじみが解消されるが、
逆に、ディティールが減る可能性
がある。
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
World Settings:
Indirect Lighting Smoothness (ILS)
ILS=2.5 ILS=0.25
World Settings:
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
Build Lighting:
Lighting Quality
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
Build Lighting:
Lighting Quality
Photon
mapping
Final
Gathering
Irradiance
Caching
Direct Lighting
(Shadowing)
影用レイの数
Photonの放出量
最大バウンス回数
レイの数 キャッシングの半径
最大バウンス回数以外の全てのクオリティを上げる。
Build Lighting:
Lighting Quality
Preview Production
Final Gatherのレイが増大
Build Lighting:
Lighting Quality
Preview Production
放出Photonもしてるのがわかります
Build Lighting:
Lighting Quality
Preview Production
Irradiance Cacheの半径も縮小
おしながき
1. Lightmassによる、Lightmap 作成アルゴリズム
2. Lightmap作成のためのLightmass設定方法
まとめ
LightmassのLightmap作成まとめ
間接光を出すために、
Lightmassは
Photon Mappingを軸とした
アルゴリズムを使用している。
SkylightはPhotonを発しないため、
作法や効果が異なる
World SettingsやBuild Qualityで
内部パラメータの調整が可能。
真茅さんへGo!!

Lightmassの仕組み ~Lightmap編~ (Epic Games Japan: 篠山範明)

Editor's Notes

  • #15 参考UDN: https://udn.unrealengine.com/questions/284375/%E3%83%A9%E3%82%A4%E3%83%88%E3%83%9E%E3%82%B9%E3%81%AE%E5%AE%B9%E9%87%8F%E3%81%AB%E9%96%A2%E3%81%97%E3%81%BE%E3%81%97%E3%81%A6.html
  • #80 EmitDirectPhotons complete, 1.217 million photons emitted in 0.2 seconds 10:54:46: Em itIndirectPhotons complete, 0.017 million photons emitted in 0.1 second DirectPhotonDensity=350 IndirectPhotonDensity=600
  • #81 10:58:14: EmitDirectPhotons complete, 4.723 million photons emitted in 0.7 seconds 10:58:14: EmitIndirectPhotons complete, 0.133 million photons emitted in 0.1 seconds DirectPhotonDensity=350 IndirectPhotonDensity=600
  • #83 DirectPhotonDensity=1000 IndirectPhotonDensity=2000
  • #84 11:15:39: EmitDirectPhotons complete, 40.000 million photons emitted in 5.8 seconds 11:15:41: EmitIndirectPhotons complete, 4.447 million photons emitted in 2.0 seconds DirectPhotonDensity=10000 IndirectPhotonDensity=20000