XR_EXT_frame_synthesis
سلسلة الاسم
XR_EXT_frame_synthesis
نوع الإضافة
إضافة مثيل
رقم الإضافة المسجَّل
212
المراجعة
1
حالة التصديق
لم تتم المصادقة
الاعتماديات على الإضافات والإصدارات
المساهمون
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 ".
الاستخدام الصحيح (الضمني)
- يجب تفعيل الإضافة
XR_EXT_frame_synthesisقبل استخدام XrFrameSynthesisInfoEXT - يجب أن يكون
typeXR_TYPE_FRAME_SYNTHESIS_INFO_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى -
layerFlagsيجب أن تكون0أو تركيبة صالحة من قيم XrFrameSynthesisInfoFlagBitsEXT - يجب أن يكون
motionVectorSubImageبنية XrSwapchainSubImage صالحة - يجب أن يكون
depthSubImageبنية XrSwapchainSubImage صالحة
ملاحظة
هناك العديد من الطرق المختلفة لإنشاء 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قبل استخدام XrFrameSynthesisConfigViewEXT - يجب أن يكون
typeXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى
بنى جديدة
تمديد XrCompositionLayerProjectionView :
تمديد XrViewConfigurationView :
ثوابت التعداد الجديدة
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONتمديد XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
المشاكل
سجلّ التعديلات
المراجعة 1، 2022-01-31 (جيان تشانغ)
- الوصف الأوّلي للإضافة، تم تحويله من fb_space_warp
- التعاون مع المساهمين لتحسين واجهات الإضافات