オクルージョンカリングを有効にして、カスタムデプスを有効にしたメッシュをカメラ視点で隠蔽してもオクルージョンカリングの対象にならない

発生している問題:

再現手順4の時点では隠蔽メッシュ群がオクルージョンカリング対象になっていますが、再現手順6の時点だと隠蔽メッシュ群がオクルージョンカリング対象になっておらず、メッシュ量によってFPSが大きく低下します(FPS低下の主要因はDraw Call数の増加)。

補足:

手順4,6のオクルージョンカリング対象の確認手段がRGB画像に対するレンダリングのカリングのみを指しているか、ステンシルバッファに対するレンダリングのカリングも指しているかは不明。

RGBバッファ、ステンシルバッファともにメッシュAしか映らないため、隠蔽メッシュ群はカリングされることを期待しています。ステンシルバッファレンダリング分のDraw Callが増えるのは想定通りですが、極端にDrawCall数が増加しており、隠蔽メッシュ群がレンダリングされていると予想しています。

[Attachment Removed]

再現手順
1. プロジェクト設定でオクルージョンカリングを有効にする(※1)

2. カメラ前面にメッシュAを配置する

3. メッシュAの背後に隠れてカメラから見えない位置に大量のメッシュ(隠蔽メッシュ群)を配置する

4. ゲームプレイしてFPS、オクルージョンカリング対象のメッシュを確認する(※2)

5. メッシュA、隠蔽メッシュ群をカスタムデプスを有効(※3)にし、ステンシルNoを1にする(※4)

6. 再度ゲームプレイしてFPS、オクルージョンカリング対象のメッシュを確認する(※2)

※1 オクルージョンカリングを有効にする設定方法

プロジェクトを開いて

プロジェクト設定 - エンジン - レンダリング - オクルージョンカリング にチェックを入れて有効化

※2 オクルージョンカリング対象の確認はコマンド「r.VisualizeOccludedPrimitives」を1にすることで可視化して確認

※3 カスタムデプスを有効にする設定方法

メッシュを選択して 詳細 - Render CustomDepth Passにチェックを入れる

※4 ステンシルNoを1にする

メッシュを選択して 詳細 - CustomDepth Stencil Valueに1を入力する

[Attachment Removed]

お世話になっております。

本件に関しましては、ご指摘のとおりCustomDepthを有効化している場合はオクルージョンカリングを行わない仕様となっており、

ご要望のような挙動を実現する場合エンジン改造が必要となる見込みです。

エンジン実装と関連情報

以下SceneVisibility.cppの1736行付近がCustomDepthパスへ描画コマンドを積んでいる箇所です。

ここに来る次点でカリング処理後のデータとなっているため、何らかの判定により振り分ける仕組みを構築し受け渡す必要がある見込みです。

※その他パスの対応なお検証を含めると改造を行う場合はさらに調査が必要になるかと思います。

.\Engine\Source\Runtime\Renderer\Private\SceneVisibility.cpp

以下スレッドでは、直接今回の問題への回答ではありませんが、

後半にCustomDepthによってオクルージョンカリングがオフになる実装に関して記載があります。

[Content removed]

推奨対応

CustomDepthを有効にすることでオクルージョンカリングを行わない場合も、

コマンド自体は積まれますがPixelShader(PS)側は軽量となっている見込みとなり、

またBasePassのみカリングを動かした場合もCustomDepthのVertexShader(VS)は全て動く事から処理負荷が問題となる可能性があります。

数が問題といった場合CustomDepthの対象数を減らす最適化を検討頂けますと幸いです。

お手数おかけしますが、よろしくお願いいたします。

[Attachment Removed]