見出し画像

VRChat ワールド軽量化のためのLODについて

こんにちは!Klueleです。
広いワールドを作成しているとオクルージョンカリングで描画が省略できずに軽量化に苦労することがあります。この記事では、比較的広いワールドを軽くするために使うLODの設定について説明します。

目次
1.LODが適している場面について
2.簡単なLODの使い方
3.頂点数の少ないmesh
4.ビルボードの導入
5.その他の軽量化方式との比較

それでは、簡単ですが説明していきます。なお、unityは専門ではないので正確ではないかもしれません。ふんわり理解できればいいかなと思っています。
1.LODが適している場面について

LODは遠くにあるオブジェクトを簡易的に描写し、描画にかかる負荷(主にGPU側)を軽減する方法です。また、かなり遠くのオブジェクトは全く描画しなくしてドローコールを削減することもできます。とりあえず遠くのオブジェクトを描画しなくするだけで、広いエリアではかなり効果があるので、描画しない設定(Culled)だけいれてもよいです。
LODで軽量なオブジェクトに差し替えてもドローコールはあまり下がらないので、CPU負荷を下げたいときにはまず「2.簡単なLODの使い方」で説明する内容を試してみてください。

ただし、LODは遠くで小さく見えるようになって発動するため、LODを使うのは主に以下の場合になります。
・比較的小さく、多数配置されるオブジェクト
・複数のマテリアル使用や、Light Probe、Reflection Probeの影響でstatic batchingが効果的に使えないオブジェクト
・ワールドに障害物が少なく、オクルージョンカリングが適用しづらいオブジェクト

逆に、建造物のように遠くでも大きく見えるオブジェクトにはLODは適していません。VRChatで一般的な100m以下の広さのワールドだとかなり慎重な使い方が必要そうです。

2.簡単なLODの使い方

とりあえず、
・LODを適用するオブジェクトをまとめる空のオブジェクト(図のStairs)を用意します。
・そのオブジェクトにLOD Groupコンポーネントを追加します。
・LOD Groupにあるバーのうち、LOD 1~LOD3を削除し、LOD 0とCulledだけにします。
・Culled はとりあえず2%程度(1~5%の範囲で調整してください)にします。

・Stairs以下にLODを適用するオブジェクトを入れた状態で、AddにStairsをドラッグします。
・Renderers: 以下にメッシュが表示されます。

マニュアルを見るといろいろ書いてありますが、CulledだけのLODを作るだけならこれだけでできます。図にした例では同じマテリアルのオブジェクトだけをAddしているので、実はそれほど意味がないのですが気にしないでください。

3.頂点数の少ないmeshについて

LODにはLOD0~LOD3まで複数のステップで描画を簡略化したオブジェクトを登録できます。そのオブジェクトで、片面描写の簡単な四角のmeshが欲しくなることがあります。とりあえずunityデフォルトのplaneを使ってもいいのですが、planeは121頂点ありそれほど頂点数が少ないとは言えません。(実はcubeのほうが頂点数が少なかったりする。)

とにかく頂点数を少なくしたい場合は、Quadメッシュを使うのが簡単です。
このQuadメッシュは4頂点、1m×1mで作られているので軽量な四角いメッシュが必要なときには重宝します。

LOD Groupを設定したオブジェクトをPrefab化したときには、15%以下の比較的小さく見える状態でQuadメッシュを使うと良さそうです。

15%に設定すると、1m×1mの平面が約30m以上離れたときにこの状態になります。

4.ビルボードの導入

LODに登録するオブジェクトとして、平面上に描画されたビルボードを使う方法があります。ビルボードは個人的にはまだ使ったことがないのですが、少し調べてみた限りではビルボードシェーダーとアルファ設定済のCutout用テクスチャがあれば簡単に作れそうです。(調査中)

5.その他の軽量化方法について

CPUの負荷軽減には知っている範囲でも多くの方法があります。

・CameraのClipping PlanesのFarを小さくして見える範囲を制限する
・ライティングで影を描画するライトを減らす。できればpoint lightはBakeのみで使う
・static batchingを使ってドローコールを削減する
・見えない位置にあるオブジェクトはオクルージョンカリングで描画しない
・見えない位置にあるオブジェクトのMesh RendererをDisableにする
・ミラーやカメラ、RealtimeのライトやReflection Probeを極力使わない
・パーティクル、シェーダで代替できる表現では、極力物理演算を使用しない
・物理演算ではなくアニメーションで代替できるものは代替する
・バッファが必要なトリガーを大量に使用しない
・アバターが1か所に集中しやすいレイアウトにしない

マテリアルやメッシュの統合はstatic batchingとのバランスであまり効果がなかったり、見た目のデメリットが出る可能性もあり、最後に検討する方法かなと思っています。どの方法も多少は検討が必要なので、どれが有効かは比較がしづらいですが、ワールドのコンセプトに合わせた対応が必要となります。

ここまでで、簡易的なLODを使ったワールドの軽量化方法を説明しました。
それでは、楽しいVRChatライフを!

この記事が気に入ったらサポートをしてみませんか?