XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
擴充功能類型
執行個體擴充功能
擴充功能註冊編號
212
修訂版本
1
批准狀態
未批准
擴充功能和版本依附元件
著作人
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
總覽
這項擴充功能可根據應用程式提供的額外資料,在應用程式上啟用影格合成功能。執行階段可能會使用應用程式生成的動作向量圖片和深度圖片,執行高品質的影格外插和重新投影,合成新的影格,即使應用程式的執行速度低於目標每秒影格數,也能提供流暢的體驗。
這項擴充功能與 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從一個應用程式空間姿勢轉換為影格之間的另一個姿勢,對檢視畫面的影響大於影格之間的追蹤移動。如果應用程式中沒有 XrCompositionLayerProjection ::space轉換,appSpaceDeltaPose「必須」為身分。appSpaceDeltaPose必須相對於目前的應用程式 XrCompositionLayerProjection ::space,中的 XrPosef ::position才能運作。depthSubImage會識別用於影格合成的深度圖片 XrSwapchainSubImage。minDepth和maxDepth是depthSubImage中的深度值範圍,且必須介於 [0.0,1.0] 之間。這類似於 OpenGLglDepthRange的最小值和最大值,但這裡的要求是 maxDepth ≥ minDepth。nearZ是深度交換鏈中minDepth值的正距離 (以公尺為單位)。應用程式可以使用大於farZ的nearZ,表示深度值已反轉。nearZ可能無限。farZ是深度交換鏈中maxDepth值的正距離 (以公尺為單位)。farZ可能無限。如果nearZ==farZ,執行階段「必須」傳回錯誤XR_ERROR_VALIDATION_FAILURE
提交動作向量圖片和深度圖片以及投影圖層時,請在 XrCompositionLayerProjectionView :: next 鏈結中,為指定圖層中的每個 XrCompositionLayerProjectionView 結構新增 XrFrameSynthesisInfoEXT 結構。
執行階段「必須」解讀 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,或指向結構鏈中下一個結構的有效指標 -
layerFlags「必須」為0或 XrFrameSynthesisInfoFlagBitsEXT 值的有效組合 -
motionVectorSubImage「必須」是有效的 XrSwapchainSubImage 結構 -
depthSubImage「必須」是有效的 XrSwapchainSubImage 結構
注意事項
生成 motionVectorSubImage 和 depthSubImage 的方法有很多種。舉例來說,應用程式可能會在解析度較低的專用動作向量傳遞中算繪這些內容 (建議解析度請參閱 XrFrameSynthesisConfigViewEXT),或在主要檢視畫面傳遞中使用 MRT (多重算繪目標) 算繪。具體做法由應用程式決定。建議為 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 動作向量資料,因此會使用 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 時,在 XrViewConfigurationView :: next 鏈結中傳遞 XrFrameSynthesisConfigViewEXT 結構,以取得建議的動作向量圖片解析度相關資訊。
有效用途 (隱含)
- 必須先啟用
XR_EXT_frame_synthesis擴充功能,才能使用 XrFrameSynthesisConfigViewEXT -
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 年 1 月 31 日 (Jian Zhang)
- 初始擴充功能說明,從 fb_space_warp 轉換而來
- 與貢獻者合作,改善擴充功能介面。