ビジビリティおよびオクルージョン カリング

Unreal Engine におけるビジビリティおよびオクルージョン カリングの概要です。

Unreal Engine では、ビジビリティおよびオクルージョンのカリングを行う様々な方法を用意しています。これらのカリング方法は、ゲーム パフォーマンスの最適化に役に立ちます。それぞれの方法では、アクタが画面に描画されるかどうかを設定することで、レベル内で表示されるアクタの数を削減できます。これらの方法の中には、視錐台ハードウェア オクルージョン クエリ など同時に機能するものや、VR (バーチャル リアリティ) 向けの ラウンド ロビン オクルージョン など特定のデバイスとプラットフォームにより適合するものがあります。

カリングの仕組み

何も設定を行っていないデフォルト状態の Unreal Engine に装備されているカリング機能について紹介するために、ここでは視錐台カリングとハードウェア オクルージョン クエリに特化して説明していきます。

一般的に、ビジビリティおよびオクルージョン カリングの方法は、パフォーマンス向上のために、任意の時点において表示されるオブジェクトの数を削減することが目的です。

例えば、カメラがその位置から見えるもののみを対象にすると、少数のオブジェクトしか表示されていません (シーン ビュー)。しかし、実際にはシーンを構成するより多くのオブジェクトがあり、単にこの位置からは見えないだけであることがわかっています (上から見たシーン ビュー)。

シーン ビュー

上から見たシーン ビュー

カメラの視野角 (視錐台) の外にあるオブジェクトは表示されておらず、カリングの対象となります (赤で囲まれたオブジェクト)。

シーン ビュー

シーン ビュー | 視錐台カリングされたオブジェクトを削除

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

シーン ビュー | 視錐台内のオブジェクトのみ

オクルードされたオブジェクト | 視錐台カリング済み

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

Vis_FinalSceneView.png

Unreal Engine では様々なカリング方法を提供しており、それぞれには長所と短所があります。また、一部の方法は特定のプラットフォームに特化しています。

詳細については、下記の「カリング方法」を参照してください。

アクタの境界でビジビリティをテストする

レベル内に配置されたそれぞれのアクタには、ボックスと球を使用する一連の境界 (バウンド) が備わっており、エンジン内で様々な目的で使用されます。その 1 つとして、これらを使用して、アクタを表示すべきかどうかをテストします。アクタの境界は 球とボックスの 2 つの部分で構成されています。バウンディング球 (境界球) は、シンプルな距離テストを用いてコリジョンを迅速に検知するのに使用され、多くの場合、それが含むオブジェクトよりも大きいサイズになります。一方で、バウディング ボックス (境界ボックス) はオブジェクトの形状に近く、より正確な結果を提供します。

レベル ビューポート内でアクタの境界を視覚化するには、[Show (表示)] > [Advanced (詳細設定)] > [Bounds (境界)] を選択します。別な方法として、スケルタル メッシュ エディタ内で [Character (キャラクター)] > [Bounds (境界)] を選択する方法と、スタティック メッシュ エディタ内のメイン ツールバーで [Bounds (境界)] を選択する方法もあります。

ActorBounds.png

アクタとその境界 (球とボックス)

スタティック メッシュおよびスケルタル メッシュにはそれぞれ独自のバウンディング ボックスと球があり、インポートされた場合や、ビューポートでスケーリングまたは回転させた場合に、ジオメトリのサイズに合わせて自動的にスケーリングされます。

アクタの境界は以下の方法で編集できます。

  • レベルまたはブループリント内で目的のアクタが選択されている状態で、[Details] パネルの [Bounds Scale (境界のスケール)] を設定する。[Bounds Scale] によりアクタの境界が均一にスケーリングされ、元のスケール値の乗数として機能します。

    クリックしてフルサイズ表示。

  • スタティック メッシュ エディタまたはスケルタル メッシュ エディタを開き、[Details] パネルの [Positive Bounds Extension (正の境界拡張)] および [Negative Bounds Extension (負の境界拡張)] に不均等なスケーリング値を適用する。 ActorEditorBoundsExtension.png

アクタの境界を広げるとアクタが通常より早くカリングされないようになり、パフォーマンスとシャドウの品質に影響を及ぼす可能性があります。

カリング方法

