UE 5.7.4 の Velocity / Depth Prepass 周りの挙動について確認させてください。
SceneCaptureを用いた表現を実装しているのですが、RenderVelocities パスが必ず実行されてしまう現象を確認しています。
実装している表現では Velocity が不要であるため質問をさせていただきたいです。
<br/>
Renderer の実装を確認したところ、以下のような挙動になっていると理解しています。
<br/>
- r.VelocityOutputPass のデフォルト値は0であり、Velocity を Depth Pass 中に出力する設定になっている
- FVelocityRendering::DepthPassCanOutputVelocity() は、r.VelocityOutputPass == 0 かつ MSAA 無効時にtrueを返す
- FDeferredShadingSceneRenderer::ShouldRenderVelocities() は、DepthPassCanOutputVelocity() がtrueの場合、View 側で実際に Velocity が必要かどうかの判定に入る前にtrueを返す
- ShouldForceFullDepthPass() が true の場合、FScene::GetEarlyZPassMode() では DepthPassCanOutputVelocity() がtrueのときに DDM_AllOpaqueNoVelocity が選択される
- DDM_AllOpaqueNoVelocity では、Depth Prepass 側で Depth + Velocity を出力する Primitive がスキップされ、後続の Velocity Pass で残りの Depth を書くように見える
- その結果、Motion Blur / TAA / TSR などで Velocity を実際には必要としていない場合でも、Depth Prepass を完了させるために RenderVelocities パスが必要になっているように見える
<br/>
この理解は正しいでしょうか?
<br/>
もしこの挙動が意図されたものである場合、Velocity を必要としない表現で追加の RenderVelocities パスを避けるための推奨設定、または安全な回避策はありますでしょうか?
<br/>
r.VelocityOutputPass を1または2に変更することも検討しましたが、以下を懸念しています。
<br/>
- r.VelocityOutputPass=1 の場合、Base Pass 側に Velocity 出力が追加され、Base Pass の負荷が増える可能性がある
- r.VelocityOutputPass=2 の場合、Velocity Pass が Base Pass 後に移動し、Async Compute とのスケジューリング上の待ちが発生する可能性がある
<br/>
また、FScene::GetEarlyZPassMode() 内の以下の分岐についても確認したいです。
OutZPassMode = bDepthPassCanOutputVelocity ? DDM_AllOpaqueNoVelocity : DDM_AllOpaque;
DDM_AllOpaqueNoVelocity の名前および実際の挙動を見ると、この分岐が少し直感に反しているように見えます。
<br/>
この分岐は意図された挙動でしょうか?
それとも既知の問題でしょうか?
もし既知の問題であれば、今後の UE バージョンで修正または改善される予定はありますでしょうか?
<br/>
以上です。よろしくお願いいたします。
[Attachment Removed]