現象
UE5.3およびUE5.6で作成したOpenXRアプリを実行した際、カラー画像とDepth情報の間にフレーム単位のずれが発生するという問題があります。
この現象は常に発生するわけではなく、RenderRHI、GPUの種類、ドライバーバージョンの組み合わせによって発生の有無が異なります
期待する挙動
全てのRHIにおいて、正しいDepth情報がカラー画像と同期し、フレーム単位のずれが発生しないこと。
弊社でも確認したところ以下の3点を課題として考えておりますので、ご確認いただきたいです。
課題の概要図も一緒にご確認いただければと思います。
課題①カラー画像のスワップチェインイメージのインデックス取得
(UnrealEngine5.6)\Engine\Source\Runtime\Engine\Private\Slate\SceneViewport.cpp
// We need to acquire a buffered texture from either the new RT or the existing one
int32 TextureIndex = StereoRenderTargetManager->AcquireColorTexture();
CurrentBufferedTargetIndex = TextureIndex < 0 ? CurrentBufferedTargetIndex : TextureIndex;
にて利用するスワップチェインのインデックスは、
別なタイミングで取得して保持していたインデックスを使っている可能性があります。
結果、Runtimeが利用してほしいインデックスが使われていないため、報告させていただいた現象のフレーム単位のずれにつながる可能性があると考えています。
課題②Depth画像のスワップチェインイメージのインデックス更新タイミング
(UnrealEngine5.6)\Engine\Plugins\Runtime\OpenXR\Source\OpenXRHMD\Private\OpenXRHMD.cpp
OnBeginRendering_RenderThread
OnBeginRendering_RHIThread
RHIスレッドでxrAcquireSwapchainImageを用いてDepth画像のインデックスを取得していますが、
利用するRenderスレッドとの同期がとれていない可能性があるため、
Depth画像のインデックスについても現象のフレーム単位のずれが発生する可能性があると考えています。
課題③OpenXRのSwapchain関連のAPI呼び出し順について
OpenXRの仕様では、xrAcquireSwapchainImage → xrWaitSwapchainImage → xrReleaseSwapchainImageの順番で呼び出すことが仕様上決められていると思います。
UE5.6のコード((UnrealEngine5.6)\Engine\Plugins\Runtime\OpenXR\Source\OpenXRHMD\Private\OpenXRHMD.cppのFOpenXRHMD::OnBeginRendering_RHIThread関数)では
ColorSwapchain->WaitCurrentImage_RHIThread(OPENXR_SWAPCHAIN_WAIT_TIMEOUT)の呼び出し後にColorSwapchain->IncrementSwapChainIndex_RHIThread()を呼びだしており、AcquireとWaitの順が逆転しているようです。
正しいインデックスが取得できない原因になっていると考えます。
[Attachment Removed]