カリング方法は、レベル内にある各アクタのビジビリティの状態を追跡するのに使用されます。シーンのデータがカリングされて、プロジェクトで採用している方法 (複数可) でテストされます。

以下のカリング方法は、その負荷量に基づいてこの順序で適用されます。

Unreal Engine では、デフォルトですべてのプロジェクトに対して視錐台カリングおよびハードウェア オクルージョン クエリ (動的オクルージョン) を使用します。プロジェクトに多数のアクタが含まれる場合、特にシーン ビュー内に多くのアクタが表示されている場合は、これらは GPU パフォーマンスに対する負荷となります。

距離

アクタごとの設定や カリング距離ボリューム など、距離のカリング方法では、カメラからのアクタの距離に基づいてアクタをレンダリングするかどうかを判断します。

アクタごとのインスタンス

レベル内の各アクタには、[Details] パネルを使用して設定可能な描画距離に対する独自の設定が含まれています。このパネルでは、アクタをレンダリングするかどうかを決定する、カメラからの最小および最大描画距離を (Unreal 単位で) 設定できます。

PerActorDistanceCullingSettings.png

アクタの描画距離の設定で以下を設定します。

  • アクタが表示される、カメラからの 最小描画距離。アクタがレンダリングされている間にアクタに最も近づける距離です。

  • アクタが表示される、カメラからの 最大描画距離。アクタがレンダリングされている間にアクタから最も離れられる距離です。

  • 現在の最大描画距離 (表示のみで変更は不可)。カリング距離ボリューム で設定された、保存済みのカリング距離を表示します (設定されている場合)。

カリング距離ボリューム

カリング距離ボリューム では、距離とサイズの配列を使って、ボリューム内でアクタをレンダリングするかどうかを設定します。このカリング方法は、ビル群や細かいインテリアが施された建造物が含まれる広大な屋外のレベルに適しており、遠距離では重要とされない細かなオブジェクトをカリングします。

詳細については「カリング方法」を参照してください。

視錐台

視錐台 カリングでは、カメラの視野角 (FOV) の可視画面領域を使って、この空間内にないオブジェクトをカリングします。視錐台とは、空間内でオブジェクトが表示される範囲 (最近から最遠) を示す近距離側および遠距離側のクリッピング平面を含むピラミッド型の形状です。この形状外のオブジェクトはすべて取り除かれて、処理時間を節約します。

ViewFrustumDiagram.png

  1. 近距離側のクリッピング平面 は、オブジェクトが表示される最もカメラに近い地点です。

  2. カメラ視錐台 は、近距離側と遠距離側クリッピング平面の間にあるピラミッド型の表示領域を表します。

  3. 遠距離側のクリッピング平面 は、オブジェクトが表示される最もカメラから離れた地点です。

レベル ビューポートでの編集時に視錐台を視覚化するには、[Show (表示)] > [Advanced (詳細設定)] を選択して [Camera Frustum (カメラ視錐台)] を有効にします。

ViewFrustumSceneCameraFrustum.png

カメラ視錐台ビジュアリゼーションが有効な状態

詳細については、上記の「カリングの仕組み」セクションを参照してください。

事前計算されたビジビリティ

事前計算されたビジビリティ ボリューム は、シャドウ キャスティング サーフェスの上に配置されたセル内にある非可動アクタのビジビリティの状態を保存します。このカリング方法は小規模から中規模サイズのレベルに最適で、ライティングのビルド中にビジビリティ データをオフラインで生成します。また、この方法はローエンドなハードウェアやモバイル デバイスに適しています。このようなハードウェアやデバイスについてパフォーマンス コストを検討する際は、より高負荷なレンダリング スレッド コストと、パフォーマンスに関してより柔軟性のある実行時メモリのコストを引き換えることで、最大の利益を得らえることに留意してください。

詳細については、「事前計算されたビジビリティ ボリューム」を参照してください。

動的オクルージョン

Unreal Engine の動的オクルージョン システムには複数のカリング方法が用意されており、使用する方法を選ぶことができます。これらの各方法では、別のアクタによってオクルードされる、カメラの視錐台 (もしくは視野角) およびレベル内にあるアクタのビジビリティの状態をトラックします。各アクタのビジビリティの状態を確認するために、GPU または CPU にクエリが発行されます。必要な確認の回数を減らすためにヒューリスティックが使用されて、カリングの有効性とパフォーマンスが全体的に向上します。

