Unreal Engine では、可視性カリングおよびオクルージョン カリングの方法が用意されています。これらのカリング方法は、ゲーム パフォーマンスの最適化に役に立ちます。それぞれの方法では、アクタが画面に描画されるかどうかを設定することで、レベル内で表示されるアクタの数を減らすことができます。同時に動作することができる方法 (視錐台、ハードウェア オクルージョン クエリ など) や、特定のデバイスやプラットフォームに適した方法 (VR 向けの ラウンド ロビン オクルージョン など) もあります。
カリングの仕組み
Unreal Engine がセットアップなしでデフォルトで提供するものの感触をつかむことができるように、特に視錐台カリングとハードウェア オクルージョン クエリを見ていきます。
一般的に、ビジビリティおよびオクルージョン カリングの方法は、パフォーマンス向上のために、任意の時点において表示されるオブジェクトの数を削減することが目的です。
たとえば、カメラがその位置から見えるもののみを対象にすると、少数のオブジェクトしか表示されていません (シーン ビュー)。しかし、実際にはシーンを構成するより多くのオブジェクトがあり、単にこの位置からは見えないだけであることがわかっています (上から見たシーン ビュー)。
シーン ビュー
上から見たシーン ビュー
カメラの視野角 (視錐台) の範囲外にあるオブジェクトは見えていないため、カリングすることができます (赤い輪郭のオブジェクト)。


カメラの視錐台の範囲外にあるカリングされたオブジェクトは描画されなくなり、ビジビリティの確認を必要とし、別のオブジェクトによりオクルードされる少数のオブジェクトのみがこのビュー内に残ります。そのため、このパス中に GPU にクエリが送信され、これらの各オブジェクトのビジビリティの状態がテストされます。別のオブジェクトによりオクルードされたオブジェクトはビューからカリングされます (青で囲まれたオブジェクト)。


これで、視錐台の範囲外にある、またはオクルードされたオブジェクトはすべてビューからカリングされます。最終的なシーン ビューには、カメラ位置に基づいてシーン内に表示されるべきオブジェクトのみが表示されます。

Unreal Engine ではいくつかのカリング方法が用意されており、それぞれに長所と短所があり、一部の方法は特定のプラットフォームに特化しています。
詳細については、後述の「カリング方法」を参照してください。
アクタの境界を使用して可視性をテストする
レベル内に配置されたそれぞれのアクタには、ボックスと球を使用した一連の境界 (バウンド) が備わっており、エンジン内でさまざまなものに使用されます。その一つを使用して、アクタが表示されているかどうかをテストします。アクタの境界は球とボックスの 2 つの部分で構成されています。バウンディング球 (境界球) は、シンプルな距離テストを用いてコリジョンを迅速に検知するのに使用され、多くの場合、それが含むオブジェクトよりも大きいサイズになります。一方で、バウディング ボックス (境界ボックス) はオブジェクトの形状に近く、より正確な結果を提供します。
レベル ビューポート内でアクタの境界を視覚化するには、[Show (表示)] > [Advanced (詳細設定)] > [Bounds (境界)] を選択します。別の方法として、スケルタルメッシュ エディタ内で [Character (キャラクター)] > [Bounds (境界)] を選択し、スタティックメッシュ エディタ内のメイン ツールバーで [Bounds] を選択することもできます。

