UnityのLODを使ってレンダリング性能を向上させる

今回はUnityのLOD(Level Of Detail)を使ってハードウェアの負荷を軽減してレンダリングの性能を向上させていきます。

なにやら難しい事をやり始めそう!と思われた方もいるかもしれません。

しかし使うだけなら全然難しい事はありません。

実際の処理はUnityにおまかせですから!(^^)/

スポンサーリンク

LODとは?

LODを使ってハードウェアの負荷を軽減するってなんぞや?と思う方もいるかもしれませんが、LODはLevel Of Detailの略でカメラからの距離に応じて表示するオブジェクトを変えて描画の負荷を減らすということです。

3Dモデルはメッシュで構成されていますが、このメッシュの面の三角形の数を減らしてレンダリングの負荷を減らします。

LODではカメラからの距離のレベルに応じて表示したいメッシュを選択し、カメラが遠くになればなるほどメッシュの少ない3Dモデルに変換していくということになります。

文字を見るより実際に設定して試してみる方がわかりやすいと思いますので、実際にメッシュを構成する三角形の数を変えたメッシュを用意し、LODに設定して試してみましょう。

実際のモデルを作るのが面倒くさい方はアセットストアにあるLODが適用されている木のモデル等をインポートし確認してみるのもいいと思います。

ProBuilderを使ってモデルを作成

今回はLODに指定するオブジェクトをProBuilderで作成します(Unityだけで完結出来る為)。

ProBuilderに関しては

Unity2018から標準搭載されるProBuilderを使うとUnity内で3DCGの作成が出来るので、ゲームの屋内ステージ等を作成するのに非常に便利です。そこで今回はProBuilderの詳細を見ていきます。

を参照してください。

今回は難しい機能は使わないのでProBuilderが使えれば問題ありません。

他の3DCG作成ソフトを使ってモデルを作成してももちろんかまいません。

まずはProBuilderのNew Shape Toolボタンを押します。

ProBuilderのNew Shape Toolでパイプ形状を作成

Shape SelectorでPipeを選択し、Height Segmentsを1にし、Build Pipeボタンを押します。

LODのサンプルオブジェクトであるパイプを作成する

続けてHeight Segmentsを10にして、Build Pipe、Height Segmentsを20にしてBuild Pipeボタンを押して合計3つのオブジェクトを作ります。

SceneビューでShading Modeの部分をShaded WireFrameにして面の構成がわかりやすくなるようにします。

メッシュの面の数を変えたパイプオブジェクト

上のように面を構成する三角形の数が違う同じ形状のオブジェクトが3つ出来上がりました。

上の画像では位置をずらしていますが、Transformは全て合わせておいてください(デフォルトでOK)。

LODに指定するオブジェクトはオブジェクトの名前に_LOD0や_LOD1のように付けておきます(Unityに外部からインポートする時等に自動でLOD Groupが作成される)。

最後の番号はレベルに合わせますが、0が一番詳細なモデルで数が増えるたびに大雑把なモデルというように順番に付けていきます。

なので、Pipeを作成した時のHeight Segmentsが1のものをPipe_LOD2、Height Segmentsが20のものをPipe_LOD0という名前に変更します。

LOD Groupを含むPipeプレハブの作成

次にヒエラルキー上の3つのPipeを全部選択(CtrlキーやShiftキーを使って)し、ProBuilderでExportボタンをAltキーを押しながらクリックします(Altキーを押しながらクリックする事でオプション画面が開きます)。

ExportでLOD GroupにしたPipeを作成

Export FormatをObjに変更します。

Exportボタンを押してLOD Groupを含むPipeプレハブを作成します。

_LOD0等と名前を付けてObjで出力した事で既にLOD Groupコンポーネントを取り付けたモデルが出力されます。

LOD Groupを含むモデルが出力された

出力したモデルをヒエラルキー上に配置し、元々作成していたPipe_LOD0~Pipe_Lod2は使わなくなったので削除しておきます。

モデルを選択すると、インスペクタにLOD Groupコンポーネントが取り付けられています。

LOD Groupでレベルを調整

上の赤枠の中がカメラからの距離に対するレベルで、個々のレベルに応じてPipeモデルの子要素にあるオブジェクトが設定されています。

今回は_LOD0~_LOD2という名前を付けてObjで出力した為、既に設定が施されていますが、自分でどの程度カメラから離れたらこのレベルに移行する、や細かいレベル分けもすることが出来ます。

Lod Groupの設定

距離とレベルはレベルの境界線を横にドラッグすると変更出来、レベル分けはレベルを選択した状態で右クリックすると、

LOD Groupのレベル分け

上のようにInsert Beforeで選択したレベルの前に新しいレベルを挿入し、Deleteで選択したレベルを削除することが出来ます。

レベルに応じたオブジェクトはRenderersのAddを押して、Pipeの子要素のLOD用のモデルを選択します。

レベルに応じたオブジェクトを設定する

今回のレベルは

LODサンプルのレベル分け

上のような感じにしました。

LOD2の右のCulledレベルに来るとオブジェクトの描画をしません。

今回はLODの名前を設定し、自動でLOD Groupを取り付けましたが、自分でLOD Groupを取り付けてレベルに応じたオブジェクトを設定していくことも出来ます。

LODのベイクしたライトマップ

LODのライトマップをベイクした場合は一番詳細なモデルが静的モデル(動かないモデル)と同じようにライティングされるようです。

ベイクしたライティングに対してLODモデルを正しく適用するにはライトプローブを使用するようです。

ライトプローブに関しては

Unityのライトプローブの概要と実際にライトプローブを使ってみます。

を参照してください。

確認

LOD Groupを取り付けたゲームオブジェクトが出来ましたので、最後に確認してみましょう。

まずはシーンビューでLOD Groupのカメラをドラッグして距離に応じてゲームオブジェクトの描画がどのように変わるかを見てみましょう。

上のようになりました。

面を構成する三角形がカメラの距離に応じて変わっているのがわかりますね。

次にゲームビューのStatsを有効にしてレンダリング性能がどのように変わるかを見てみます。

LOD Groupが有効な場合はTris(三角形)とVerts(頂点)の計算でレベルに応じて計算しています。

ですがLOD Groupを無効にした場合はカメラが遠くにあっても計算する必要がある為、変わりません。

終わりに

今回は一つのPipeオブジェクトでLODの機能を確認しましたが、通常のゲームでは大量のゲームオブジェクトが描画されます。

その為、複雑なメッシュを大量にゲーム内に登場させるとレンダリングに時間がかかり処理が遅くなる可能性もあります。

そんな時にLODを使ってカメラの距離に応じたオブジェクトを表示させることで処理速度の向上が出来るかもしれません。

また、今回は面を構成する三角形の数を増やして確認しただけですが、メッシュの面の数を少なくして形状自体を変えて作成したオブジェクトを設定する事も出来ます。

そうするとさらに処理速度の向上が望めるかもしれません。(^^)/

参考サイト

UnityマニュアルーLODー

UnityマニュアルーLOD Groupー

Unityマニュアルーレンダリング統計ウインドウー

Unityマニュアルーベイクしたライトマップの LOD (Level of Detail、詳細レベル)ー

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます