Unityでオープンワールドゲーム等の3Dゲームを作っていると、描画処理の負荷が気になることが多いですよね。そこで私は今まで色々な最適化処理を学んできたのですが、一つだけイマイチ使い方がよく分からない最適化機能がありました。
それは「オクルージョンカリング(Occlusion Culling)」という機能です。この機能について、私は今まで
- たぶん自動的に描画を最適化してくれる機能なんだろうなぁ
- それにしてもカメラのカリング機能と何が違うんだろう?
などと思っていたのですが、よくよく調べたら自分が勘違いしているだけだということに気づきました。ただこの機会に実際に使ってみるとそんなに難しくなく、割と手軽に描画を最適化できたので「なんでもっとちゃんと使い方を調べなかったんだろう」と後悔したほどです。
そこでここでは、Unityのオクルージョンカリングについて
- そもそもオクルージョンカリングとは?
- カメラのカリング機能との違い
- オクルージョンカリングの使い方
といった点を詳しく説明していきますね。
そもそもオクルージョンカリングとは?
まずはじめに、「オクルージョンカリングって何だよ」という方がほとんどだと思いますので簡単に説明しておきます。
オクルージョンカリングは一言でいえば
です。どうせ隠れていて見えないんだったら描画しないほうが軽いだろう、というとても分かりやすい発想ですね。
ただし注意点があって、この機能は自動的には動作しないので手動で設定を行う必要があります。私はこの点を勘違いしていたのですが、どうやらリアルタイム計算だと隠れているかどうかを判定する処理が逆に重くなってしまうという事情があり、手動で予め遮蔽判定のデータを生成しておく必要があるようです。このやり方についてはこの後説明します。
なおカリングというとカメラのカリング機能(=フラスタムカリング)もありますが、オクルージョンカリングはそちらとは根本的な部分で異なるのでその点も勘違いに注意しましょう。簡単に言うと両者には
- オクルージョンカリング:隠れているメッシュをカリングする
- フラスタムカリング:カメラの描画範囲から外れたらカリングする
という違いがあります。ついでに覚えておいて頂ければと思います。
オクルージョンカリングの使い方
さて前置きはこのくらいにして、ここから本題である「オクルージョンカリングの使い方」を説明していきます。手順は次のとおり。
- 「Occluder Static」「Occludee Static」フラグを適切に設定する
- オクルージョンカリングをベイクする
- ベイク結果を確認する
ここではサンプルとして、今回はTerrainを使った次の画像のようなシーンにオクルージョンカリングの設定を行います。
では各手順を一つずつ詳しく見ていきましょう。
手順1:「Occluder Static」「Occludee Static」フラグを適切に設定する
まずはオクルージョンカリング機能を使うための下準備として、遮蔽する側・遮蔽される側のそれぞれのゲームオブジェクトに
- Occluder Static(=遮蔽する側を示すフラグ)
- Occludee Static(=遮蔽される側を示すフラグ)
のフラグを適切に設定します。具体的には
- 地形や巨大な岩・ビルなど:Occluder StaticとOccludee Staticの両方を設定
- 木・比較的小さな岩など:Occludee Staticのみ設定
- 動くゲームオブジェクト:どちらも設定なし
という感じにしてください。
なお、このフラグはゲームオブジェクトをインスペクターで表示したときの「静的」オプションのところの三角マークをクリックすると出てくるので覚えておきましょう(下図)。
手順2:オクルージョンカリングをベイクする
そうしたら次はオクルージョンカリング用のデータを生成(ベイク)します。メニューバーの「ウィンドウ」→「レンダリング」→「オクルージョンカリング」からオクルージョンカリングウィンドウを開き、「ベイク」タブの一番下にある「Bake」ボタンをクリックしましょう。
するとデータが生成されてシーンに青い格子が表示されます。これでベイク完了です。
手順3:ベイク結果を確認する
最後に、実際のオクルージョンカリングの様子を確認してみましょう。ウィンドウの「可視化」タブを選択すると実際のカリングの様子が表示されます。
地形の一部が非表示になっていることがわかりますね。これで設定完了です!
もしカリング結果を見て気に入らない場合は、ベイクタブの設定値を変更するなどしてみるとよいでしょう。
おわりに
以上、簡単ではありますがUnityのオクルージョンカリング機能の使い方をご説明しました。オクルージョンカリングは普通のゲームであれば特に設定しなくても問題ないかもしれませんが、
- オープンワールドゲーム
- スマホゲーム
など最適化が重要になるゲームの場合にとても役立つので、ぜひ上記の内容を参考にして設定方法を覚えて頂ければと思います。
この記事がUnityでのゲーム開発のお役に立てば幸いです。