XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
एक्सटेंशन टाइप
इंस्टेंस एक्सटेंशन
रजिस्टर किया गया एक्सटेंशन नंबर
212
बदलाव
1
पुष्टि की स्थिति
पुष्टि नहीं की गई
एक्सटेंशन और वर्शन की डिपेंडेंसी
योगदान देने वाले
जियान झांग, Meta Platforms
नील बेडेकर, Meta Platforms
ज़ियांग वेई, Meta Platforms
गुओडोंग रोंग, Meta Platforms
ट्रेवर डैश, Meta Platforms
रेमी अर्नॉड, Varjo
पाउलो गोम्स, Samsung Electronics
ब्रायस हचिंग्स, Microsoft
राइली पैवलिक, Collabora
शुआई लियू, 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में मौजूद 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 स्ट्रक्चर के लिए, XrCompositionLayerProjectionView :: next चेन में XrFrameSynthesisInfoEXT स्ट्रक्चर जोड़ें.
रनटाइम को, motionVectorSubImage के आरजीबी चैनलों में मौजूद मोशन वेक्टर डेटा को इस तरह से समझना चाहिए: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . इस डेटा में, motionVectorScale और motionVectorOffset ने बदलाव किया है. motionVectorSubImage a , motionVectorScale w, और motionVectorOffset w कॉम्पोनेंट को अनदेखा कर दिया जाता है.
मोशन वेक्टर, पिछले फ़्रेम के XrFrameEndInfo ::displayTime से लेकर मौजूदा फ़्रेम के XrFrameEndInfo ::displayTime तक, किसी पिक्सल की गतिविधि को दिखाता है. रेंडरिंग के दौरान हो सकता है कि इस जानकारी का इस्तेमाल करके, रेंडर किए गए फ़्रेम को आने वाले समय के फ़्रेम में बदला जाए.
मोशन वेक्टर को नॉर्मलाइज़्ड डिवाइस कोऑर्डिनेट (एनडीसी) स्पेस से लिया गया होना चाहिए. इस संदर्भ में, Vulkan-स्टाइल के कन्वेंशन का इस्तेमाल किया जाता है: एनडीसी रेंज को [-1, -1, 0] से [1, 1, 1] के तौर पर तय किया जाता है. यह OpenGL की एनडीसी रेंज से अलग होती है. हालांकि, मोशन वेक्टर इस रेंज तक सीमित नहीं होता. इसकी वैल्यू, पिक्सल के मूवमेंट पर निर्भर करती हैं. साथ ही, ये एनडीसी स्पेस की सीमाओं से आगे बढ़ सकती हैं. उदाहरण के लिए, मान लें कि पिछले फ़्रेम में किसी पिक्सल का एनडीसी PrevNDC है और मौजूदा फ़्रेम में CurrNDC है. साथ ही, कोई स्केल या ऑफ़सेट नहीं है. ऐसे में, मोशन वेक्टर की वैल्यू " (CurrNDC - PrevNDC) xyz " होगी.
मान्य इस्तेमाल (इंप्लिसिट)
- XrFrameSynthesisInfoEXT का इस्तेमाल करने से पहले,
XR_EXT_frame_synthesisएक्सटेंशन को चालू करना ज़रूरी है -
typeज़रूरी है किXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextज़रूरी है किNULLहो या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर हो -
layerFlagsmust be0or a valid combination of XrFrameSynthesisInfoFlagBitsEXT values -
motionVectorSubImagemust be a valid XrSwapchainSubImage structure -
depthSubImagemust be a valid XrSwapchainSubImage structure
ध्यान दें
motionVectorSubImage और depthSubImage जनरेट करने के कई तरीके हैं . उदाहरण के लिए, ऐप्लिकेशन उन्हें मोशन वेक्टर पास (सुझाए गए रिज़ॉल्यूशन के लिए, XrFrameSynthesisConfigViewEXT देखें) के लिए कम रिज़ॉल्यूशन में रेंडर कर सकता है. इसके अलावा, उन्हें एक से ज़्यादा रेंडर टारगेट (एमआरटी) के साथ मुख्य व्यू पास में रेंडर कर सकता है. ऐप्लिकेशन के पास यह तय करने का विकल्प होता है कि उसे कौनसा तरीका इस्तेमाल करना है. 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, रनटाइम को यह जानकारी देता है कि ऐप्लिकेशन को हर फ़्रेम को रेंडर करने के लिए ज़्यादा समय चाहिए. हालांकि, इससे रनटाइम ज़्यादा फ़्रेम सिंथेसाइज़ करेगा. यह उन ऐप्लिकेशन के लिए फ़ायदेमंद हो सकता है जो सीपीयू और जीपीयू के इस्तेमाल को कम करना चाहते हैं. जैसे, बैटरी लाइफ़ बढ़ाने के लिए या हर फ़्रेम के कंप्यूट बजट को बढ़ाने के लिए. रनटाइम, इस फ़्लैग की वैल्यू के बावजूद, किसी भी इंटरवल पर फ़्रेम का अनुरोध कर सकता है.
डिफ़ॉल्ट रूप से, रनटाइम को 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 कॉम्पोनेंट को अनदेखा कर दिया जाता है. मोशन वेक्टर के 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 स्ट्रक्चर पास can करता है. इससे, मोशन वेक्टर इमेज के सुझाए गए रिज़ॉल्यूशन के बारे में जानकारी मिलती है.
मान्य इस्तेमाल (इंप्लिसिट)
- XrFrameSynthesisConfigViewEXT का इस्तेमाल करने से पहले,
XR_EXT_frame_synthesisएक्सटेंशन को चालू करना ज़रूरी है -
typeज़रूरी है किXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextज़रूरी है किNULLहो या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर हो
नई संरचनाएं
XrCompositionLayerProjectionView को बढ़ाना :
XrViewConfigurationView को बढ़ाना :
नए Enum कॉन्सटेंट
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONXrStructureType को बढ़ाना :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
समस्याएं
वर्शन इतिहास
पहला संशोधन, 31-01-2022 (जियान झांग)
- एक्सटेंशन का शुरुआती ब्यौरा, जिसे fb_space_warp से बदला गया है
- एक्सटेंशन इंटरफ़ेस को बेहतर बनाने के लिए, योगदान देने वाले लोगों के साथ मिलकर काम करना.