XR_EXT_frame_synthesis
名稱字串
XR_EXT_frame_synthesis
擴充功能類型
執行個體擴充功能
擴充功能註冊編號
212
修訂版本
1
批准狀態
未批准
擴充功能和版本依附元件
著作人
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。next是NULL,或是結構鏈中下一個結構的指標。layerFlags是 XrFrameSynthesisInfoFlagsEXT 的位元遮罩。motionVectorSubImage會識別要用於影格合成的動作向量圖片 XrSwapchainSubImage。motionVectorScale是 XrVector4f,可縮放motionVectorSubImage中移動向量的解讀方式。motionVectorOffset是 XrVector4f,可偏移motionVectorSubImage中移動向量的解讀方式。appSpaceDeltaPose是指自前一影格以來,影響檢視區塊的應用程式套用轉換增量 (如有)。人工移動 (腳本移動、瞬間移動等) 體驗會涉及應用程式在影格之間,將整個 XrCompositionLayerProjection ::space從一個應用程式空間姿勢轉換為另一個姿勢,對檢視畫面造成的影響大於影格之間追蹤到的移動。如果應用程式中沒有 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,目前影格中為 CurrNDC,且沒有任何縮放或偏移,則動作向量值為「(CurrNDC - PrevNDC) xyz」。
有效使用 (隱含)
-
XR_EXT_frame_synthesis擴充功能必須先啟用,才能使用 XrFrameSynthesisInfoEXT -
type必須為XR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
next必須是NULL,或是結構體鏈結中下一個結構體的有效指標 -
layerFlagsmust 為0或 XrFrameSynthesisInfoFlagBitsEXT 值的有效組合 -
motionVectorSubImage必須是有效的 XrSwapchainSubImage 結構 -
depthSubImage必須是有效的 XrSwapchainSubImage 結構
注意事項
生成 motionVectorSubImage 和 depthSubImage 的方法有很多種,舉例來說,應用程式可能會在專用的低解析度動作向量傳遞中算繪這些向量 (建議解析度請參閱 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。next是NULL,或是結構鏈中下一個結構的指標。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_NAMEXR_EXT_frame_synthesis_SPEC_VERSION擴充 XrStructureType:
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
問題
版本記錄
修訂版本 1,2022-01-31 (張健)
- 初始擴充功能說明,從 fb_space_warp 轉換而來
- 與貢獻者合作,改善擴充功能介面。