Unreal Engine では、オクルージョン クエリの発行時にシーン深度バッファを使用します。最大描画距離 (もしくは遠距離側のクリッピング平面) ではなく近似の距離に依存するため、これによって表示距離がより長くなります。深度バッファを使用することで、可動または非可動のアクタによるオクルードが可能になり、さらにそれらも別のアクタによってオクルードできるようになります。これには不透明型またはマスクされたブレンド モードのマテリアルを使用するアクタも含まれます。

ハードウェア オクルージョン クエリ

主に採用されている動的オクルージョン方法である ハードウェア オクルージョン クエリ では、アクタ単位のクエリとして、フレームごとに GPU にビジビリティの確認を発行します。アクタのビジビリティは 1 フレーム後に返されますが、カメラの動きが速すぎる場合は、これによってアクタが画面に突然現れる (ポップアップする) 弊害が生じることがあります。ハードウェア オクルージョンによるコストは、GPU 上で実行されるクエリの数によって異なります。GPU により各フレームで実行されるクエリの数を削減するには、距離および事前計算されたビジビリティの方法を使用してください。

ハードウェア オクルージョン クエリはデフォルトで有効になっており、対応するすべてのプラットフォーム上で機能します。これには、iOS 上で ES 3.1 以降を、そして Android 上で Vulkan をサポートするハイエンドなモバイル デバイスの一部も含まれます。ハードウェア オクルージョン クエリをサポートしないデバイスについては、[Project Settings (プロジェクト設定)][Rendering (レンダリング)] > [Culling (カリング)][Occlusion Culling (オクルージョン カリング)] をオフにするか、デバイスの設定ファイル内で次のコンソール変数を設定して無効にします:

      r.AllowOcclusionQueries=0

動的オクルージョンにかかるコストの詳細については、下記の「パフォーマンスに関する統計情報」を参照してください。

階層的 Z バッファ (Hierarchical Z-Buffer) オクルージョン

階層的 Z バッファ (HZB) オクルージョンはハードウェア オクルージョン クエリと同様に機能しますが、オブジェクトのカリングについてはより保守的で、結果としてより少ない数のオブジェクトがカリングされます。この方法では、アクタの境界を確認するのにシーン深度レンダー ターゲットのミップ マップされたバージョンを使用します。また、より低い MIP からのサンプリング時には、より少ない数のテクスチャ フェッチを必要とします。

HZB オクルージョンを有効にするには、次のコンソール コマンドを使用します:

      r.HZBOcclusion=1

VR 向けのラウンド ロビン オクルージョン

ラウンド ロビン オクルージョン は動的オクルージョン クエリ方法の一つで、フレームごとに両目ではなく片目を交互に変更することでステレオ レンダリングのパフォーマンスを向上します。オクルージョン データに追加されたレイテンシーのフレームにより外縁で不適切なレンダリングが行われる可能性はありますが、ラウンド ロビン オクルージョンによりフレーム全体分のクエリが節約されます。このトレード オフは、描画呼び出しまたはビジビリティ境界であるシーンで最もその効果を発揮します。

ラウンド ロビン オクルージョンを有効にするには、「.ini」設定ファイル内もしくは実行時に次のコンソール変数を使用します:

     vr.RoundRobinOcclusion=1

パフォーマンスの統計情報

ゲームの規模にかかわらず、パフォーマンスの最適化は最も重要な開発パスの 1 つです。シーン内でのオブジェクトのカリングは、パフォーマンスの最適化を達成するための優れた方法です。統計情報のウィンドウでは、ビジビリティおよびオクルージョン カリングのパフォーマンスを反映する様々な統計データを確認することができます。

例えば事前計算されたビジビリティについては、カリングされたオブジェクト データのロードに、実行時にどれだけのメモリが使用されているかに注意する必要があります。ハードウェア オクルージョン クエリについては、ヒッチングや遅れなどのパフォーマンスの問題が発生する場合は、任意のフレームで GPU に送られるプリミティブの数を確認することを推奨します。

統計情報のウィンドウを呼び出すには、コンソール ウィンドウに「stat initviews」と入力します。

