XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

拡張機能のタイプ

インスタンス拡張機能

Registered Extension Number

212

リビジョン

1

Ratification Status(批准ステータス)

未批准

拡張機能とバージョンの依存関係

OpenXR 1.0

寄与者

Jian Zhang、Meta Platforms
Neel Bedekar、Meta Platforms
Xiang Wei、Meta Platforms
Guodong Rong、Meta Platforms
Trevor Dasch、Meta Platforms
Rémi Arnaud、Varjo
Paulo Gomes、Samsung Electronics
Bryce Hutchings、Microsoft
Rylie Pavlik、Collabora
Shuai Liu、ByteDance

概要

この拡張機能は、アプリケーションが提供する追加データに基づいてアプリケーションでフレーム合成を有効にするためのサポートを提供します。アプリで生成されたモーション ベクトル画像と深度画像は、ランタイムで高品質のフレーム外挿と再投影を行い、新しいフレームを合成するために使用されることがあります。これにより、アプリが FPS 目標を下回って実行されている場合でも、スムーズなエクスペリエンスが提供されます。

この拡張機能は XR_KHR_composition_layer_depth とは独立して設計されており、両方を同時に有効にして、異なる目的で使用できます。XrFrameSynthesisInfoEXT :: depthSubImage は、フレーム合成専用の深度データを使用する場合があります。また、その解像度は XrCompositionLayerDepthInfoKHR :: subImage よりも低い場合がありますdepthSubImage の推奨解像度については、XrFrameSynthesisConfigViewEXT をご覧ください。

モーション ベクトル画像と深度画像を送信する

XrFrameSynthesisInfoEXT 構造体は次のように定義されます。

typedef struct XrFrameSynthesisInfoEXT {
    XrStructureType                 type;
    const void*                     next;
    XrFrameSynthesisInfoFlagsEXT    layerFlags;
    XrSwapchainSubImage             motionVectorSubImage;
    XrVector4f                      motionVectorScale;
    XrVector4f                      motionVectorOffset;
    XrPosef                         appSpaceDeltaPose;
    XrSwapchainSubImage             depthSubImage;
    float                           minDepth;
    float                           maxDepth;
    float                           nearZ;
    float                           farZ;
} XrFrameSynthesisInfoEXT;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • layerFlagsXrFrameSynthesisInfoFlagsEXT のビットマスクです。
  • motionVectorSubImage は、フレーム合成に使用するモーション ベクトル画像 XrSwapchainSubImage を識別します。
  • motionVectorScaleXrVector4f で、motionVectorSubImage のモーション ベクトルの解釈をスケーリングします。
  • motionVectorOffsetXrVector4f で、motionVectorSubImage のモーション ベクトルの解釈をオフセットします。
  • appSpaceDeltaPose は、前回のフレーム以降にビューに影響する増分アプリケーション適用変換(存在する場合)です。人工的な移動(スクリプトによる移動、テレポートなど)では、アプリケーションが XrCompositionLayerProjection :: space 全体をフレーム間で 1 つのアプリケーション空間ポーズから別のポーズに変換し、フレーム間のトラッキングされた移動よりもビューに影響を与えます。アプリに XrCompositionLayerProjection :: space 変換がない場合、appSpaceDeltaPose は ID でなければなりません。appSpaceDeltaPoseXrPosef :: position は、現在のアプリケーションの XrCompositionLayerProjection :: space を基準にしなければなりません。
  • depthSubImage は、フレーム合成に使用される深度画像 XrSwapchainSubImage を識別します。
  • minDepthmaxDepthdepthSubImage の深度値の範囲で、[0.0, 1.0] の範囲内である必要があります。これは OpenGL の glDepthRange の最小値と最大値に似ていますが、ここでは maxDepth ≥ minDepth という要件があります。
  • nearZ は、深度スワップチェーン内の minDepth 値の正の距離(メートル単位)です。アプリは、farZ より大きい nearZ を使用して、奥行き値が反転していることを示すことができます。nearZ は無限大になる可能性があります
  • farZ は、深度スワップチェーン内の maxDepth 値の正の距離(メートル単位)です。farZ は無限大になる可能性がありますnearZ == farZ の場合、ランタイムはエラー XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

モーション ベクトル画像と深度画像をプロジェクション レイヤとともに送信する場合は、指定されたレイヤ内の各 XrCompositionLayerProjectionView 構造体に対して、XrCompositionLayerProjectionView :: next チェーンに XrFrameSynthesisInfoEXT 構造体を追加します。

