XR_EXT_frame_synthesis

سلسلة الاسم

XR_EXT_frame_synthesis

نوع الإضافة

إضافة مثيل

رقم الإضافة المسجَّل

212

المراجعة

1

حالة التصديق

لم تتم المصادقة

الاعتماديات على الإضافات والإصدارات

OpenXR 1.0

المساهمون

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 . راجِع XrFrameSynthesisConfigViewEXT لمعرفة الدقة المقترَحة لـ depthSubImage .

إرسال صور متّجهة للحركة وصور عمق

يتم تعريف بنية 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 بالكامل من وضعية مساحة تطبيق إلى وضعية أخرى بين اللقطات، ما يؤثّر في طريقة العرض بأكثر من الحركة التي يتم تتبُّعها بين اللقطات. يجب أن تكون قيمة appSpaceDeltaPose هي الهوية عندما لا يكون هناك تحويل XrCompositionLayerProjection :: space في التطبيق. يجب أن تكون قيمة XrPosef :: position في appSpaceDeltaPose نسبية إلى XrCompositionLayerProjection :: space في التطبيق الحالي .
  • تحدّد depthSubImage صورة العمق XrSwapchainSubImage التي سيتم استخدامها لتجميع الإطارات.
  • minDepth وmaxDepth هما نطاق قيم العمق في depthSubImage، ويجب أن تكون قيمة ضمن النطاق [0.0,1.0] . وهذا يشبه الحدّين الأدنى والأقصى لقيم glDepthRange في OpenGL، ولكن مع اشتراط أن تكون maxDepth ≥ minDepth .
  • nearZ هي المسافة الموجبة بالمتر للقيمة minDepth في سلسلة تبديل العمق. يمكن للتطبيقات استخدام nearZ أكبر من farZ للإشارة إلى أنّ قيم العمق معكوسة. قد يكون عدد nearZ غير محدود.
  • farZ هي المسافة الموجبة بالمتر للقيمة maxDepth في سلسلة تبديل العمق. قد يكون عدد farZ غير محدود. يجب أن يعرض وقت التشغيل الخطأ XR_ERROR_VALIDATION_FAILURE إذا كان nearZ == farZ

عند إرسال صور متجهة للحركة وصور عمق مع طبقات العرض، أضِف بنية XrFrameSynthesisInfoEXT إلى سلسلة XrCompositionLayerProjectionView :: next، لكل بنية XrCompositionLayerProjectionView في الطبقة المحدّدة.

يجب أن يفسّر وقت التشغيل بيانات متّجه الحركة في قنوات RGB الخاصة بالعنصر motionVectorSubImage، والتي تم تعديلها بواسطة motionVectorScale وmotionVectorOffset على النحو التالي: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . يتم تجاهل مكوّنات motionVectorSubImage a وmotionVectorScale w وmotionVectorOffset w.

يمثّل متجه الحركة حركة البكسل منذ XrFrameEndInfo ::displayTime للإطار السابق حتى XrFrameEndInfo ::displayTime للإطار الحالي. قد يستخدم وقت التشغيل هذه المعلومات لتقدير الإطار المعروض في إطار مستقبلي.

يجب أن يكون متجه الحركة مشتقًا من مساحة إحداثيات الجهاز العادية (NDC)، والتي تستخدم في هذا السياق اصطلاحات Vulkan: يتم تحديد نطاق إحداثيات الجهاز العادية على أنّه من [-1, -1, 0] إلى [1, 1, 1]، وهو يختلف عن نطاق إحداثيات الجهاز العادية في OpenGL. ومع ذلك، لا يقتصر متجه الحركة نفسه على هذا النطاق، بل تعتمد قيمه على حركة البكسل وقد تتجاوز حدود مساحة NDC. على سبيل المثال، إذا كان NDC لوحدة البكسل في الإطار السابق هو PrevNDC، وCurrNDC في الإطار الحالي، ولم يكن هناك مقياس أو إزاحة، تكون قيمة متجه الحركة هي " (CurrNDC - PrevNDC) xyz ".

