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 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 होनी चाहिए
  • next NULL या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए
  • 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 को कॉल किया जा रहा हो.

सही इस्तेमाल (इंप्लिसिट)

नए स्ट्रक्चर

नए 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

समस्याएं

वर्शन इतिहास

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

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