アクタとその境界 (球とボックス) の表示。
スタティックメッシュおよびスケルタルメッシュにはそれぞれ独自のバウンディング ボックスと球があり、インポート時や、ビューポートでのスケーリング時または回転時に、ジオメトリのサイズに合わせて自動的にスケーリングされます。
アクタの境界は以下の方法で編集できます。
- レベルまたはブループリントでアクタを選択した状態で、[Details (詳細)] パネルにある [Bounds Scale (境界スケール)] を設定します。[Bounds Scale] ではアクタの境界が均一にスケーリングされるため、元のスケール値の乗数として機能します。
画像をクリックすると、拡大表示されます。
-
スタティックメッシュ エディタまたはスケルタルメッシュ エディタを開き、[Details] パネルにある [Positive Bounds Extension (正の境界拡張)] および [Negative Bounds Extensions (負の境界拡張)] を使用して、均一でないスケーリングを適用します。
アクタの境界を広げるとアクタが通常より早くカリングされないようになり、パフォーマンスとシャドウの品質に影響を及ぼす可能性があります。
カリング方法
カリング方法は、レベルにある各アクタの可視性の状態を追跡するために使用されます。シーンのデータがカリングされて、プロジェクトで採用されている方法 (複数可) でテストされます。
以下のカリング方法が、その負荷量に基づいてこの順序で適用されます。
Unreal Engine では、デフォルトですべてのプロジェクトに対して視錐台カリングおよびハードウェア オクルージョン クエリ (動的オクルージョン) が使用されます。プロジェクトに多数のアクタが含まれる場合、特にシーン ビュー内に多くのアクタが表示されている場合は、これらは GPU パフォーマンスに対する負荷となります。
距離
距離カリング方法 (アクタごとの設定、カリング距離ボリューム など) では、カメラからのアクタの距離に基づいてアクタがレンダリングされるかされないかが決まります。
アクタごとのインスタンス
レベル内の各アクタには、[Details] パネルを使用して設定可能な描画距離に対する独自の設定が含まれています。このパネルでは、アクタをレンダリングするかどうかを決定する、カメラからの最小および最大の描画距離 (Unreal 単位) を設定できます。

アクタの描画距離の設定で以下の項目を設定します。
- アクタがカメラから見える [Minimum Draw Distance (最小描画距離)]。アクタがレンダリングされている間にアクタに最も近づける距離です。
- アクタがカメラから見える [Maximum Draw Distance (最大描画距離)]。アクタがレンダリングされている間にアクタから最も離れられる距離です。
- また、[Current Maximum Draw Distance (現在の最大描画距離)] を確認できます (編集はできない)。カリング距離ボリューム によって設定された保存済みのカリング距離が表示されます (存在する場合)。
カリング距離ボリューム
カリング距離ボリューム では、距離とサイズの配列を使用して、そのボリューム内にあるアクタをレンダリングするかどうかが設定されます。このカリング方法は、ビル群や細かいインテリアが施された建造物が含まれる広大な屋外のレベルに適しており、遠距離では重要とされない細かなオブジェクトをカリングします。
詳細については、「カリング距離ボリューム (Cull Distance Volume)」を参照してください。
視錐台
視錐台 カリングでは、カメラの視野角 (FOV) の可視画面領域を使用して、その領域内にないオブジェクトがカリングされます。視錐台とは、領域内でオブジェクトが表示される範囲 (最も近い距離と最も遠い距離) を示す近距離クリッピング平面および遠距離クリッピング平面が含まれるピラミッド型の形状です。この形状の範囲外のオブジェクトはすべて取り除かれて、処理時間が節約されます。

- 近距離クリッピング平面 は、オブジェクトが表示される、最もカメラに近い地点です。
- カメラ錐台 は、近距離クリッピング平面と遠距離クリッピング平面の間にあるピラミッド型の表示領域を表します。
- 遠距離クリッピング平面 は、オブジェクトが表示される、最もカメラから離れた地点です。
レベル ビューポートでの編集時に視錐台を視覚化するには、[Show (表示)] > [Advanced (詳細設定)] を選択して [Camera Frustum (カメラ錐台)] を有効にします。