StatInitViews.png

Epic Games Marketplace で入手可能な Infinity Blade Grasslands からのシーンの統計情報

表示される統計情報は [Cycle Counters (サイクル カウンター)][Counters (カウンター)] の 2 つのセクションに分かれています。[Cycle Counter] セクションの統計データはプリミティブの処理にかかるレンダリング サイクル数に特化しており、これらをミリ秒 (ms) 単位で表示します。このセクションで注目すべきなのは [View Visibility (ビューのビジビリティ)][Occlusion Cull (オクルージョン カリング)][View Relevance (ビューの関連性)]、そして [Frustum Cull (錐台カリング)] です。[Counter] セクションの統計データには、現在のビューで処理されたすべてのプリミティブが追加されます。

ビジビリティおよびオクルージョン カリングをテストする際は、以下に注意してください。

  • ワイヤーフレーム ビュー モードではオクルージョン カリングが無効になる。

  • カリング距離ボリュームや事前計算されたビジビリティ ボリュームなどのカリング方法をビューポートで使用している場合にゲームモード ビューに切り替えるには、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 Primitives (可視のスタティック メッシュ要素)

シーン内で可動性が [Static (静的)] に設定されている可視のメッシュの数です。

カリングをデバッグする

次は、ビジビリティおよびオクルージョン カリングに使用できるデバッグ オプションです。

オクルードされたアクタを視覚化する

エディタでの作業時には、ビジュアリゼーション コマンドを使用してアクタがオクルードされたかどうかを確認できます。

     r.VisualizeOccludedPrimitives 1

有効にすると、オクルードされたすべてのアクタが緑色のバウンディング ボックスで囲まれます。

レベル内に多数のアクタが含まれる場合は、レベルの一部とそれに含まれるアクタを非表示にしないと見づらくなり、デバッグ方法としてあまり有用でなくなることがあります。

オクルードされたアクタの視覚化

非表示のジオメトリ | オクルードされたアクタの表示

この例では、壁とドアにより完全にオクルードされたアクタのみがオクルードされていることに注意してください。壁の穴を通して表示されている右側のアクタは、完全にはオクルードされていません。

シーンのレンダリングをフリーズする

エディタでの作業中にレベル内にあるアクタのレンダリングの状態を「フリーズ」できるため、レベル ビューポート内を動き回ってオクルージョンの結果を調査することができます。

下記の例のように、お好みのビューからコマンド FreezeRendering を入力します。

FreezeRendering.png

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

通常のシーン ビュー

レンダリングのフリーズ | 元のカメラ ビュー

他のタイプのアクタについては、次のコマンドを使用してレンダリングの状態をフリーズします。

コンソール コマンド

説明

FreezeRendering

カメラ ビューに基づいて、レベル内にあるオクルードされたアクタ、および表示されているアクタの現在のレンダリングの状態を一時停止 / 一時停止解除します。

Foliage.Freeze

カメラ ビューに基づいて、レベル内でオクルードおよび表示されている、ペイントされたフォリッジ クラスタの現在のレンダリングの状態を一時停止します。

Foliage.Unfreeze

レベル内でオクルードおよび表示されている、ペイントされたフォーリッジ クラスタのレンダリングの状態の一時停止を解除します。

FX.FreezeParticleSimulation

レベル内のすべての CPU スプライト パーティクル シミュレーションを一時停止 / 一時停止解除します。

FX.FreezeGPUSimulation

レベル内のすべての GPU スプライト パーティクル シミュレーションを一時停止 / 一時停止解除します。

ゲーム ビュー モードを使用する

エディタでの作業中に ゲーム ビュー モードに切り替えることで、実際にゲームがどのように表示されるかを確認することができます。ゲーム ビュー モードを使用することで、ワールド内を動き回ってオブジェクトを編集しながらも、Play-in-Editor (PIE) モードやスタンドアローン ゲーム モードなど、あらゆるプレイ モード中にゲームのビジュアルを確認できます。

ゲーム ビューを有効にするには、エディタでの作業中にキーボードの G ショートカット キーを押すか、ビューポートのドロップダウン メニューから [Game View (ゲーム ビュー)] を選択します。

エディタ ビュー

ゲーム ビュー

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

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル