はじめに
UnityのLightmapを焼き付ける処理である 「Lightmap Baking」だが、非常に重い。全く終わらないことがしばしばある。今まではなんとなく「これ下げよ」「これ消してみよ」とか適当に済ませて、ベイク時間を短縮していた。
しかし、それでは毎回不必要なことをしている。何が原因かをここではっきりしてみたい。
前提条件
OS: Windows10 Pro
CPU:Ryzen 7 5800X 8Core
GPU:GeForce RTX 3080
ストレージ:外付けSSD
Unity: 2020.2.7f1
計測方法:Lightmapping.BakeAsync()を使って開始時間と終了時間の差で計測
条件:
広域マップの屋外に限定する。屋内はベイク面積が狭く、ベイク時間が超絶に肥大化することはないと思われるため。
検証
検証方法
検証1:ベイクされる地面の方の面積が広いと時間がかかるのではないか?
Planeの面積を | ベイク時間 | ベイク結果画像 |
---|---|---|
1倍 | 0:00:34 | |
2倍 | 0:00:56 | |
3倍 | 0:01:22 |
検証結果
ベイクされる面積が広がると、ベイク時間も比例して長くなる。なお、スケールして面積を大きくしても、メッシュサイズ面積を大きくしても結果は同じだった。つまり実寸の広さが関係する。
というわけで、ベイクされる方は極力狭くした方が良い。
検証2:ベイクする対象物が多いと時間がかかるか?
平面にCubeを置いて実験
Cubeの数 | ベイク時間 | ベイク結果画像 |
---|---|---|
1個 | 0:00:09 | |
8個 | 0:00:11 | |
32個 | 0:00:15 |
検証結果
増えてはいるが、比例はしていない。CUBEが単純だからかもしれない。
検証3:ベイクする複雑な対象物が多いと時間がかかるか?
平面に木を置いて実験
Cubeの数 | ベイク時間 | ベイク結果画像 |
---|---|---|
1個 | 0:00:16 | |
8個 | 0:00:29 | |
32個 | 0:00:34 |
検証結果
やはりCubeより木は複雑な分、時間はかかるようだが、比例はしていない。8個→32個の間にサチレイト(漸近)している気がする。
おそらく影を落とす面積に関連しているのではないか。つまり20個あたりで影を落とす面積がいっぱいになっており、それ以上は木が増えても影の面積が変わらないので、ベイク時間が増えないのではないかという予測。
検証4:ベイクする対象物の大きさ(落とす影の広さ)でベイク時間が変わるか
木を10分の1にして、検証してみた。
Cubeの数 | ベイク時間 | ベイク結果画像 |
---|---|---|
1個 | 0:00:10 | |
8個 | 0:00:13 | |
32個 | 0:00:22 |
検証結果
こちらは先ほどよりは比例してそう。
以上のことから、落とす影の面積が多ければベイク時間がかかる ということが言えそうである。
検証5:Lightmap Resolution を減少した場合のベイク時間
検証結果
見事に比例している。レゾリューションをあげればベイク時間がかかる。
当然のことながら、ベイクされた影は劣化していく(解像度が低くなる)。
これはベイク時間と見た目の綺麗さのトレードオフで調整していくことになる。
検証6:GPU Lightmapper はどれぐらい早くなるのか
ベイク時間 | ベイク結果画像 | |
---|---|---|
CPU (Ryzen 7 5800X 8Core) |
0:03:38 | |
GPU (RTX 3080) |
0:00:35 |
検証結果
圧倒的にGPUが早い。ベイク結果もCPUと違いがわからない。
GPU Lightmapper は極力利用したほうが良いだろう。
検証7:Direct Samplesはベイク時間に関係があるか
ベイク時間もベイク結果もほとんど同じだった。
検証結果
Direct Sampleは直接光のサンプリング数なのだが、やった感じそれほど変化がなかった。ベイク時間も変わらないので、デフォルトのまま変更しなくて良いだろう。
ただ、以下の記事によると、
この値を大きくすることでライトマップの品質を改善できますが、ベイキング時間が長くなってしまいます。
とあるので、条件によってベイク時間が変わるのかもしれない。おそらく屋内の話だと思われる。
検証8:Indirect Sampleはベイク時間に関係があるか
Indirect Sample |
ベイク時間 | ベイク結果画像 |
---|---|---|
512 | 00:02:11 | |
8 | 00:00:57 |
検証結果
Indirect Sampleを下げるとベイク時間は短くなる。今回の屋外設定においては画像の劣化という現象は確認できなかった。
以上のことから、最初最低の8にしておいて、ノイズが気になるようなら上げる、というような戦略が良いと思われる。
検証9:Environment Samplesはベイク時間に関係があるか
Environment Samples |
ベイク時間 | ベイク結果画像 |
---|---|---|
128 | 0:01:54 | |
64 | 0:01:40 | |
8 | 0:01:34 |
検証結果
ある程度関係があるが、大幅に下げている割に下げ幅はそれほどでもないので、128のままである方が無難な気がする
検証10:Max Lightmap Sizeでベイク時間が変わるか
Max Lightmap Sizeはライトマップが生成される1枚の画像サイズ。大きくなれば、陰影が当然綺麗になる。
Max Lightmap Size |
ベイク時間 | ベイク結果画像 |
---|---|---|
4096 | 0:00:26 | |
1024 | 0:00:11 |
検証結果
ベイク結果画像を見て分かる通り、解像度が落ちるとにじむ。逆ににじんだほうがよい時もあるので、その時は解像度をわざと落とすということもアリ。
時間に関しては、もろにキレイさとトレードオフになる感じ。
とりあえず最初は、512ぐらいにしておいてベイク時間をが許せば多くしていく、というのでも良い。
「Lightmap Resolution」と同様、ベイク時間の調整弁として利用していく。
検証11:Ambient Occulusion設定でベイク時間が変わるか
Ambient Occulusion (以下AO) は、オブジェクトの角とかにできる影のような黒いしみのこと。これで立体感がでるらしい。あとこれは影ではなくホコリという説もあるが、どうなんだろう?
Max Distanceは黒いしみの広がる長さ。0.1ならば10cmしみが広がる
Indirect Contributionは黒いしみの強さ。
Direct Contributionも黒いしみの強さ
Cubeの数 | ベイク時間 | ベイク結果画像 |
---|---|---|
AOあり Indirect Contribution:1 |
0:00:41 | |
AOあり Indirect Contribution:4 |
0:00:41 | |
AOなし | 0:00:38 |
検証結果
AOはベイク時間に多少影響がある。もう少し複雑な形状を入り込むともっとベイク時間に変わりがあるかもしれない。
とりあえず最初はAOなしでベイクして、立体感が欲しい場合はAOありでもう一回やる、ぐらいで良いのかもしれない。
長くなったので、以降は別の記事にする。