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 may, फ़्रेम सिंथेसिस के लिए खास तौर पर उपलब्ध डेप्थ डेटा का इस्तेमाल कर सकता है. साथ ही, इसका रिज़ॉल्यूशन XrCompositionLayerDepthInfoKHR :: subImage से कम may हो सकता है. 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वैल्यू की मीटर में पॉज़िटिव दूरी है. ऐप्लिकेशन शायदnearZका इस्तेमाल करें, जोfarZसे ज़्यादा है. इससे यह पता चलता है कि डेप्थ वैल्यू को उलट दिया गया है.nearZकी संख्या असीमित हो सकती है.farZ, डेप्थ स्वैपचेन मेंmaxDepthवैल्यू की मीटर में पॉज़िटिव दूरी है.farZकी संख्या असीमित हो सकती है. अगरnearZ==farZहै, तो रनटाइम को गड़बड़ीXR_ERROR_VALIDATION_FAILUREदिखानी चाहिए
प्रोजेक्शन लेयर के साथ मोशन वेक्टर इमेज और डेप्थ इमेज सबमिट करते समय, दी गई लेयर में मौजूद हर XrCompositionLayerProjectionView स्ट्रक्चर के लिए, XrCompositionLayerProjectionView :: next चेन में XrFrameSynthesisInfoEXT स्ट्रक्चर जोड़ें.
रनटाइम के लिए, motionVectorSubImage के आरजीबी चैनलों में मोशन वेक्टर डेटा को समझना ज़रूरी है. इसे motionVectorScale और motionVectorOffset ने इस तरह बदला है: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . 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होनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
layerFlagsकी वैल्यू0या XrFrameSynthesisInfoFlagBitsEXT वैल्यू का मान्य कॉम्बिनेशन होनी चाहिए -
motionVectorSubImageको एक मान्य XrSwapchainSubImage स्ट्रक्चर होना चाहिए -
depthSubImageको एक मान्य XrSwapchainSubImage स्ट्रक्चर होना चाहिए
ध्यान दें
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: मोशन वेक्टर और डेप्थ इमेज की सुझाई गई ऊंचाई.
इस एक्सटेंशन के चालू होने पर, कोई ऐप्लिकेशन XrViewConfigurationView :: next चेन में XrFrameSynthesisConfigViewEXT स्ट्रक्चर को पास कर सकता है. ऐसा तब किया जा सकता है, जब मोशन वेक्टर इमेज के लिए सुझाई गई रिज़ॉल्यूशन की जानकारी पाने के लिए, xrEnumerateViewConfigurationViews को कॉल किया जा रहा हो.
सही इस्तेमाल (इंप्लिसिट)
- XrFrameSynthesisConfigViewEXT का इस्तेमाल करने से पहले,
XR_EXT_frame_synthesisएक्सटेंशन चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए
नए स्ट्रक्चर
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
समस्याएं
वर्शन इतिहास
संशोधन 1, 2022-01-31 (जियान झैंग)
- एक्सटेंशन का शुरुआती ब्यौरा, fb_space_warp से बदला गया
- एक्सटेंशन के इंटरफ़ेस को बेहतर बनाने के लिए, योगदान देने वाले लोगों के साथ मिलकर काम करना.