ランタイムは、motionVectorScalemotionVectorOffset によって変更された motionVectorSubImage の RGB チャンネルのモーション ベクトル データを、motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz として解釈しなければなりません。コンポーネント motionVectorSubImage a、motionVectorScale w、motionVectorOffset w は無視されます。

モーション ベクトルは、前のフレームの XrFrameEndInfo ::displayTime から現在のフレームの XrFrameEndInfo ::displayTime までのピクセルの動きを表します。ランタイムは、この情報を使用して、レンダリングされたフレームを将来のフレームに外挿する場合があります。

モーション ベクトルは、正規化されたデバイス座標(NDC)空間から導出される必要があります。このコンテキストでは、Vulkan スタイルの規則が使用されます。NDC の範囲は OpenGL の NDC の範囲とは異なり、[-1, -1, 0] から [1, 1, 1] として定義されます。ただし、モーション ベクトル自体はこの範囲に制限されません。その値はピクセルの動きによって決まり、NDC 空間の境界を超える可能性があります。たとえば、前のフレームのピクセルの NDC が PrevNDC で、現在のフレームの CurrNDC で、スケールやオフセットがない場合、モーション ベクトルの値は「(CurrNDC - PrevNDC) xyz」になります。

有効な使用方法(暗黙的)

motionVectorSubImagedepthSubImage を生成する方法は多数あります。たとえば、アプリケーションは、専用のモーション ベクトル パス(推奨解像度については XrFrameSynthesisConfigViewEXT を参照)で低解像度でレンダリングしたり、MRT(Multiple Render Targets)を使用してメインビュー パスでレンダリングしたりできます。具体的なアプローチは、アプリが決定します。motionVectorSubImage には、ピクセル チャネル形式ごとに符号付き 16 ビット浮動小数点を使用することが推奨されます。

フレーム合成フラグ

typedef XrFlags64 XrFrameSynthesisInfoFlagsEXT;

// Flag bits for XrFrameSynthesisInfoFlagsEXT
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT = 0x00000001;
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT = 0x00000002;

フラグの説明

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT は、2D モーション ベクトル データが使用されていることを示します。
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT は、各フレームのレンダリングにさらに時間をかけることをアプリが希望していることをランタイムにヒントとして提供します。ただし、ランタイムによって合成されるフレームの数が増えるというトレードオフがあります。これは、CPU と GPU の使用率を節約したい(バッテリー寿命を延ばしたいなど)、または各フレームのコンピューティング バジェットを増やしたいアプリケーションに役立ちます。ランタイムは、このフラグの値に関係なく、任意のインターバルでフレームをリクエストする可能性があります。

デフォルトでは、ランタイムは 3D モーション ベクトル データを想定しているため、XrFrameSynthesisInfoEXT で説明されているように、motionVectorSubImage rgb、motionVectorScale xyz、motionVectorOffset xyz が使用されます。

XrFrameSynthesisInfoEXT layerFlagsXR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT が有効になっている場合、ランタイムは、送信されたモーション ベクトル画像を、前のフレームから現在のフレームへの 2D ピクセルの動きを表す 2D モーション ベクトル データとして解釈します。2D モーション ベクトル データの場合、ピクセル値は motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy として解釈されます。コンポーネント motionVectorSubImage ba、motionVectorScale zw、motionVectorOffset zw は無視されます。3D モーション ベクトル データではなく 2D を使用すると、合成フレームの品質が低下する可能性があります。

XrFrameSynthesisConfigViewEXT 構造体は次のように定義されます。

typedef struct XrFrameSynthesisConfigViewEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           recommendedMotionVectorImageRectWidth;
    uint32_t           recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • recommendedMotionVectorImageRectWidth : 推奨されるモーション ベクトルと奥行き画像の幅。
  • recommendedMotionVectorImageRectHeight : 推奨されるモーション ベクトルと奥行き画像の高さ。

この拡張機能が有効になっている場合、アプリケーションは、推奨されるモーション ベクトル画像解像度に関する情報を取得するために xrEnumerateViewConfigurationViews を呼び出すときに、XrViewConfigurationView :: next チェーンで XrFrameSynthesisConfigViewEXT 構造体を渡すことができます。

有効な使用方法(暗黙的)

新しい構造体

新しい列挙型定数

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • XrStructureType を拡張する :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

問題

変更履歴

  • リビジョン 1、2022 年 1 月 31 日(Jian Zhang)

    • fb_space_warp から変換された初期の拡張機能の説明
    • コントリビューターと協力して拡張機能のインターフェースを改良する。