الاستخدام الصحيح (الضمني)

ملاحظة

هناك العديد من الطرق المختلفة لإنشاء motionVectorSubImage وdepthSubImage . على سبيل المثال، قد يعرض التطبيق هذه البيانات بدقة أقل في مسار مخصّص لمتجهات الحركة (راجِع XrFrameSynthesisConfigViewEXT لمعرفة الدقة المقترَحة)، أو قد يعرضها في مسار العرض الرئيسي باستخدام تقنية MRT (أهداف العرض المتعدّدة). ويعود إلى التطبيق تحديد النهج المحدّد. يُنصح باستخدام تنسيقات الفاصلة العائمة ذات 16 بت الموقّعة لكل قناة بكسل في motionVectorSubImage .

علامات تركيب الإطارات

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 إلى أنّه يتم استخدام بيانات متجهات الحركة الثنائية الأبعاد.
  • تقدّم السمة XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT تلميحًا لوقت التشغيل بأنّ التطبيق يفضّل وقتًا إضافيًا لعرض كل إطار، مع مراعاة أنّ وقت التشغيل سيصنع المزيد من اللقطات. قد يكون ذلك مفيدًا للتطبيقات التي تفضّل الحفاظ على معدّل استخدام وحدة المعالجة المركزية ووحدة معالجة الرسومات (على سبيل المثال، لإطالة عمر البطارية) أو لزيادة ميزانية الحوسبة لكل لقطة. قد يطلب وقت التشغيل إطارات بأي فاصل زمني، بغض النظر عن قيمة هذه العلامة.

بشكلٍ تلقائي، تتوقّع بيئة التشغيل بيانات متّجهات الحركة الثلاثية الأبعاد، لذا يتم استخدام motionVectorSubImage rgb وmotionVectorScale xyz وmotionVectorOffset xyz، كما هو موضّح في XrFrameSynthesisInfoEXT .

عند تفعيل XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT على XrFrameSynthesisInfoEXT layerFlags ، يفسّر وقت التشغيل صورة متّجه الحركة المُرسَلة كبيانات متّجه حركة ثنائية الأبعاد، ما يمثّل حركة وحدات البكسل الثنائية الأبعاد من الإطار السابق إلى الإطار الحالي. يتم تفسير قيم وحدات البكسل على النحو التالي لبيانات متّجه الحركة الثنائي الأبعاد: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . يتم تجاهل المكوّنات motionVectorSubImage ba وmotionVectorScale zw وmotionVectorOffset zw. قد يؤدي استخدام بيانات متجهات الحركة الثنائية الأبعاد بدلاً من الثلاثية الأبعاد إلى خفض جودة اللقطات المركّبة.

يتم تعريف بنية XrFrameSynthesisConfigViewEXT على النحو التالي:

typedef struct XrFrameSynthesisConfigViewEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           recommendedMotionVectorImageRectWidth;
    uint32_t           recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;

أوصاف الأعضاء

  • type هو XrStructureType لهذه البنية.
  • next هي NULL أو مؤشر إلى البنية التالية في سلسلة البنية.
  • recommendedMotionVectorImageRectWidth : عرض صورة متّجه الحركة وصورة العمق المقترَحَين
  • recommendedMotionVectorImageRectHeight : الارتفاع المقترَح لمتجه الحركة وصورة العمق

عند تفعيل هذه الإضافة، يمكن لأحد التطبيقات تمرير بنية XrFrameSynthesisConfigViewEXT في سلسلة XrViewConfigurationView :: next عند استدعاء xrEnumerateViewConfigurationViews للحصول على معلومات حول دقة صورة متّجه الحركة المقترَحة.

الاستخدام الصحيح (الضمني)

بنى جديدة

ثوابت التعداد الجديدة

  • 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
    • التعاون مع المساهمين لتحسين واجهات الإضافات