LODの使いどころ

# 概要
アドベントカレンダーの3日を担当させていただきます! 
この記事では、UE4でプレイヤーの距離に応じて、モデルのポリゴン数を減らして負荷を抑える仕組みであるLODについてまとめていこうと思います。

# LOD
## LODとは?

LODとは、Level of Details (詳細度) の略です。初めにimportしたメッシュが、プレーヤーから遠い場所にいる場合、モデルの細かい凹凸や、遠すぎて見えないはずです。そのため、importしたモデルの詳細度を1としたとき、遠い場所のモデルが、元のモデルの半分の詳細度(0.5)になっても気にならないはずです。遠くから、見た場合は、細かい凹凸や構造は見えないので、なくても良いはずです。

###至近距離での凹凸の見え方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/af2dc527-e9e9-a135-f74d-4dee5a13ab89.png)

###遠距離での凹凸の見え方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/44e795e2-eac1-5280-f5d2-8eb6b8c8fe72.png)

このように遠くから見たときにモデルの詳細度は、元のモデルから下がっていても問題ないため、シーン全体をレンダリングする時の遠くにあるメッシューのポリゴン数を減らすことで負荷を抑えることができます。LODとは、このように距離に応じて詳細度を変更し、負荷を抑える仕組みです。
(正確には、メッシュのポリゴン数だけではなく、マテリアルのテクスチャー枚数や、ボーンの数、パーティクルの数などにもLODがあります。ここでは、簡単のためにMeshのLODをメインに扱います。)

## LODをより良く利用するには?
LODを利用すると、ポリゴン数の多いメッシュに関しては、遠くの方にある場合、負荷を抑えることができますが、importしたモデルと異なるLODを制作することには、いくつかデメリットや注意する点があります。
### 異なるLODを制作するコスト
近くの時に見える見た目と同じような見た目で、ポリゴン数の少ないモデルを制作する必要があります。ただし、最近では、UE4内で自動で複数のLODを制作することができたり、[simpolygon](https://www.simplygon.com/)
などを利用することで、簡単にすますことができます。(自動で複数のLODを作る際にPCで新しいモデルを生成するのに必要な計算に時間がかかる場合があります。大量のモデルそれぞれにLODを作るためには、やはり作業コストがかかってしまいます。)

### メモリーの使用量が増える
プレイヤーの距離に応じて、表示させるモデルを逐次変える必要があるので、一つのオブジェクトに複数のモデルを用意する必要があるので、その分メモリーが必要になってしまいます。そのために、ゲームのロード時間などが増加する可能性もあります。

### まとめすぎず、ばらしすぎない
LODを作る時の単位ですが、例えば、ビルのようなプレイヤーから見た時に大きな建物の場合は、その建物丸々を一つのメッシュとしてLODを作ると効率が悪いです。建物は大きいため建物の頂上付近はそこまで詳細なモデルを利用しなてくも良いのに、建物の一階部分付近にプレイヤーがいるため、全体を詳細度の高いモデルとして表示してしまいます。これを回避するために、建物をいくつかの部分に分割し、それら繰り返しで成立するような構造にすると、より良く最適化できると思います。以下の画像は、UE4のViewportのMesh LOD Colorationモードで確認した様子です。このようにしておくことでさらに最適化が進みます。

![GifMaker_20201203135619900.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/11908aa9-1071-968b-b6e8-95c2b1ca07e3.gif)

一方で、なんでも分割すれば良いというわけではないようです。分割をたくさんしそれぞれに異なるマテリアルを適応すると今度は、ドローコールが増えてしまい、逆に負荷が大きくなってしまいます。したがって、何度か検証して適切な分割にするのが良いとお思われます。

## LODを利用して、ポリゴン数を最適化する
ここでは、実際にLODを制作するフローについて簡単にまとめておきます。

### Simpolygonを利用する
[simpolygon](https://www.simplygon.com/)は、AAAタイトルなどのゲームなどでも使われているメッシュリダクションツールです。各種DCCツールのpluginやスタンドアローンのアプリがあります。このツールを利用すると、複数のLODモデルを同時に自動で制作することができます。
以下は、simpolygonのスタンドアローンアプリでリダクションを実行した結果です。このツールの利点は、UE4にモデルをimportする前に、DCCツールなどでモデルの修正や確認、調整などができる点です。(リメッシュや複数のモデルからLODの生成、マテリアル生成なども対応しています。)


![GifMaker_20201203141306734.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/da1f623b-9a6e-4746-16cf-6b559f77425b.gif)

### UE4でLODを作る

UE4では、インポートしたモデルから複数のLODを自動で生成する機能があります。やり方は、簡単で、LODを生成したいメッシュをエディターから開いて、LOD SettingからNumber of LODsの部分を必要なLODの数に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/69f6b54a-81e2-aef1-437f-82f8add12f6c.png)
その後、Apply Changesを押すと、設定した数のLODモデルが生成され、距離に応じてモデルが変わっていることがわかります。(左上のTrianglesを見ると距離に応じて数字が減少していることがわかります。)
![GifMaker_20201203164409404.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/9566c02a-1891-fae9-03a8-02805ad6fa8b.gif)

最後に、生成した各LODについてマテリアルを設定することができます。ここでマテリアルを変更する理由は、モデルが遠くにある時、そのモデルの細かい凹凸感は不必要なので、例えば距離に応じて一部のTextureの解像度を下げたり、Normal Mapをそもそも利用しないマテリアルを利用するような場合に利用すると良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/a643f88b-b457-bd5b-fdd3-07dfe39dfbc7.png)

また、テクスチャーについても、全てが同じTextureである必要はないと思います!

# まとめ

UE4でLODを生成して利用することが、気軽にできることがわかりました!
僕自身、まだまだ初心者なので、何か間違いや補足などありましたら教えてください!!

# Reference
[UE4 LODs for Optimization -Beginner-](
https://www.slideshare.net/com044/lods-for-optimization-beginner
)


UE4のLODに関するドキュメント
https://docs.unrealengine.com/ja/Engine/Content/Types/StaticMeshes/HowTo/LODs/index.html

https://docs.unrealengine.com/ja/Engine/Content/Types/StaticMeshes/HowTo/AutomaticLODGeneration/index.html

[自動LODとプロキシメッシュを使用したリメッシュ](https://historia.co.jp/archives/12346/)

[フォートナイトを支える技術](
https://www.slideshare.net/EpicGamesJapan/fortnite-97791917/67)

[ゲーム開発におけるグラフィックス最適化セミナー](https://docs.google.com/presentation/d/1f7dJu60Sy2KQgebX1Eju2TMIig1mqBAoymdaUsFMsrM/edit#slide=id.g1cfe5f6bac_2_79)