ソフトウェア オクルージョン クエリ とは、アクタの指定されたレベルオブディテール (LOD) を使用して、そのアクタの後ろにあるアクタをオクルードするオクルージョン方法を示します。 ハードウェア オクルージョン クエリでは GPU 上でビジビリティの確認を行いますが、このカリング方法では CPU 上でシーンをラスタライズすることでアクタをカリングします。 ソフトウェア オクルージョンの保守的なデザインは、すべてのモバイル デバイスで有効にすることができ、使用できることを意味しています。 また、ハードウェア オクルージョン クエリにはモバイル上で 2 フレーム の レイテンシーがありますが、ソフトウェア オクルージョンには 1 フレーム のみのレイテンシーがあることにも留意してください。

左: オクルージョン用に指定された一連のスタティック メッシュを含む、ソフトウェア オクルージョン デバッグ ビジュアライゼーションを使用したシーン ビュー。 右: 「オクルーダ」であるスタティック メッシュによりジオメトリがカリングされている様子を示す、家の裏側を表示したシーン ビュー。
ソフトウェア オクルージョン クエリを有効にする
ソフトウェア オクルージョンを有効にするには、 [Project Settings (プロジェクト セッティング)] > [Rendering (レンダリング)] > [Mobile (モバイル)] にある [Support Software Occlusion Culling] を設定します。
別の方法として、次のコンソール変数を使用することもできます: r.mobile.AllowSoftwareOcclusion 1
複数のデバイスを対象とする場合は、デバイス プロファイル マネージャを使用してソフトウェア オクルージョンを有効にしてください。
オクルーダ メッシュを設定する
オクルージョン カリングを機能させるには、最初にオクルーダとなるスタティック メッシュの LOD を指定する必要があります。 指定された LOD は、カメラ ビューでその裏側になる、シーン内のその他のアクタを遮るのに使用されます。
スタティック メッシュ エディタでは、 [Details (詳細)] パネルで [LOD for Occluder Mesh] の値を「0」以上に設定することで、これを有効にします。

