[添付画像1番目]のようなSceneCaptureの使い方でクラッシュが発生します。
- SceneCaptureコンポーネントをアクターに追加 (SceneCaptureComponent2D または SceneCaptureComponentCube
- SceneCaptureコンポーネントの「Capture Every Frame」が有効なまま(デフォルト)、「Capture Scene」を呼ぶ
- 同フレーム内でSceneCaptureコンポーネントを破棄
■ 技術的な原因の詳細 (若干簡略化しています)
クラッシュの直接原因は、SceneCapture中に FOcclusionFeedbackVS というGlobalShaderが見つからないことですが、本来このシェーダはモバイル向け処理(FOcclusionFeedback::SubmitOcclusionDraws)でしか使われません
[添付画像2]・[添付画像3]・[添付画像4]
という形になっていますが、Windows(PCD3D_SM6)環境でこの処理が呼ばれてしまうのは、FViewInfo 内の FSceneViewState* ViewState が既に破棄されており、無効な状態で参照されてしまっているためだと推測しています。
[添付画像5]
この無効な参照が起きる原因は、レンダラー内の BeginOcclusionTests にバグがある為だと考えています。具体的には、「Capture Every Frame」が有効な状態で「CaptureScene」を実行すると、SceneCaptureコンポーネントが保持している FSceneViewState が BeginOcclusionTestsパス(描画ステップ)によって参照されます。この BeginOcclusionTestsパスは非同期パスとしてマークされているため、実際の実行は「CaptureScene」が終わった後になることが多いです。そのため、「CaptureScene」実行後にSceneCaptureコンポーネントと FSceneViewState が破棄されても、非同期パス側がまだそのポインタを参照し続け、不正アクセス(クラッシュ)に繋がります。
[添付画像6]
レンダパスの非同期実行をOffにして(r.RDG.ParallelExecute 1)、クラッシュがなくなることは確認できています。