概要
ここでは描画負荷を下げるための手法の一つである 「オクリュージョンカリング」 について解説します。VRChatのワールド制作向けに書いてはいますが、VRChat以外でも使用できる手法です。
あくまで "ワールドの描画負荷を下げる手法" であって、ワールドの "容量を減らす手法ではない" のでそこだけは注意してください。
環境
・Unity2018.4.20f1を使用
・VRCSDK2-2020.11.16.12.43_Publicを使用
この記事の解説ではVRCSDK2を使用していますが、VRCSDK3でもVCC導入後でも同様の方法で実装が可能です。
また、Unity2022でもほぼ同様の方法で実装可能です。(Unity側の機能を使っているため)
オクリュージョンカリングとは
あるオブジェクトが他のオブジェクトに隠されてカメラに映らないときに、隠れているオブジェクトのレンダリングを無効にする機能です。
「壁の後ろにあるものはどうせ見えないんだから、描画しないで処理を軽くしちゃおー」って感じ。
ただし、なんでもかんでもオクリュージョンカリングを適応してしまうと、逆にオクリュージョンカリングの処理で重くなり、本末転倒になってしまうので適切に設定しましょう。
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を追加します。

この状態のまま再びベイク。すると…
先ほどは範囲外だった遠い位置からでもオクリュージョンカリングが効いてることが分かるかと思います。(分かりづらいけれど)

説明は以上となります。

