XR_EXT_frame_synthesis

名稱字串

XR_EXT_frame_synthesis

擴充功能類型

執行個體擴充功能

擴充功能註冊編號

212

修訂版本

1

批准狀態

未批准

擴充功能和版本依附元件

OpenXR 1.0

著作人

Meta Platforms 的張建
Meta Platforms 的 Neel Bedekar
Meta Platforms 的魏翔
Meta Platforms 的榮國棟
Meta Platforms 的 Trevor Dasch
Varjo 的 Rémi Arnaud
Samsung Electronics 的 Paulo Gomes
Microsoft 的 Bryce Hutchings
Collabora 的 Rylie Pavlik
ByteDance 的劉帥

總覽

這項擴充功能提供支援,可根據應用程式提供的額外資料,在應用程式上啟用影格合成功能。執行階段可能會使用應用程式生成的動態向量圖像和深度圖像,進行高品質的影格外插和重新投影,合成新影格,即使應用程式的每秒影格數低於目標值,也能提供流暢體驗。

這項擴充功能的設計與 XR_KHR_composition_layer_depth 無關,且可能同時啟用並用於不同用途。XrFrameSynthesisInfoEXT :: depthSubImage may 使用專為影格合成作業提供的深度資料,且解析度可能低於 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
  • nextNULL,或是結構鏈中下一個結構的指標。
  • layerFlagsXrFrameSynthesisInfoFlagsEXT 的位元遮罩。
  • motionVectorSubImage 會識別要用於影格合成的動作向量圖片 XrSwapchainSubImage
  • motionVectorScaleXrVector4f,可縮放 motionVectorSubImage 中移動向量的解讀方式。
  • motionVectorOffsetXrVector4f,可偏移 motionVectorSubImage 中移動向量的解讀方式。
  • appSpaceDeltaPose 是指自前一影格以來,影響檢視區塊的應用程式套用轉換增量 (如有)。人工移動 (腳本移動、瞬間移動等) 體驗會涉及應用程式在影格之間,將整個 XrCompositionLayerProjection :: space 從一個應用程式空間姿勢轉換為另一個姿勢,對檢視畫面造成的影響大於影格之間追蹤到的移動。如果應用程式中沒有 XrCompositionLayerProjection :: space 轉換,則 appSpaceDeltaPose 必須是身分。appSpaceDeltaPose 中的 XrPosef :: position 必須與目前的應用程式 XrCompositionLayerProjection :: space 相對。
  • depthSubImage 會識別要用於影格合成的深度圖像 XrSwapchainSubImage
  • minDepthmaxDepthdepthSubImage 中的深度值範圍,必須介於 [0.0, 1.0] 之間。這與 OpenGL 的 glDepthRange 最小值和最大值類似,但這裡的要求是 maxDepth ≥ minDepth。
  • nearZ 是深度交換鏈中 minDepth 值的正距離 (以公尺為單位)。應用程式可以使用大於 farZnearZ,表示深度值已反轉。nearZ 可能無限。
  • farZ 是深度交換鏈中 maxDepth 值的正距離 (以公尺為單位)。farZ 可能是無限大。如果 nearZ == farZ,執行階段必須傳回錯誤 XR_ERROR_VALIDATION_FAILURE

提交動態向量圖片和深度圖片,以及投影層時,請為指定層中的每個 XrCompositionLayerProjectionView 結構體,將 XrFrameSynthesisInfoEXT 結構體新增至 XrCompositionLayerProjectionView :: next 鏈結。

執行階段必須解讀 motionVectorSubImage RGB 通道中的動態向量資料,並依據 motionVectorScalemotionVectorOffset 進行修改,如下所示: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,目前影格中為 CurrNDC,且沒有任何縮放或偏移,則動作向量值為「(CurrNDC - PrevNDC) xyz」。

有效使用 (隱含)

注意事項

生成 motionVectorSubImagedepthSubImage 的方法有很多種,舉例來說,應用程式可能會在專用的低解析度動作向量傳遞中算繪這些向量 (建議解析度請參閱 XrFrameSynthesisConfigViewEXT),或使用 MRT (多重算繪目標) 在主要檢視區塊傳遞中算繪這些向量。具體做法由應用程式決定。建議使用每個像素通道格式的帶正負號 16 位元浮點數,以進行 motionVectorSubImage

影格合成旗標

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 動作向量資料,因此會使用 motionVectorSubImage rgb、motionVectorScale xyz 和 motionVectorOffset xyz,如 XrFrameSynthesisInfoEXT 中所述。

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 元件。使用 2D 而非 3D 動作向量資料可能會降低合成影格的品質。

XrFrameSynthesisConfigViewEXT 結構定義如下:

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

成員說明

  • type 是這個結構的 XrStructureType
  • nextNULL,或是結構鏈中下一個結構的指標。
  • recommendedMotionVectorImageRectWidth:建議的動態向量和深度圖片寬度。
  • recommendedMotionVectorImageRectHeight:建議的動態向量和深度圖片高度。

啟用這項擴充功能後,應用程式可以在呼叫 xrEnumerateViewConfigurationViews 時,將 XrFrameSynthesisConfigViewEXT 結構體傳遞至 XrViewConfigurationView :: next 鏈結,以取得建議的動態向量圖片解析度相關資訊。

有效使用 (隱含)

  • 使用 XrFrameSynthesisConfigViewEXT 前,XR_EXT_frame_synthesis 擴充功能必須啟用
  • type 必須XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
  • next 必須NULL,或是結構體鏈結中下一個結構體的有效指標

新結構

新增列舉常數

  • 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 (張健)

    • 初始擴充功能說明,從 fb_space_warp 轉換而來
    • 與貢獻者合作,改善擴充功能介面。