Version: 2017.4
サイズを大きくまたは小さく見せる
マテリアル、シェーダー、テクスチャ

オクルージョンカリング

オクルージョンカリングは、あるオブジェクトが他のオブジェクトに隠されていて現在カメラに映らないときに、オブジェクトのレンダリングを無効にする機能です。これは、3D コンピュータグラフィックスでは自動的に行われません。カメラからもっとも遠いオブジェクトが最初に描かれ、近いオブジェクトは、それらの上に描画されるからです(これは “overdraw” と呼ばれています)。オクルージョンカリングは、フラスタムカリングとは違います。フラスタムカリングは、カメラの表示領域外にあるオブジェクトのレンダラーを無効にしますが、“overdraw”よって視界から隠されたものについては無効にしません。オクルージョンカリングを使用するときには、まだフラスタムカリングの効果も有効なことに注意してください。

迷路的な屋内のステージ。この通常のシーンビューではすべての可視ゲームオブジェクトが表示されています。
迷路的な屋内のステージ。この通常のシーンビューではすべての可視ゲームオブジェクトが表示されています。
通常の、フラスタム(錐台)カリングにより、カメラ内のオブジェクトだけが描画されます。これは常に自動で行われる機能です。
通常の、フラスタム(錐台)カリングにより、カメラ内のオブジェクトだけが描画されます。これは常に自動で行われる機能です。
オクルージョンカリングでは、カメラ内にあるオブジェクトで、手前のオブジェクトに完全に隠れているものが取り除かれます。
オクルージョンカリングでは、カメラ内にあるオブジェクトで、手前のオブジェクトに完全に隠れているものが取り除かれます。

オクルージョンカリングの処理では、まず仮想的なカメラを使ってシーン全体をスキャンし、可視状態になり得るオブジェクトの階層構造を生成します。ゲームの実行時には各カメラがこのデータを利用して、可視か不可視かを識別します。その識別結果を利用して、Unity は可視状態のオブジェクトだけを描画します。その結果、ドローコール数が減少し、ゲームのパフォーマンスが向上します。

オクルージョンカリングに用いられるデータは複数のセル( Cell )で構成されています。各セルはシーン全体のバウンディングボリューム( Bounding Volume )を分割したものです。ちなみに、より詳細にはこれらのセルは 二分木を構成しています。オクルージョンカリングは二つの木構造データを使います。一つは View Cells (静的オブジェクト向け)で、もう一つは Target Cells (移動するオブジェクト向け)です。View Cells は可視の静的オブジェクトのインデックスに紐付けられていて、静的オブジェクト向けにより正確なカリング結果を提供するために使われます。

ゲームオブジェクトを作成するときには、このセルのことを理解しておくとよいでしょう。なぜなら、ゲームオブジェクトのサイズと、セルのサイズのバランスをうまい具合に取る必要があるからです。オブジェクトに対して小さすぎるセルや、逆に複数のセルにまたがるようなオブジェクトも作るべきではありません。大きなオブジェクトを小さなピースに分割することで、カリングの効果を向上することができるかもしれません。しかしながら、その一方ではドローコールを削減するためには小さなオブジェクトをマージすることもできます。そして、同じセルに含まれているオブジェクト同士にはオクルージョンカリングの効果は発動しない、という点も注意が必要です。

“overdraw” シーン描画モードを使用すれば、行われているオーバードローの量が分かります。またゲームビューの Stats 情報ウィンドウでは、描画されている三角形、頂点、バッチの量を見ることができます。以下の画像はそれらの、オクルージョンカリングの適用前と適用後の比較です。

Overdraw シーンビューでは、表示される壁の向こうにある部屋が多数描画されているのでオーバードローの密度が高くなっています。これらはゲームビューでは表示されないにも関わらず描画のために処理時間がかかっています。
Overdraw シーンビューでは、表示される壁の向こうにある部屋が多数描画されているのでオーバードローの密度が高くなっています。これらはゲームビューでは表示されないにも関わらず描画のために処理時間がかかっています。
オクルージョンカリングを適用すると、遠くにある部屋は描画されず、オーバードローの密度が格段に低くなり、描画される三角形とバッチの数も劇的に減少していますが、ゲームビューにおける見た目にはまったく影響しません。
オクルージョンカリングを適用すると、遠くにある部屋は描画されず、オーバードローの密度が格段に低くなり、描画される三角形とバッチの数も劇的に減少していますが、ゲームビューにおける見た目にはまったく影響しません。

オクルージョンカリングの設定

オクルージョンカリングを利用するにあたっては、いくつかの設定が必要になります。まず、ジオメトリのレベルをちょうどいい大きさのピースに分割しておかなければなりません。さらにレベルを明確に定義し、できるだけ小さなエリアごとにまとまるように配置することもお勧めします。例えば、エリアの粒度はレベルに存在する壁やビルなどの非常に大きなオブジェクトに一度に閉塞されるようなもの同士がまとまる程度にするとよいでしょう。この考え方は、個々のメッシュがオクルージョンのデータに基づいて有効化または無効化されるというものです。したがって、例えばレベルにたった一つのオブジェクトしか無く、しかもその中に部屋とすべての家具のメッシュが含まれているような場合には、すべてがカリングされるか、または何もカリングされないか、の 2 択になってしまいます。これでは意味がありません。また、家具のパーツごとにメッシュをわけて、それぞれのパーツがカメラの視点に基づいてカリングされるようにする、ということも同じくらい意味がありません。

シーン内でオクルージョンを適用するすべてのオブジェクトには Inspector 内で Occluder Static タグをつける必要があります。これを行う方法は、オクルージョンの計算に含めたいオブジェクトを複数選択し、Occluder Static および Occludee Static のチェックマークをつけることです。

オブジェクトのオクルージョンのためチェックマークをつける
オブジェクトのオクルージョンのためチェックマークをつける

Occludee Static をどのような場合に利用できるか説明します。他のオブジェクトを遮ることがない透明なオブジェクトや小さなオブジェクトには、Occluders ではなく Occludees のチェックマークをつけるべきです。このチェックマークが付けられたオブジェクトは、他のオブジェクトによる遮蔽判定のときには考慮され、遮蔽する側として判定された場合には無視されます。これにより計算コストが下がります。

LOD グループを使用するとき、基本レベルのオブジェクト (LOD0) のみが Occluder として使用される場合があります。

オクルージョンカリングウィンドウ

オクルージョンカリングに関して何か操作するときは、Occulusion Culling ウィンドウ (Window->Occlusion Culling) を利用するとよいでしょう。

Occulusion Culling ウィンドウでは、遮蔽するメッシュの設定や、オクルージョンエリア の設定が行えます。

Occlusion Culling ウィンドウObject タブで、メッシュレンダラー を選択している場合は、Static 関連のフラグを変更することができます。

メッシュレンダラー用の Occlusion Culling ウィンドウ
メッシュレンダラー用の Occlusion Culling ウィンドウ

Occlusion Culling ウィンドウObject タブで、オクルージョンエリア を選択している場合は、オクルージョンエリア関連のプロパティーを変更することができます(詳細については、オクルージョンエリア を参照してください)。

オクルージョンエリア用の Occlusion Culling ウィンドウ
オクルージョンエリア用の Occlusion Culling ウィンドウ

メモ: オクルージョンエリアを一つも作成していない場合は、デフォルトではシーン全体にオクルージョンカリングが適用されます。

注意: カメラがオクルージョンエリア外にある場合、オクルージョンカリングは適用されません。したがって、カメラが移動する可能性のある場所をオクルージョンエリアに設定しておくことがいいです。しかし、オクルージョンエリアをあまりに大きしすぎると、今度はベイク処理に時間がかかってしまいます。

オクルージョンカリング - Bake

オクルージョンカリングインスペクターの Bake タブ
オクルージョンカリングインスペクターの Bake タブ

オクルージョンカリング bake ウィンドウには、Unity のデフォルト値にベイク値をリセットすることができる “Set Default Parameters” ボタンがあります。多くの場合、典型的なシーンに適しています。しかし、シーンの内容に合わせて値を調整することによって、さらに良くなるかもしれません。

プロパティー

プロパティー 機能
Smallest Occluder オクルージョンカリングを行う際に、他のオブジェクトを非表示にするために使用されるオブジェクトの最小サイズです。このサイズよりも小さなオブジェクトは、それらによってオクルージョンされたオブジェクトをカリングすることはありません。たとえば、値が5の場合では、5メートルより高いまたは広いすべてのオブジェクトは、その背後に隠れたオブジェクトがカリングされることになります(レンダリングされず、レンダリング時間を節約します)。このプロパティーのよい値を選ぶことによって、オクルージョンデータのためにオクルージョンの精度とストレージのサイズのバランスをとることができます。
Smallest Hole この値は、カメラから見ることのできるジオメトリ間のもっとも小さな隙間を表します。値は、穴を通り抜けることができたオブジェクトの直径です。シーンでは、カメラが見ることができる非常に小さな隙間がある場合、最小の穴の値は隙間より小さくなければなりません。
Backface Threshold Unity のオクルージョンは、裏面をテストすることで不必要なディティールを削減し、データサイズを最適化しています。デフォルト値の100は、堅牢で、データセットから裏面を削除することはありません。値を5にした場合は、目に見える裏面の位置に基づいて、積極的にデータを省きます。一般的に、カメラ位置からはほとんどの裏面、例えば、地形モデルの裏側や、たどり着けない位置にある固体オブジェクトの内側などは、見えないためです。閾値が100より小さい場合、Unity は、データセットから完全にこれらの領域を削除します。これにより、オクルージョンのためのデータサイズが削減されます。

Bake タブの下部に Clear と Bake ボタンがあります。オクルージョンカリングデータの生成を開始するために Bake ボタンをクリックします。データが生成されたら、プレビューし、オクルージョンカリングをテストするために Visualization タブを使用することができます。結果に満足できない場合、以前に計算されたデータを削除するために Clear ボタンをクリックします。その後、設定を調整して再度ベイクしてください。

オクルージョンカリング - Visualization

オクルージョンカリングインスペクターの Visualization タブ
オクルージョンカリングインスペクターの Visualization タブ

バウンディングボリュームのサイズはシーン内のすべてのオブジェクトに影響されるため、できるだけすべてのオブジェクトがシーンの可視領域に収まるようにしてください。

オクルージョンデータを生成する準備ができたら、Bake ボタンをクリックしましょう。その際、Bake タブにある Memory Limit の値を正しく選択しましょう。この値が小さいほどデータの生成は高速になり、内容は不正確になります。逆に値が大きいほどリリースに向けた製品レベルのクオリティーに近づいていきます。

オクルージョンデータの生成にかかる時間はセルの詳細さとデータサイズ、選択したクオリティーに左右されることに注意してください。

生成処理が完了したら、ビューエリアにカラフルな立方体が表示されます。この立方体と同じ色に着色されている領域は、それぞれ同じオクルージョンデータを共有しています。

Clear ボタンをクリックすると、オクルージョンカリングのために以前に計算されたデータを消去できます。

<!– include class-OcclusionArea –>

サイズを大きくまたは小さく見せる
マテリアル、シェーダー、テクスチャ