XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

एक्सटेंशन टाइप

इंस्टेंस एक्सटेंशन

रजिस्टर किया गया एक्सटेंशन नंबर

212

बदलाव

1

पुष्टि की स्थिति

पुष्टि नहीं की गई

एक्सटेंशन और वर्शन की डिपेंडेंसी

OpenXR 1.0

योगदान देने वाले

जियान झांग, 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 " होगी.

मान्य इस्तेमाल (इंप्लिसिट)

ध्यान दें

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 करता है. इससे, मोशन वेक्टर इमेज के सुझाए गए रिज़ॉल्यूशन के बारे में जानकारी मिलती है.

मान्य इस्तेमाल (इंप्लिसिट)

नई संरचनाएं

नए Enum कॉन्सटेंट

  • 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

समस्याएं

वर्शन इतिहास

  • पहला संशोधन, 31-01-2022 (जियान झांग)

    • एक्सटेंशन का शुरुआती ब्यौरा, जिसे fb_space_warp से बदला गया है
    • एक्सटेंशन इंटरफ़ेस को बेहतर बनाने के लिए, योगदान देने वाले लोगों के साथ मिलकर काम करना.