概要
ここでは描画負荷を下げるための手法の一つである**「オクリュージョンカリング」について解説します。VRChatのワールド制作向けに書いてはいますが、VRChat以外でも使用できる手法です。
あくまでも「ワールドの描画負荷を下げる手法」であって、「ワールドの容量を減らす**手法」ではないのでそこだけは注意してください。
環境
・Unity2018.4.20f1を使用
・VRCSDK2-2020.11.16.12.43_Publicを使用
※Unity側の機能しか使用していないので、VRCSDKのバージョン・種類に関わらず実装できるはずです。
オクリュージョンカリングとは
あるオブジェクトが他のオブジェクトに隠されてカメラに映らないときに、隠れているオブジェクトのレンダリングを無効にする機能です。
「壁の後ろにあるものはどうせ見えないんだから、描画しないで処理を軽くしちゃおー」って感じ。
ただし、なんでもかんでもオクリュージョンカリングを適応してしまうと、逆にオクリュージョンカリングの処理で重くなり、本末転倒になってしまうので適切に設定しましょう。
1. オクリュージョンカリングについて
1-1. 前準備
カメラの設定
カメラのOcclusion Culling
にチェックが入っているか確認しましょう。デフォルトで入っているので恐らく大丈夫なはずです。
オクリュージョンカリングを行うウィンドウ
Window
→ Rendering
→ Occulusion Culling
でオクリュージョンカリングの設定を行うウィンドウを出すことができます。
1-2. オクリュージョンカリングの設定について
まず初めに遮蔽物となるオブジェクトと遮蔽物に隠れると描画されなくなるオブジェクトの設定をそれぞれ行います。
設定は各オブジェクトのInspector
の右上のStatic
設定で行います。
その中の**Occluder Static
とOccludee Static
**の2つがオクリュージョンカリングの設定に関わってきます。
それぞれチェックマークを入れることで、そのオブジェクトにオクリュージョンカリングを適用できます。
両方とも似たような名前で分かりにくいと思うのでそれぞれ説明していきます。
名称 | 説明 |
---|---|
Occluder Static | 他のオブジェクトを遮蔽するオブジェクト。「隠す方」 |
Occludee Static | 他のオブジェクトから遮蔽されるオブジェクト。「隠される方」 |
1-3. どんなものに設定するのか
基本的には、静的オブジェクト(動かないオブジェクト)にしか設定しません。
以下に、どの対象物にどのように設定するのがオススメなのかまとめます。
設定対象 | 設定するもの |
---|---|
動的オブジェクト(PickUpできるもの等) | 共に設定しない |
家の壁や塀 | Occluder Static・Occludee Staticともに設定する。 |
家具や小物類 | Occludee Staticのみを設定する。 |
2. オクリュージョンカリングを実践する
2-1. ベイク
以上のことを元にオブジェクトにOccluder Static
とOccludee Static
の設定を行いましょう。地道にポチポチと。
設定が終わったら早速オクリュージョンカリングを適用させていきます。
Occulusion
のウィンドウを開き、右下にあるBake
を押しましょう。ワールド規模にもよりますが遅くても5~10秒ほどでベイクが完了します。データ容量自体は多くても50KB辺りになると思います。
せっかく設定してもベイクをしないと意味がないので忘れないようにしましょう。
オクリュージョンカリングを設定したオブジェクトを移動させるなどした場合は、そのたびに再度Bakeし直しましょう。
そうしないと、視界内のオブジェクトがチラチラと消えたり現れたりする原因となります。
2-2. それぞれのタブの説明
Occulusion
のウィンドウにそれぞれObject
・Bake
・Visualization
の3つのタブがあると思います。それぞれ説明していきます。
Objectタブ
選択中のオブジェクトのOccluder Staticと・Occludee Staticを行う場所です。
先ほど説明したInspectorのStatic設定と同様のことが行えます。
Bakeタブ
オクリュージョンカリングのBake設定を行う場所。
以下、説明。
名称 | 説明 |
---|---|
Smallest Occluder | この値よりも大きいオブジェクトが遮蔽物(Occluder)として見なされる。 |
Smallest Hole | この値よりも小さな隙間は視線を通さないと見なされ、奥にあるオブジェクトは遮蔽される。 |
Backface Threshold | 値を100未満に設定するとオブジェクトの見えない裏側のメッシュの描画を省略して、データを小さくする。 |
Visualizationタブ
シーンでオクリュージョンカリングの状態を確認する場所。
このタブを選択した状態でカメラを動かしてみると……
ただし、カメラがこの青いセルの範囲外にでるとオクリュージョンカリングが効かなくってしまいます。
そういうときにはOcculusion Areaというものを使います。
2-3. Occulusion Area
まず、Create
→ CreateEmpty
で空のオブジェクトを作成し、AddComponent
からOcculusion Area
を追加します。
この状態のまま再びベイク。すると…
先ほどは範囲外だった遠い位置からでもオクリュージョンカリングが効いてることが分かるかと思います。(分かりづらいけれど)
説明は以上となります。