Unityのオクルージョンカリング機能についてまとめました。
Unity2019.2.10
オクルージョンカリング?
いま、以下のようにカメラとオブジェクトA、Bが配置されているとします。
ここで、オブジェクトBはオブジェクトAに隠れているのでカメラに映りません。
つまり、理論上は描画処理をスキップして処理負荷を減らすことができます。
オクルージョンカリングを使うと、このように遮蔽されているオブジェクトを描画対象から外すことができます。
オクルージョンカリングを行うにはカリングのための情報を事前に用意しておく必要があります。
この記事ではその手順を紹介します。
ベイクする
それではオクルージョンカリングを行うための準備としてベイクを行っていきます。
まず、テスト用に以下のようなシーンを用意します。
次にこれらのオブジェクトのInspectorから、Occluder StaticとOccludee Staticにチェックを入れます。
Occluderは他のオブジェクトを遮蔽するもの、Occludeeは他のオブジェクトから遮蔽されるものという意味です。
次にWindow > Rendering > Occlusion Cullingから設定ウィンドウを開きます。
そしてBakeタブを選択します。
次に、遮蔽物の最小値をSmallest Occluderに設定します。
ここに設定した値よりも小さいオブジェクトはOcculuder Staticだったとしても遮蔽物としてみなされません。
つまり、そのようなオブジェクトは他のオブジェクトを遮蔽しません。
この値を小さくするとより遮蔽の精度は上がるものの、ベイク後のデータサイズが大きくなります。
次に、以下のようにオブジェクトとオブジェクトの隙間から向こう側を覗けるような配置を考えます。
この隙間の大きさをSmallest Holeに入力すると、向こう側にあるオブジェクトがカリングされずに見えます。
ただしこの値を小さくしすぎるとデータサイズが大きくなります。
Backface Thresholdは背面ポリゴンをデータに含めるかどうかの設定です。
両面描画など、背面を描画してそれが遮蔽に関わるようなケースでは100にしておくとよさそうです。
それ以外のケースでは値を小さくするほどデータ容量削減につながります。
さてここまで設定が終わったらBakeボタンを押下します。
以下のように青いボックスが多数表示されれば準備完了です。
これらはオクルージョンカリング用の空間データで、その容量はBakeタブの最下部に表示されます。
カリングの挙動を確認する
それでは前節でベイクしたデータを使ったオクルージョンカリングの挙動を確認してみます。
まずOcculusion CullingウィンドウのVisualizationタブを表示します。
そしてこの状態でシーンビューを表示しながらメインカメラを動かします。
オクルージョンカリングが行われ、遮蔽されたオブジェクトが非表示になっている様子が確認できました。
ちなみにこの表示は、オクルージョンカリングだけでなくフラスタムカリングも適用された状態となっています。
StaticではないGameObjectをオクルージョン
さてここまでは遮蔽するオブジェクトも遮蔽されるオブジェクトもStaticなオブジェクトでした。
実は動的なオブジェクトも、静的なオブジェクトから遮蔽された場合にカリングすることができます。
設定としてはMesh RendererのDynamic Occlusionにチェックを入れるだけです。
カメラが動きうる範囲にはOcclusion Areaを設定する
さて、今下図のようにオクルージョンのデータが作られているとします。
ここで気を付けなければならないのは、カメラがこの範囲内から出るとオクルージョンカリングが効かなくなってしまうという点です。
しかしこれでは遠くから映したいときにカリングがされず処理負荷が大きくなってしまいます。
このようなケースでは、まず空のGameObjectを生成し、Occulusion Areaをアタッチします。
Is View Volumeにチェックを付け、ベイクされていないがカメラが動きうる範囲にSizeとCenterを設定します。
そしてこの状態で再びベイクします。
するとカメラを移動してもしっかりカリングが効いていることが確認できました。