XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

拡張機能の種類

インスタンス拡張

登録済みの内線番号

212

リビジョン

1

承認ステータス

未批准

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

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

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

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

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

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

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

注

motionVectorSubImage と depthSubImage を生成する方法は多数あります。たとえば、アプリは、低解像度の専用モーション ベクトル パス(推奨解像度については 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 layerFlags で XR_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-01-31(Jian Zhang)

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