カメラ錐台ビジュアライゼーションが有効になっている状態。
詳細については、前述の「カリングの仕組み」セクションを参照してください。
事前計算された可視性
事前計算された可視性ボリューム では、シャドウ キャスティング サーフェスの上に配置されたセル内にある非可動アクタの可視性の状態が保存されます。このカリング方法は小規模から中規模サイズのレベルに最適で、ライティングのビルド中にビジビリティ データをオフラインで生成します。また、この方法はローエンドのハードウェアやモバイル デバイスに適しています。そのようなハードウェアやデバイスでのパフォーマンス コストを検討する際は、より負荷が高いレンダリング スレッドのコストと、パフォーマンスに関してより柔軟性の高いランタイム メモリのコストを引き換えることで、最大の利益を得られることに留意してください。
詳細については、「事前計算された可視性ボリューム」を参照してください。
動的オクルージョン
動的オクルージョン システムには複数のカリング方法が用意されており、その中から選ぶことができます。それぞれの方法では、カメラの視錐台内 (つまり、視野角内) のレベルにあって、別のアクタによってオクルードされるアクタの可視性の状態がトラックされます。各アクタのビジビリティの状態を確認するために、GPU または CPU にクエリが発行されます。必要な確認の回数を減らすためにヒューリスティックが使用されて、カリングの有効性とパフォーマンスが全体的に向上します。
Unreal Engine では、オクルージョン クエリの発行時にシーン深度バッファを使用します。最大描画距離 (もしくは遠距離側のクリッピング平面) ではなく近似の距離に依存するため、これによって表示距離がより長くなります。深度バッファを使用することで、可動または非可動のアクタによるオクルードが可能になり、さらにそれらも別のアクタによってオクルードできるようになります。これには不透明型またはマスクされたブレンド モードのマテリアルを使用するアクタも含まれます。
ハードウェア オクルージョン クエリ
使用される主要なオクルージョン方法である ハードウェア オクルージョン クエリ では、フレームごとに可視性チェックをアクタごとのクエリとして GPU に発行します。アクタごとの可視性は 1 フレーム遅れて読み取られます。そのため、カメラが非常に高速に動いている場合は、「ポップイン」を引き起こすという悪影響が発生することがあります。ハードウェア オクルージョンによるコストは、GPU 上で実行されるクエリの数によって異なります。GPU により各フレームで実行されるクエリの数を削減するには、距離および事前計算されたビジビリティの方法を使用してください。
ハードウェア オクルージョン クエリはデフォルトで有効になっており、対応するすべてのプラットフォーム上で機能します。これには、iOS 上で ES 3.1 以降を、そして Android 上で Vulkan をサポートするハイエンドなモバイル デバイスの一部も含まれます。ハードウェア オクルージョン クエリをサポートしないデバイスについては、[Project Settings (プロジェクト設定)] の [Rendering (レンダリング)] > [Culling (カリング)] で [Occlusion Culling (オクルージョン カリング)] をオフにするか、デバイスの設定ファイル内で次のコンソール変数を設定して無効にします。
r.AllowOcclusionQueries=0
動的オクルージョンのコストの詳細については、後述の「パフォーマンスに関する統計情報」を参照してください。
階層 Z バッファ オクルージョン
階層 Z バッファ (HZB) オクルージョンはハードウェア オクルージョン クエリと同様に機能しますが、オブジェクトのカリングについてはより保守的であり、結果として、カリングされるオブジェクトの数が少なくなります。この方法では、アクタの境界を確認するのにシーン深度レンダー ターゲットのミップ マップされたバージョンを使用します。また、より低い MIP からのサンプリング時には、より少ない数のテクスチャ フェッチを必要とします。
HZB オクルージョンを有効にするには、次のコンソール コマンドを使用します。
r.HZBOcclusion=1
VR 向けのラウンド ロビン オクルージョン
ラウンド ロビン オクルージョン は動的オクルージョン クエリ方法の一つで、フレームごとに両目ではなく片目を交互に変更することでステレオ レンダリングのパフォーマンスを向上します。オクルージョン データに追加されたレイテンシーのフレームにより、外縁で不適切なレンダリングが行われる可能性がありますが、ラウンド ロビン オクルージョンによりフレーム全体でのクエリ数が節約されます。このトレード オフは、描画呼び出しまたはビジビリティ境界であるシーンで最もその効果を発揮します。
ラウンド ロビン オクルージョンを有効にするには、「.ini」設定ファイル内で指定するか、実行時に次のコンソール変数を使用します。
vr.RoundRobinOcclusion=1
パフォーマンスの統計情報
ゲームの規模にかかわらず、パフォーマンスの最適化は最も重要な開発パスの 1 つです。シーン内でのオブジェクトのカリングは、パフォーマンスの最適化を達成するための優れた方法です。統計情報のウィンドウでは、ビジビリティおよびオクルージョン カリングのパフォーマンスを反映する様々な統計データを確認することができます。
たとえば事前計算されたビジビリティについては、カリングされたオブジェクト データのロードに、実行時にどれだけのメモリが使用されているかに注意する必要があります。ハードウェア オクルージョン クエリについては、ヒッチングや遅れなどのパフォーマンスの問題が発生する場合は、任意のフレームで GPU に送られるプリミティブの数を確認することを推奨します。
統計情報のウィンドウを呼び出すには、コンソール ウィンドウで「stat initviews」と入力します。