LOD オクルーダ メッシュの値を設定する際は、そのメッシュが持つ LOD の数以下の値を設定する必要があります。 例えば、メッシュに 3 つの LOD がある場合は、0 がベース メッシュになり、LOD 1 と 2 は詳細度がより低いものになります。 値を「-1」に設定すると、オクルーダ メッシュとして割り当てられる LOD はないことになります。
オクルーダとして合理的な中規模から大規模サイズのメッシュのみを有効にしてください。 小規模サイズのメッシュを有効にしても、オクルージョンの効果はほとんど、もしくはまったくありません。
ソフトウェア オクルージョンのためのビジュアライゼーションをデバッグする
スタティック メッシュでオクルーダ メッシュとして使用する LOD を設定したら、レベル ビューポート内で [Software Occlusion Buffer (ソフトウェア オクルージョン バッファ)] ビジュアライゼーションを有効にできます。 このビュー モードでは、モバイル プレビューアの使用時に画面左上に小さなウィンドウが表示されます。 バッファには選択したオクルーダ メッシュのみが表示され、ハードウェア オクルージョン クエリがシーン内で他のオブジェクトで遮られるオブジェクトをカリングするのと同様に、これらを使用してビューで遮られるメッシュをカリングします。
このビジュアライゼーション ビュー モードを有効にするには、以下のステップに従ってください。
- モバイル プレビューアを使用するようレベル ビューポートを設定します。
- コンソール ( ` 、 @) を使用して、「r.SO.VisualizeBuffer 1」でソフトウェア オクルージョン ビジュアライザを有効にします。
有効にすると、レベル ビューポートの画面左上に表示されるバッファ ビジュアライゼーション ウィンドウに、オクルーダとして有効になっているスタティック メッシュが描画されます。
クリックしてフルサイズ表示
これで、スタティック メッシュ エディタで オクルードされたメッシュの LOD として有効になったスタティック メッシュが表示されます。 よりわかりやすく示すために、下の例では、バッファ ビジュアライゼーション ビュー モードのためにオクルーダ メッシュとして有効になっているアクタがハイライト表示されています。


パフォーマンスの統計情報
「stat softwareocclusion」 コマンドを使用して、レベル内でのソフトウェア オクルージョンの有効性を示します。
クリックしてフルサイズ表示
シーンで処理されているものと、かかっているレンダリング時間については、[Cycle Counters (サイクル カウンター)] を参照してください。 [Counters (カウンター)] は、オクルーダ、オクルーディ、オクルージョン カリングされるその他のオブジェクトを含む、バッファにラスタライズされる、シーン内の三角ポリゴンの定義に使用されます。
シーン統計の例
この演習では、単一のビューと、そこから得られる統計データのみを使用しています。 実際に使用するご自分のシーンでは、複数のビューでテストし、必要に応じてオクルーダを追加して、オクルージョン カリングの品質を高めることを推奨します。

シーン ビューと、ソフトウェア オクルージョン バッファ ビジュアライゼーションとの比較
LOD 0 を使用するよう設定されたスタティック メッシュをいくつか含む上記のようなシーンで作業を開始した場合は、レベル内のこの位置とビューでのソフトウェア オクルージョンのパフォーマンスに関する統計データは次のようになります。

この統計データについて、次のことに留意してください。
- [Cycle Counters] では、[Process Time (処理時間)]、[Process Occluder Time (オクルーダ処理時間)]、そして [Rasterize Time (ラスタライズ時間)] に多大な時間がかかっていることがわかります。 バッファでラスタライズされるトライアングルの数を削減することで、これらすべてが向上します。さらに次の点にもつながります。
- [Counters] では、[Rasterized occluder tris (ラスタライズされたオクルーダ トライアングル)] に注目してください。 これらのトライアングルは、オクルーダとして指定されたスタティック メッシュ LOD を表しています。 合計 3,055 個のトライアングルに対して、現在 17 個のオクルーダがラスタライズされています。 より少ない数のトライアングルを含むより低い LOD を使用することで、それらにかかる処理時間が削減されます。
これらいくつかの統計データから、処理されるトライアングル数を削減することで、ソフトウェア オクルージョンのパフォーマンスを向上できる領域を特定することができました。 より少ない数のトライアングルをスタティック メッシュ エディタで使用して、独自の LOD を生成することで、トライアングル数を削減できます。 このシーン例の大部分のコンテンツは Infinity Blade: Grass Lands コンテンツパックから取り込んだもので、オクルーダ スタティック メッシュの平均トライアングル数は約 2,000 個となっています。 新しい LOD をいくつか設定して、オクルーダ メッシュの LOD として割り当てることで、統計データが次のようになりました。

最後に注目すべき統計データは、[Total occludees (合計オクルーディ数)]、[Culled (カリング済み)]、そして [Total occluders (合計オクルーダ数)] です。 これらのデータは、カリングされたオブジェクトの数、オクルーダ オブジェクトの数、そして現在表示されているオクルーディの数を示すことで、ソフトウェア オクルージョンのパフォーマンスを示しています。 これらのデータを比較して、改善の余地がある領域を判断することができます。

もう少し細かく分析すると、現在のビューからカリングされる可能性のあるオブジェクトが合計で 951 個あります。 これらのオブジェクトのうち、このビューでは 406 個が 17 個のオクルーダによってカリング済みです。 つまり、これらの 17 個のオクルーダは、オクルージョン カリングされる可能性のあるオブジェクトの約 43% をオクルージョン カリングしたことになります。 小さなオクルーダでは、他のオブジェクトを遮るのにあまり役に立たないことに注意してください。 オクルーダとしては中規模から大規模サイズのメッシュのみを使用して、大多数のオブジェクトをカリングしながらも、適度なパフォーマンスを維持するようにしてください。
カリングされるオブジェクトの数を向上するには、追加のオクルーダを設定して、シーン内で遮られる部分を増やします。 バッファ ビジュアライザを使用して、レベル内の様々な場所の統計データを確認しながら、現在のカメラ位置から何が遮られているかを判断してください。