シーンの統計情報は、Epic Games マーケットプレイス で入手可能な Infinity Blade: Grass Lands から取得されます。
統計情報の表示は、[Cycle Counters (サイクル カウンター)] と [Counters (カウンター)] の 2 つのセクションに分かれています。[Cycle Counter] セクションの統計値は、プリミティブの処理にかかるレンダリング サイクル数に特化しており、ミリ秒単位で表示されます。[View Visibility (ビューの可視性)]、[Occlusion Cull (オクルージョン カリング)]、[View Relevance (ビューの関連度)]、および [Frustum Cull (錐台カリング)] が表示されます。[Counter] セクションの統計データには、現在のビューで処理されたすべてのプリミティブが追加されます。
ビジビリティおよびオクルージョン カリングをテストする際は、以下に注意してください。
- オクルージョン カリングは、[Wireframe (ワイヤーフレーム)] 表示モードでは無効になっています。
- カリング距離ボリュームや事前計算された可視性ボリュームなどのカリング方法をビューポートで確認している場合に、ゲームモード ビューに切り替えるには、G ホットキーを使用します。
- 最も正確な結果を得るには、Play-In-Editor (PIE) または スタンドアローン ゲーム モードで [Stat InitViews (初期ビューの統計)] 統計情報を使用します。ビジビリティおよびオクルージョン カリングの結果の計算時には、ライトやカメラ、その他のものを表すアクタのジオメトリが含まれます。
- レンダリング スレッド時間に単一で最も影響を及ぼす [Visible Static Mesh Elements (可視のスタティックメッシュ要素)] を注意深く監視し、最適な状態に保ちます。
統計情報名 | 説明 |
---|---|
Cycle Counters | |
View Visibility (ビューの可視性) | アクタの可視性クエリの処理にかかったフレーム時間の量です。 |
Occlusion Cull (オクルージョン カリング) | 視錐台の範囲内にあり、別のアクタによってオクルードされたアクタのシーンのクエリにかかったフレーム時間の量です。 |
Frustum Cull (錐台カリング) | アクタの境界が視錐台の範囲内にあったかどうかのクエリにかかったフレーム時間の量です。 |
Decompress Occlusion (圧縮解除オクルージョン) | 事前計算された可視性のロードにかかったフレーム時間の量。 |
Counters | |
Processed Primitives (処理されたプリミティブ) | シーン内で処理されているアクタの合計数です。 |
Frustum Culled Primitives (錐台カリングされたプリミティブ) | 視錐台 FOV の範囲から外れた際にカリングされたプリミティブの数です。 |
Occluded Primitives (オクルードされたプリミティブ) | 視錐台 FOV の範囲内で他のアクタによってオクルードされるアクタの数です。 |
Occlusion Queries (オクルージョン クエリ) | 視錐台の範囲内に表示されているアクタの数に基づいて GPU に送られたシーン オクルージョン クエリの数です。 |
Visible Dynamic Primitives (可視の動的プリミティブ) | パーティクル システムやフォーリッジ インスタンスなど、可動に設定されている、シーン内の動的プリミティブの数です。 |
Visible Static Mesh Elements (可視のスタティック メッシュ要素) | シーン内で可動性が [Static (スタティック)] に設定されている可視のメッシュの数です。 |
カリングをデバッグする
次は、ビジビリティおよびオクルージョン カリングに使用できるデバッグ オプションです。
オクルードされたアクタを視覚化する
エディタでの作業時に、ビジュアライゼーション コマンドを使用してアクタがオクルードされているかどうかを確認できます。
r.VisualizeOccludedPrimitives 1
有効であれば、オクルードされているすべてのアクタが緑色のバウンディング ボックスで囲まれます。
レベル内に多数のアクタが含まれる場合は、レベルの一部とそれに含まれるアクタを非表示にしないと見づらくなり、デバッグ方法としてあまり有用でなくなることがあります。


この例では、壁とドアにより完全にオクルードされたアクタのみがオクルードされていることに注意してください。壁の穴を通して表示されている右側のアクタは、完全にはオクルードされていません。
シーンのレンダリングをフリーズする
エディタでの作業中に、レベル ビューポート内を動き回ってオクルージョン結果を調べることができるように、レベルにあるアクタのレンダリング状態を「フリーズ」することができます。
下記の例のように、使用しているビューでコマンド「FreezeRendering
」を入力します。

このコマンドを入力すると、シーン周辺を動き回ってオクルージョンの結果を確認できるようになります。ビューを壁の後ろに移動すると、完全にオクルードされたオブジェクトはレンダリングされず、完全にはオクルードされていなかったアクタはそのままの状態で表示されます。


他のタイプのアクタについては、次のコマンドを使用してレンダリングの状態をフリーズします。
コンソール コマンド | 説明 |
---|---|
FreezeRendering | カメラ ビューに基づいて、レベル内にあるオクルードされたアクタ、および表示されているアクタの現在のレンダリングの状態を一時停止 / 一時停止解除します。 |
Foliage.Freeze | カメラ ビューに基づいて、レベル内でオクルードおよび表示されている、ペイントされたフォーリッジ クラスタの現在のレンダリングの状態を一時停止します。 |
Foliage.Unfreeze | レベル内でオクルードおよび表示されている、ペイントされたフォーリッジ クラスタのレンダリングの状態の一時停止を解除します。 |
FX.FreezeParticleSimulation | レベル内のすべての CPU スプライト パーティクル シミュレーションを一時停止 / 一時停止解除します。 |
FX.FreezeGPUSimulation | レベル内のすべての GPU スプライト パーティクル シミュレーションを一時停止 / 一時停止解除します。 |
ゲーム ビュー モードを使用する
エディタでの作業中に ゲーム ビュー モードに切り替えることで、実際にゲームがどのように表示されるかを確認することができます。ゲーム ビュー モードを使用することで、ワールド内を動き回ってオブジェクトを編集しながらも、Play-in-Editor (PIE) モードやスタンドアローン ゲーム モードなど、あらゆるプレイ モード中にゲームのビジュアルを確認できます。
ゲーム ビューを有効にするには、エディタでの作業中にキーボードの G ショートカット キーを押すか、ビューポートのドロップダウン メニューから [Game View (ゲーム ビュー)] を選択します。


[Game View] を有効にすると、ライトやパーティクル システムのアイコンなど、アクタのアイコンが実際のゲーム画面のように非表示になります。カリング距離ボリューム または 事前計算された可視性ボリューム を使用している (そして、セル内に存在する) 場合は、カリングの積極性に応じて、それらのボリュームのカリング結果が直ちに表示されます。