XR_EXT_spatial_container_self_rendering
Name String
XR_EXT_spatial_container_self_rendering
نوع الإضافة
إضافة مثيل
رقم الإضافة المسجَّل
814
المراجعة
1
حالة التصديق
لم تتم المصادقة عليها
الاعتماد على الإضافات والإصدارات
XR_EXT_spatial_container
تاريخ آخر تعديل
2026-08-06
حالة الملكية الفكرية
ما مِن مطالبات معروفة بشأن الملكية الفكرية.
المساهمون
"لاكلان فورد"، Google
"أندرياس لوف سيلفيك"، Meta Platforms
"آدم غوسيتيس"، Meta Platforms
"بيورن سوينسون"، LÖVR
"كاس إيفريت"، Meta Platforms
"كريستيان كروز"، Meta Platforms
"ديني رونغرين"، Varjo Technologies
"فريديا هويا كواديو"، Godot Engine
"جاكوب بورنيكرانتز"، NVIDIA
"جاريد فايندر"، Google
"جوناثان رايت"، Meta Platforms
"جيان تشانغ"، ByteDance
"كورتيس إيفلي"، Qualcomm
"ماوريسيو نارفايز"، Meta Platforms
"نيك كلينغينسميث"، Qualcomm
"نيكيتا لوتسينكو"، Meta Platforms
"برافين بابو جيه دي"، ByteDance
"رايلي بافليك"، Collabora
"سالار خان"، Google
"شواي ليو"، ByteDance
"والتر لوه"، Meta Platforms
"يين لي"، Microsoft
نظرة عامة
تحدّد هذه الإضافة "العرض الذاتي" للحاويات المكانية. يتم إنشاء جميع وحدات بكسل الحاوية المكانية التي يتم عرضها ذاتيًا بواسطة تطبيق وإرسالها إلى وقت التشغيل باستخدام سلاسل التبديل وطبقات التركيب العادية في OpenXR. بما أنّ الحاويات المكانية لا تشغل دائمًا جميع وحدات البكسل على الشاشة، فإنّ بيئة التشغيل تُعلم التطبيقات بدرجة الدقة المقترَحة وإعدادات العرض لكل حاوية مكانية لتمكين التطبيقات من العرض بكفاءة أكبر.
تهدف هذه الإضافة مع XR_EXT_spatial_container إلى تقديم مجموعة شاملة من إمكانات عرض طبقة التركيب الأساسية التقليدية في OpenXR 1.x. يجب على بيئات تشغيل OpenXR 1.x التي تتيح العرض الرسومي وهذه الإضافة ضبط XrSystemSpatialContainerPropertiesEXT :: supportsImmersive على "صحيح" للإشارة إلى أنّها تتيح استخدام الحاويات المكانية الغامرة.
دورة حياة عرض الحاوية المكانية
لاستخدام العرض الذاتي لحاوية مكانية، يضبط التطبيق XrSpatialContainerCreateInfoEXT :: graphicsPresentation على XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT عند استدعاء xrCreateSpatialContainerEXT . بعد ذلك، يمكن لهذا التطبيق إدارة ما إذا كانت الحاوية المكانية تعرض المحتوى بشكل نشط من خلال استدعاء الدالتَين xrBeginSpatialContainerRenderingEXT وxrEndSpatialContainerRenderingEXT. تحلّ هاتان الدالتان محلّ xrBeginSession وxrEndSession . وهي ليست عمليات لكل إطار، مثل xrBeginFrame وxrEndFrame .
في كل إطار، يمر التطبيق بالخطوات التالية:
- استدعِ xrWaitFrame وxrBeginFrame . لا تحتوي هذه الدوال على بُنى خاصة بالحاويات وتعمل كما هي في المواصفات الأساسية.
- استرداد أوضاع العرض ومَعلمات العرض وتوصيات العرض لجميع الحاويات المكانية التي يتم عرضها بشكل نشط باستخدام xrLocateSpatialContainerViewsEXT . بالنسبة إلى كل حاوية مكانية، يبلّغ وقت التشغيل عمّا إذا كان يجب عرض طبقات التركيب والطريقة المقترَحة لعرض الطبقات من خلال ملء XrSpatialContainerViewStateEXT .
- عرض وحدات البكسل في طبقات التركيب بشكل طبيعي لا تتضمّن هذه العمليات أي هياكل خاصة بالحاويات.
- أرسِل طبقات التركيب لجميع الحاويات المكانية التي يتم عرضها بشكل نشط من خلال استدعاء xrEndFrame وربط XrSpatialContainerLayerFrameEndInfoEXT .
يؤدي تدمير مؤشر XrSpatialContainerEXT إلى إزالته ضمنيًا من مجموعة العرض النشطة. يمكن للتطبيق إتلاف حاوية مكانية حتى إذا أجرى طلبًا ناجحًا إلى xrBeginSpatialContainerRenderingEXT غير مرتبط بطلب مقابل إلى xrEndSpatialContainerRenderingEXT . يجب أن يتصرف وقت التشغيل كما لو تم استدعاء xrEndSpatialContainerRenderingEXT ضمنيًا إذا لزم الأمر في وقت مبكر من تنفيذ xrDestroySpatialContainerEXT إذا تم عرضه بنجاح.
عندما يتلقّى تطبيق حدث XrEventDataSpatialContainerClosedEXT لحاوية في مجموعة العرض النشطة، يجب أن يستدعي هذا التطبيق xrEndSpatialContainerRenderingEXT ويتلف مؤشر XrSpatialContainerEXT.
تضيف الدالة xrBeginSpatialContainerRenderingEXT الحاوية المكانية إلى مجموعة العرض النشطة لكل جلسة، ما يتيح للتطبيق إرسال طبقات التركيب للحاوية المكانية إلى xrEndFrame .
XrResult xrBeginSpatialContainerRenderingEXT(
XrSession session,
const XrSpatialContainerBeginInfoEXT* beginInfo);
أوصاف المَعلمات
-
sessionهي XrSession . -
beginInfoهو مؤشر إلى بنية XrSpatialContainerBeginInfoEXT.
تستدعي التطبيقات عادةً هذه الدالة استجابةً لحدث visible-changed مع ضبط XrEventDataSpatialContainerVisibleChangedEXT :: visible على القيمة true.
إذا لم يتم إنشاء الحاوية المكانية باستخدام XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT عند استدعاء xrCreateSpatialContainerEXT، يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT .
إذا كانت الحاوية المكانية مضمّنة في مجموعة العرض النشطة، يجب أن يعرض وقت التشغيل القيمة XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT .
إذا تم استدعاء xrBeginSpatialContainerRenderingEXT في وقت لم يتمكّن فيه التطبيق من استدعاء xrWaitFrame (أي داخل نافذة xrBeginFrame وxrEndFrame)، يجب أن يعرض وقت التشغيل XR_ERROR_CALL_ORDER_INVALID .
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استدعاء xrBeginSpatialContainerRenderingEXT - يجب أن يكون
sessionاسم معرِّف XrSession صالحًا - يجب أن يكون
beginInfoمؤشرًا إلى بنية XrSpatialContainerBeginInfoEXT صالحة
أمان Thread
- يجب مزامنة الوصول إلى المَعلمة
sessionمن خلال أي طلب آخر من xrBeginSpatialContainerRenderingEXT أو xrEndSpatialContainerRenderingEXT أو xrEndFrame خارجيًا
رموز الإرجاع
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_CALL_ORDER_INVALIDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXTXR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXTXR_ERROR_VALIDATION_FAILUREXR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED
تُستخدَم بنية XrSpatialContainerBeginInfoEXT لتحديد مَعلمات بدء عرض حاوية مكانية.
typedef struct XrSpatialContainerBeginInfoEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
XrViewConfigurationType primaryViewConfigurationType;
} XrSpatialContainerBeginInfoEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
spatialContainerهو XrSpatialContainerEXT لبدء العرض. -
primaryViewConfigurationTypeهو XrViewConfigurationType الأساسي الذي سيتم استخدامه للحاوية المكانية.
primaryViewConfigurationType هي إعدادات العرض التي ينوي التطبيق استخدامها عند العرض. قد يقلّل وقت التشغيل من إعدادات العرض إلى نوع يتضمّن عددًا أقل من طرق العرض لأغراض التحسين (على سبيل المثال، تكون الحاوية بعيدة جدًا وصغيرة بحيث لا يمكن إدراك العرض المجسّم). تعرض بيئة التشغيل تفاصيل حول إعدادات العرض المنخفضة من الطلبات إلى xrLocateSpatialContainerViewsEXT .
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerBeginInfoEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن يكون
spatialContainerاسمًا معرِّفًا صالحًا لـ XrSpatialContainerEXT -
primaryViewConfigurationTypeيجب أن تكون قيمة XrViewConfigurationType صالحة
تزيل الدالة xrEndSpatialContainerRenderingEXT الحاوية المكانية من مجموعة العرض النشطة.
XrResult xrEndSpatialContainerRenderingEXT(
XrSession session,
const XrSpatialContainerEndInfoEXT* endInfo);
أوصاف المَعلمات
-
sessionهي XrSession . -
endInfoهو مؤشر إلى بنية XrSpatialContainerEndInfoEXT.
تستدعي التطبيقات عادةً هذه الدالة استجابةً لحدث visible-changed مع ضبط XrEventDataSpatialContainerVisibleChangedEXT :: visible على القيمة false.
إذا لم تكن الحاوية المكانية ضمن مجموعة العرض النشطة، يجب أن تعرض بيئة التشغيل القيمة XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT .
إذا تم استدعاء xrEndSpatialContainerRenderingEXT في وقت لم يتمكّن فيه التطبيق من استدعاء xrWaitFrame (أي خلال الفترة بين استدعاءات xrBeginFrame وxrEndFrame)، يجب أن يعرض وقت التشغيل XR_ERROR_CALL_ORDER_INVALID.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استدعاء xrEndSpatialContainerRenderingEXT - يجب أن يكون
sessionاسم معرِّف XrSession صالحًا -
endInfoيجب أن يكون مؤشرًا إلى بنية XrSpatialContainerEndInfoEXT صالحة
أمان Thread
- يجب مزامنة الوصول إلى المَعلمة
sessionخارجيًا من خلال أي طلب آخر من النوع xrBeginSpatialContainerRenderingEXT أو xrEndSpatialContainerRenderingEXT أو xrEndFrame
رموز الإرجاع
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_CALL_ORDER_INVALIDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXTXR_ERROR_VALIDATION_FAILURE
تُستخدَم بنية XrSpatialContainerEndInfoEXT لتحديد مَعلمات إنهاء عرض حاوية مكانية.
typedef struct XrSpatialContainerEndInfoEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrSpatialContainerEndInfoEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
spatialContainerهو XrSpatialContainerEXT لإنهاء العرض.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerEndInfoEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن يكون
spatialContainerاسمًا معرِّفًا صالحًا لـ XrSpatialContainerEXT
تحديد موضع طرق العرض من خلال xrLocateSpatialContainerViewsEXT
تحدّد الدالة xrLocateSpatialContainerViewsEXT مواقع العروض لمجموعة من الحاويات المكانية.
XrResult xrLocateSpatialContainerViewsEXT(
XrSession session,
const XrSpatialContainerViewsLocateInfoEXT* locateInfo,
uint32_t viewStateCount,
XrSpatialContainerViewStateEXT* viewStates,
uint32_t viewCount,
XrView* views);
أوصاف المَعلمات
-
sessionهي XrSession . -
locateInfoهو مؤشر إلى بنية XrSpatialContainerViewsLocateInfoEXT. -
viewStateCountهو عدد عناصر الصفيفةviewStates. -
viewStatesهو مؤشر إلى مصفوفة من هياكل XrSpatialContainerViewStateEXT التي سيتم ملؤها من خلال وقت التشغيل. -
viewCountهو عدد عناصر الصفيفةviews. -
viewsهو مؤشر إلى مصفوفة من بُنى XrView.
تحلّ هذه الدالة محلّ xrLocateViews، ما يتيح للتطبيق طلب معلومات عن طرق العرض لعدة حاويات مكانية في الوقت نفسه.
يتم عرض المشاهدات لجميع الحاويات المكانية في مصفوفة views واحدة. يتم ترتيب طرق العرض استنادًا إلى فهرس الحاوية المكانية في مصفوفة XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos، ثم فهرس العرض لتلك الحاوية.
على سبيل المثال، إذا كان التطبيق يوفّر ثلاث حاويات مكانية في XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos :
- الفهرس 0:
XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO(مشاهدة واحدة) - الفهرس 1:
XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO(مشاهدتان) - الفهرس 2:
XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO_WITH_FOVEATED_INSET(4 مشاهدات)
بعد ذلك، يجب أن يملأ وقت التشغيل مصفوفة views بـ 7 طرق عرض:
views[0] هو العرض للحاوية 0.-
views[1] هي طريقة عرض العين اليسرى للحاوية 1. -
views[2] هو عرض العين اليمنى للحاوية 1. -
views[3] هو عرض العين اليسرى للحاوية 2. -
views[4] هو عرض العين اليمنى للحاوية 2. -
views[5] هو عرض العين اليسرى المضمّن للحاوية 2. -
views[6] هي طريقة العرض المضمّنة للعين اليمنى للحاوية 2.
إذا لم تكن قيمة viewCount مساوية لمجموع أعداد المشاهدات لكل نوع من أنواع إعدادات العرض المطلوبة في الحاوية المكانية، يجب أن يعرض وقت التشغيل القيمة XR_ERROR_VALIDATION_FAILURE .
قد يقلّل وقت التشغيل من إعدادات العرض إلى نوع يتضمّن عددًا أقل من طرق العرض لأغراض التحسين (على سبيل المثال، تكون الحاوية بعيدة جدًا وصغيرة بحيث لا يمكن إدراك العرض المجسّم). إذا أدى وقت التشغيل إلى تقليل عدد طرق العرض في الإعدادات، يجب أن يعرض وقت التشغيل العدد الأصلي لطرق العرض في تلك الحاوية، مع ملء طرق العرض الإضافية بنُسخ مكرّرة من طرق العرض التي تم تقليلها. على سبيل المثال، إذا تم تحويل XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO إلى XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO، سيحتوي كل من المؤشر 0 والمؤشر 1 على العرض الأحادي الواحد. وبالتالي، فإنّ إجمالي عدد طرق العرض التي تم عرضها في مصفوفة views لا يعتمد على ما إذا كان وقت التشغيل قد قرّر إيقاف أي إعدادات لطرق العرض أم لا.
يجب أن تكيّف بيئة التشغيل كل XrView :: fov يتم عرضه بحيث يكون الهرم الناقص صغيرًا قدر الإمكان مع استمرار احتوائه على الحدود الكاملة للحاوية المكانية المقابلة. قد تعرض بيئات التشغيل مجالات رؤية غير متماثلة، على سبيل المثال إذا كانت الحاوية المكانية بزاوية مائلة بالنسبة إلى مجال رؤية المستخدم، أو إذا كانت محجوبة جزئيًا بواسطة عنصر آخر. قد تضع بيئات التشغيل سطح العرض المستهدَف للحاوية المكانية في أي موضع. بسبب طبيعة عرض التطبيقات المتعددة، حيث يتم فصل الحاويات المكانية عن المستخدم، قد يعرض وقت التشغيل قيم XrView غير مناسبة لعرض وحدات البكسل، على سبيل المثال، إذا لم تكن الحاوية المكانية مرئية على الشاشة، لن تكون هناك قيم صالحة لضبط XrView :: fov. في هذه الحالات، يجب أن تضبط بيئات التشغيل XrSpatialContainerViewStateEXT :: shouldSubmitLayers على "خطأ".
تعرض بيئة التشغيل معلومات إضافية عن حالة العرض لكل حاوية مكانية في مصفوفة viewStates. إذا لم تكن قيمة viewStateCount مساوية لـ XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfoCount، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE .
بعد أن تضع بيئة التشغيل حدث XrEventDataSpatialContainerClosedEXT في قائمة الانتظار لحاوية مكانية، يجب أن تعرض هذه الدالة XR_FALSE في XrSpatialContainerViewStateEXT :: shouldSubmitLayers و0 في XrSpatialContainerViewStateEXT :: viewStateFlags للحاوية المكانية المقابلة.
بالنسبة إلى الحاويات المكانية التي تتغيّر مواقعها الجغرافية بشكل نشط في العالم الواقعي، يجب أن يأخذ وقت التشغيل حركة الحاوية في الاعتبار عند ملء views لتقليل عيوب إعادة العرض.
إذا تم استدعاء xrLocateSpatialContainerViewsEXT لحاوية مكانية واحدة أو أكثر غير مضمّنة حاليًا في مجموعة العرض النشطة، يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT .
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استدعاء xrLocateSpatialContainerViewsEXT - يجب أن يكون
sessionاسم معرِّف XrSession صالحًا - يجب أن يكون
locateInfoمؤشرًا إلى بنية XrSpatialContainerViewsLocateInfoEXT صالحة -
viewStatesيجب أن يكون مؤشرًا إلى مصفوفة من هياكلviewStateCountXrSpatialContainerViewStateEXT - يجب أن يكون
viewsمؤشرًا إلى مصفوفة من بُنىviewCountXrView - يجب أن تكون المَعلمة
viewStateCountأكبر من0 - يجب أن تكون المَعلمة
viewCountأكبر من0
رموز الإرجاع
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILUREXR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED
تحتوي البنية XrSpatialContainerViewsLocateInfoEXT على مَعلمات لتحديد موضع العروض في مجموعة من الحاويات المكانية.
typedef struct XrSpatialContainerViewsLocateInfoEXT {
XrStructureType type;
const void* next;
XrTime displayTime;
uint32_t viewLocateInfoCount;
const XrSpatialContainerViewLocateInfoEXT* viewLocateInfos;
} XrSpatialContainerViewsLocateInfoEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
displayTimeهيXrTimeالتي يتم فيها تحديد مكان طرق العرض. -
viewLocateInfoCountهو عدد الإدخالات في مصفوفةviewLocateInfos. -
viewLocateInfosهو مؤشر إلى مصفوفة من هياكل XrSpatialContainerViewLocateInfoEXT.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerViewsLocateInfoEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن يكون
viewLocateInfosمؤشرًا إلى مصفوفة من بُنىviewLocateInfoCountصالحة من النوع XrSpatialContainerViewLocateInfoEXT - يجب أن تكون المَعلمة
viewLocateInfoCountأكبر من0
تحتوي بنية XrSpatialContainerViewLocateInfoEXT على مَعلمات لحاوية مكانية فردية لتحديد أماكن العرض.
typedef struct XrSpatialContainerViewLocateInfoEXT {
XrStructureType type;
const void* next;
XrViewConfigurationType viewConfigurationType;
XrSpace space;
XrSpatialContainerEXT spatialContainer;
} XrSpatialContainerViewLocateInfoEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
viewConfigurationTypeهو XrViewConfigurationType يُستخدَم للحاوية المكانية. -
spaceهو XrSpace الذي تقع فيه طرق عرض الحاوية المكانية. -
spatialContainerهو الاسم المعرِّف لـ XrSpatialContainerEXT.
يمكن للتطبيق تقديم أي XrSpace صالح في space، ولكن يُنصح بتقديم مساحة الحاوية المكانية لـ XrSpatialContainerEXT المقابل المحدّد ضمن بنية XrSpatialContainerViewLocateInfoEXT.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerViewLocateInfoEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية -
viewConfigurationTypeيجب أن تكون قيمة XrViewConfigurationType صالحة - يجب أن يكون
spaceاسم معرِّف صالحًا على XrSpace - يجب أن يكون
spatialContainerاسمًا معرِّفًا صالحًا لـ XrSpatialContainerEXT - يجب أن يكون كل من
spaceوspatialContainerقد تم إنشاؤهما أو تخصيصهما أو استردادهما من XrSession نفسه
تتم تعبئة بنية XrSpatialContainerViewStateEXT من خلال طلبات إلى xrLocateSpatialContainerViewsEXT مع معلومات حول مدى ملاءمة العرض لكل حاوية مكانية.
typedef struct XrSpatialContainerViewStateEXT {
XrStructureType type;
void* next;
XrViewStateFlags viewStateFlags;
XrViewConfigurationType viewConfigurationType;
XrBool32 shouldSubmitLayers;
XrExtent2Di recommendedImageExtent;
} XrSpatialContainerViewStateEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
viewStateFlagsهو قناع بت من XrViewStateFlags . هذه العلامات لها الغرض نفسه مثل viewStateFlags في بنية XrViewState الأساسية. -
viewConfigurationTypeهو XrViewConfigurationType يشير إلى نوع إعدادات العرض التي تستخدمها بيئة التشغيل للحاوية المكانية، والتي قد تتراجع بيئات التشغيل إلى إعدادات عرض بعدد أقل من العروض مقارنةً بالعدد المطلوب. -
shouldSubmitLayersهوXrBool32يعرضه وقت التشغيل. إذا كانت القيمةXR_FALSE، يجب على التطبيق تجنُّب إرسال التركيب لهذه الحاوية المكانية لأنّها غير مرئية حاليًا أو في حالة لا تتطلّب العرض. -
recommendedImageExtentهي بنية XrExtent2Di تمثّل درجة الدقة المقترَحة للحاوية المكانية.
كما هو الحال مع موقع العرض الأساسي في OpenXR، يجب أن يتحقّق التطبيق من XrSpatialContainerViewStateEXT :: viewStateFlags للتأكّد من أنّ الموضع والاتجاه صالحان ويتم تتبُّعهما قبل استخدام بيانات العرض للعرض.
يجب أن يتحقّق التطبيق من shouldSubmitLayers وviewConfigurationType لتجنُّب عرض أكثر مما يوصي به وقت التشغيل. عندما تكون قيمة shouldSubmitLayers هي "خطأ"، يغيّر التطبيق سلوك العرض على النحو التالي:
- يجب ألّا يقرأ التطبيق السمة XrView ::
fovالمقابلة. - يجب ألّا يقرأ التطبيق
recommendedImageExtent. - يجب أن يتجنّب التطبيق العرض على سلاسل التبديل وإرسال طبقات التركيب للحاوية المكانية المقابلة.
- يجب أن يضبط التطبيق XrSpatialContainerLayerEXT ::
retainPreviousSubmissionعلى "صحيح". إذا اختار التطبيق إرسال الطبقات على أي حال، يعود الأمر إلى وقت التشغيل لتحديد ما يريد فعله بالطبقات (على سبيل المثال، قد يختار وقت التشغيل تجاهلها).
recommendedImageExtent مخصّصة للطبقات التي سيتم تعديلها استنادًا إلى موضع الحاوية أو طريقة عرض المستخدم. عند تعديل الطبقات بمحتوى يعتمد على موضع الحاوية المكانية أو طريقة عرض المستخدم (مثل المحتوى العادي الثلاثي الأبعاد)، يجب أن يعرض التطبيق إطار العرض الأصغر هذا بدلاً من حجم العرض التلقائي المقترَح. عند تعديل الطبقات بمحتوى لا يعتمد على موضع الحاوية المكانية أو عرض المستخدم (مثل طبقات الأشكال الرباعية الثابتة)، يمكن للتطبيق تجاهل هذه القيم بأمان. بالنسبة إلى الطبقات التي تعتمد على العرض، يُعدّ recommendedImageExtent اقتراحًا للتطبيق من وقت التشغيل يهدف إلى تقليل التعرّج وتحسين أداء العرض. ويمكن للتطبيق إرسال الوسائط بدقة كاملة إذا أراد ذلك.
يجب أن يكون XrExtent2Di :: width وXrExtent2Di :: height من recommendedImageExtent دائمًا عددًا صحيحًا موجبًا أقل من أو يساوي XrViewConfigurationView :: recommendedImageRectWidth وXrViewConfigurationView :: recommendedImageRectHeight من XrViewConfigurationView لإعدادات العرض الأساسية للحاوية المكانية. يجب ألّا يعيد التطبيق إنشاء سلسلة تبديل لمجرد تغيير recommendedImageExtent، لأنّه تلميح ديناميكي للتطبيق يحدّد XrSwapchainSubImage :: imageRect لاستخدامه في XrSwapchainSubImage لأي طبقات تركيب بدقة كاملة يرسلها، ويمكن أن يتغيّر كل إطار.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerViewStateEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_VIEW_STATE_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية -
viewStateFlagsيجب أن تكون مجموعة صالحة من قيم XrViewStateFlagBits -
viewStateFlagsيجب ألا يكون0 -
viewConfigurationTypeيجب أن تكون قيمة XrViewConfigurationType صالحة
عرض مساحة المرجع
تبقى مساحة مرجع العرض بدون تغيير كما هي في OpenXR core. كما هو الحال في الإصدار الأساسي، لا يُقصد استخدامه في العرض.
إرسال الطبقات من خلال xrEndFrame
لعرض الحاويات المكانية، يجب أن يوفّر التطبيق قائمة بالطبقات المرتبطة بحاوياتها المكانية إلى xrEndFrame . يتم تنفيذ ذلك من خلال بنية XrSpatialContainerLayerFrameEndInfoEXT.
typedef struct XrSpatialContainerLayerFrameEndInfoEXT {
XrStructureType type;
const void* next;
uint32_t containerLayerCount;
const XrSpatialContainerLayerEXT* containerLayers;
} XrSpatialContainerLayerFrameEndInfoEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
containerLayerCountهو عدد العناصر في مصفوفةcontainerLayers. -
containerLayersهو مؤشر إلى مصفوفة من بُنى XrSpatialContainerLayerEXT.
تحتوي مصفوفة containerLayers على XrSpatialContainerLayerEXT لكل حاوية مكانية في مجموعة العرض النشطة (الحاويات التي تتم إدارتها لكل جلسة من خلال xrBeginSpatialContainerRenderingEXT وxrEndSpatialContainerRenderingEXT). تحتوي كل XrSpatialContainerLayerEXT على قائمة بمؤشرات XrCompositionLayerBaseHeader المرتبطة بالحاوية المكانية المحدّدة. يمكن لبيئات التشغيل دمج الحاويات بأي ترتيب تختاره، بغض النظر عن ترتيب containerLayers . على سبيل المثال، قد تدمج بيئات التشغيل الحاويات استنادًا إلى عمقها بالنسبة إلى المستخدم، أو تجعل حاوية مكانية تعمل كطبقة خلفية، أو "تثبّت" حاوية مكانية بحيث تكون دائمًا في الأعلى بغض النظر عن عمقها. قد تدمج بيئات التشغيل الطبقات باستخدام استراتيجيات مختلفة للحاويات المكانية في الوضعَين المحدود أو المجسم. على سبيل المثال، قد تدمج بيئات التشغيل مسبقًا طبقات تركيب كل حاوية مكانية محدودة في طبقة رباعية مجسّمة واحدة يتم دمجها مع جميع الحاويات الأخرى في خطوة تركيب ثانية.
سيتم تطبيق XrFrameEndInfo :: displayTime وXrFrameEndInfo :: environmentBlendMode على جميع الحاويات المكانية المتوفّرة في XrSpatialContainerLayerFrameEndInfoEXT .
عند تمرير هذه البنية إلى xrEndFrame من خلال ربطها بـ XrFrameEndInfo، تتم إضافة حالات الخطأ الإضافية التالية استنادًا إلى مجموعة العرض النشطة:
- إذا تمت الإشارة إلى حاوية مكانية من خلال أكثر من عنصر واحد من
containerLayers، يجب أن تعرض بيئات التشغيلXR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXT. - إذا لم تتم الإشارة إلى حاوية مكانية في مجموعة العرض النشطة من خلال عنصر من
containerLayers، يجب أن تعرض بيئات التشغيلXR_ERROR_SPATIAL_CONTAINER_MISSING_EXT. - إذا لم تكن الحاوية المكانية التي تشير إليها السمة
containerLayersعضوًا في مجموعة العرض النشطة، يجب أن تعرض بيئات التشغيل القيمةXR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT.
Furthermore, if there are any spatial containers in the active render set and this structure is not chained onto XrFrameEndInfo , runtimes must return XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT .
في أي من حالات الخطأ المذكورة أعلاه، يجب ألا يعرض وقت التشغيل أي محتوى لأي حاوية مكانية.
إذا لم تكن هناك حاويات مكانية في مجموعة العرض النشطة، يمكن للتطبيق استدعاء xrEndFrame طالما أنّه لا يرسل أي طبقات تركيب.
يُرجى العِلم أنّه يمكن إرسال سلاسل تبديل فردية إلى حاويات متعددة من خلال طبقات في بنية صالحة، مثل طبقة رباعية يتم عرضها من خلال سلسلة تبديل واحدة يتم إرسالها إلى حاويات مكانية متعددة. يتم التعامل مع هذه الحالة بشكل موحّد مع عمليات العرض الأخرى: يجب أن يعرض وقت التشغيل الرباعي في جميع هذه الحاويات المكانية.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerLayerFrameEndInfoEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_LAYER_FRAME_END_INFO_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن يكون
containerLayersمؤشرًا إلى مصفوفة من هياكلcontainerLayerCountصالحة من نوع XrSpatialContainerLayerEXT - يجب أن تكون المَعلمة
containerLayerCountأكبر من0
تجمع بنية XrSpatialContainerLayerEXT طبقات التركيب العادية وتربطها بحاوية مكانية معيّنة.
typedef struct XrSpatialContainerLayerEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
XrBool32 retainPreviousSubmission;
uint32_t layerCount;
const XrCompositionLayerBaseHeader* const* layers;
} XrSpatialContainerLayerEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
spatialContainerهي السمة XrSpatialContainerEXT التي تحدّد الحاوية المستهدَفة. - "
retainPreviousSubmission" هوXrBool32. إذا كانت القيمةXR_TRUE، سيحتفظ وقت التشغيل بآخر إطار تم إرساله لهذه الحاوية المكانية. -
layerCountهو عدد طبقات التركيب في مصفوفةlayers. -
layersهو مؤشر إلى مصفوفة من مؤشرات XrCompositionLayerBaseHeader.
عندما تكون قيمة retainPreviousSubmission هي XR_TRUE، يجب أن يعيد وقت التشغيل استخدام طبقات التركيب ومحتوى صورة سلسلة التبديل كما تم تثبيتها خلال آخر طلب xrEndFrame حيث كانت قيمة retainPreviousSubmission هي XR_FALSE . يجب ألا تظهر أي تعديلات لاحقة على سلاسل التبديل التي تستخدمها الطبقات المحفوظة في الناتج المعروض.
بالنسبة إلى الطبقات التي يتم إرسالها لحاوية مكانية فردية (العرض داخل الحاوية)، يجب أن يتّبع وقت التشغيل القواعد المحدّدة مسبقًا لترتيب تركيب الطبقات. وهذا يعني أنّه يجب رسم الطبقات داخل الحاويات بالترتيب نفسه المحدّد لها، ويتم إنشاؤها من خلال خوارزمية الرسام.
يشير "محو" حاوية مكانية إلى إزالة كل المحتوى من حاوية مكانية، ما يؤدي إلى عدم عرض أي محتوى لتلك الحاوية في الإطار الحالي. يجب أن تتعامل بيئات التشغيل مع هذا الإجراء على أنّه يعادل إرسال التطبيق للون أسود شفاف (جميع وحدات البت 0) لكل بكسل داخل الحاوية. يشير مصطلح "الاحتفاظ" بحاوية مكانية إلى استمرار وقت التشغيل في عرض أحدث مجموعة من الطبقات التي تم إرسالها لتلك الحاوية.
بالنسبة إلى كل حاوية مكانية، يمكن للتطبيق تحديد ما إذا كان سيتم إرسال طبقات جديدة أو الاحتفاظ بالإرسال السابق أو محو الحاوية المكانية:
- لإرسال طبقات جديدة، يوفّر التطبيق قيمة
layerCountغير صفرية ومؤشرlayersصالحًا. - لمحو حاوية مكانية، يجب أن تكون قيمة
layerCountلإدخالها 0 ويجب أن تكون قيمةretainPreviousSubmissionهيXR_FALSE. - للاحتفاظ بآخر الطبقات وصور swapchain التي تم إرسالها (الاحتفاظ)، يجب أن تكون قيمة
layerCountلإدخالها 0 ويجب أن تكون قيمةretainPreviousSubmissionهيXR_TRUE.
يضمن عنصر التحكّم الصريح هذا لكل حاوية أن يتم توصيل هدف التطبيق بوضوح في كل إطار.
إذا كانت قيمة retainPreviousSubmission هي XR_TRUE وقيمة layerCount ليست 0، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE .
إذا لم تكن السمة XrSpatialContainerCompositionLayerViewConfigurationEXT مرتبطة بالسمة XrCompositionLayerProjection التي تشكّل جزءًا من حاوية مكانية، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE . لا تنطبق هذه البنية إلا على طبقات XrCompositionLayerProjection. إذا كانت مرتبطة بأنواع طبقات أخرى (مثل طبقات رباعية أو أسطوانية)، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE .
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerLayerEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_LAYER_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية . يُرجى الاطّلاع أيضًا على: XrSpatialContainerLayerVolumeClippingEXT - يجب أن يكون
spatialContainerاسمًا معرِّفًا صالحًا لـ XrSpatialContainerEXT - إذا لم تكن قيمة
layerCountهي0، يجب أن تكون قيمةlayersمؤشرًا إلى مصفوفة من هياكلlayerCountصالحة مستندة إلى XrCompositionLayerBaseHeader. راجِع أيضًا: XrCompositionLayerCubeKHR وXrCompositionLayerCylinderKHR وXrCompositionLayerEquirect2KHR وXrCompositionLayerEquirectKHR وXrCompositionLayerPassthroughANDROID وXrCompositionLayerPassthroughFB وXrCompositionLayerPassthroughHTC وXrCompositionLayerProjection وXrCompositionLayerQuad
تحديد إعدادات العرض لطبقات العرض
تُستخدَم بنية XrSpatialContainerCompositionLayerViewConfigurationEXT لتحديد إعدادات العرض المستخدَمة لعرض طبقة إسقاط لحاوية مكانية.
typedef struct XrSpatialContainerCompositionLayerViewConfigurationEXT {
XrStructureType type;
const void* next;
XrViewConfigurationType viewConfigurationType;
} XrSpatialContainerCompositionLayerViewConfigurationEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
viewConfigurationTypeهو XrViewConfigurationType الذي تم استخدامه لعرض XrCompositionLayerProjection .
عند إرسال XrCompositionLayerProjection لحاوية مكانية، يجب أن يحدّد التطبيق إعدادات العرض التي تم استخدامها لعرض الطبقة. هذا الإجراء ضروري لأنّ التطبيق يمكنه اختيار ما إذا كان سيتم عرض كل إطار باستخدام إعدادات العرض الأساسية للحاوية المكانية أو إعدادات العرض المنخفضة المقترَحة من وقت التشغيل، إن توفّرت.
عند ربط XrSpatialContainerCompositionLayerViewConfigurationEXT، يجب أن يتأكّد التطبيق من أنّ XrCompositionLayerProjection :: viewCount هو عدد مشاهدات صالح لـ XrViewConfigurationType المحدّد في البنية المرتبطة. يجب أن يكون viewConfigurationType المحدّد في البنية المتسلسلة هو XrSpatialContainerBeginInfoEXT :: primaryViewConfigurationType المحدّد عند بدء الحاوية، أو نوع إعدادات العرض المتدهورة التي يعرضها وقت التشغيل في XrSpatialContainerViewStateEXT، أو القيم الإضافية التي تم تفعيلها من خلال إضافة.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerCompositionLayerViewConfigurationEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية -
viewConfigurationTypeيجب أن تكون قيمة XrViewConfigurationType صالحة
سلوك اقتصاص وحدات البكسل
يجب أن تُعلم التطبيقات بيئة التشغيل بما إذا كانت تعرض وحدات بكسل خارج حدود الحاوية المكانية أم لا، وذلك من خلال ربط XrSpatialContainerLayerVolumeClippingEXT عند إرسال طبقات التركيب.
typedef struct XrSpatialContainerLayerVolumeClippingEXT {
XrStructureType type;
const void* next;
XrSpatialContainerVolumeClippingEXT volumeClipping;
} XrSpatialContainerLayerVolumeClippingEXT;
وصف العضو
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
volumeClippingهو XrSpatialContainerVolumeClippingEXT الذي طبّقه التطبيق.
تُعدّ هذه البنية تلميحًا لما إذا كان التطبيق يعرض وحدات بكسل خارج حدود حاوية مكانية. عندما تكون الحاوية المكانية في وضع مجسم، لا يكون لهذا التلميح أي معنى لأنّ الحدود لا نهائية.
بالنسبة إلى الحاويات المكانية المحدودة التي تستخدم العرض الذاتي، يحتاج وقت التشغيل إلى التفكير في كل من حدود الحجم الثلاثي الأبعاد وحدود وحدات البكسل الثنائية الأبعاد. يتم عرض حدود مستوى الصوت الثلاثي الأبعاد من xrGetSpatialContainerBoundsEXT . حدود وحدات البكسل الثنائية الأبعاد هي إسقاط حدود الحجم الثلاثي الأبعاد على كل شاشة للنظام.
يجب أن تتجاهل بيئات التشغيل وحدات البكسل من صور سلسلة التبديل خارج حدود البكسل الثنائية الأبعاد، ولكن يجب ألا تتجاهل بيئات التشغيل وحدات البكسل التي تقع داخل حدود البكسل الثنائية الأبعاد ولكن خارج حدود الحجم الثلاثية الأبعاد. يمكن استخدام تأثيرات الاستيريو التي يظهر فيها المحتوى وكأنّه يمتد إلى ما وراء حدود الحجم الثلاثي الأبعاد للحاوية أو أمامها. يمكن للتطبيقات تجاهل وحدات البكسل خارج حدود الحجم الثلاثي الأبعاد للحاوية المكانية المحدودة لتقليل مفارقات العمق، ويجب ضبط volumeClipping بناءً على كيفية إجراء ذلك، لأنّ مفارقات العمق غالبًا ما تسبّب إجهادًا للعين وعدم راحة للمستخدم.
قد تستخدم بيئات التشغيل السمة volumeClipping لتعديل طريقة عرض حاوية مكانية معيّنة. على سبيل المثال، عند ضبطه على XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT، يمكن أن يعرض وقت التشغيل الوجوه الخلفية لحدود الحجم الثلاثي الأبعاد التي قد تسبّب مفارقات في العمق إذا رسمت الحاوية المكانية وحدات بكسل خلف حدود الحجم الثلاثي الأبعاد للحاوية.
قد تسمح الإضافات المستقبلية بالاقتصاص استنادًا إلى حدود الحجم الثلاثي الأبعاد في حال إرسال معلومات العمق.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_container_self_renderingقبل استخدام XrSpatialContainerLayerVolumeClippingEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن تكون قيمة
volumeClippingصالحة لـ XrSpatialContainerVolumeClippingEXT
الأوامر الجديدة
- xrBeginSpatialContainerRenderingEXT
- xrEndSpatialContainerRenderingEXT
- xrLocateSpatialContainerViewsEXT
منشآت جديدة
- XrSpatialContainerBeginInfoEXT
- XrSpatialContainerEndInfoEXT
- XrSpatialContainerLayerEXT
- XrSpatialContainerViewLocateInfoEXT
- XrSpatialContainerViewStateEXT
- XrSpatialContainerViewsLocateInfoEXT
توسيع XrCompositionLayerProjection :
توسيع XrFrameEndInfo :
توسيع XrSpatialContainerLayerEXT :
ثوابت تعداد جديدة
XR_EXT_SPATIAL_CONTAINER_SELF_RENDERING_EXTENSION_NAMEXR_EXT_spatial_container_self_rendering_SPEC_VERSIONتوسيع XrResult :
XR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXTXR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXTXR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXTXR_ERROR_SPATIAL_CONTAINER_MISSING_EXTXR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
توسيع XrSpatialContainerGraphicsPresentationEXT :
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
توسيع XrStructureType :
XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXTXR_TYPE_SPATIAL_CONTAINER_END_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_LAYER_EXTXR_TYPE_SPATIAL_CONTAINER_LAYER_FRAME_END_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXTXR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_VIEW_STATE_EXT
تعليمات برمجية نموذجية
// Example: Complete lifecycle, view location, and frame submission for spatial containers
PFN_xrBeginSpatialContainerRenderingEXT xrBeginSpatialContainerRenderingEXT; // previously initialized
PFN_xrEndSpatialContainerRenderingEXT xrEndSpatialContainerRenderingEXT; // previously initialized
PFN_xrLocateSpatialContainerViewsEXT xrLocateSpatialContainerViewsEXT; // previously initialized
XrSession session; // previously initialized
// We want to update this container
XrSpatialContainerEXT containerA; // previously initialized with XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
XrSpace containerASpace; // previously initialized
// We want to retain this container
XrSpatialContainerEXT containerB; // previously initialized with XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
XrSpace containerBSpace; // previously initialized
// 1. Add to active render set when the app is ready to start submitting layers
XrSpatialContainerBeginInfoEXT beginInfoA {
.type = XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT,
.spatialContainer = containerA,
.primaryViewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};
CHK_XR(xrBeginSpatialContainerRenderingEXT(session, &beginInfoA));
XrSpatialContainerBeginInfoEXT beginInfoB {
.type = XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT,
.spatialContainer = containerB,
.primaryViewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};
CHK_XR(xrBeginSpatialContainerRenderingEXT(session, &beginInfoB));
// ... Frame Loop ...
XrTime displayTime; // returned from xrWaitFrame
const std::vector<XrSpatialContainerEXT> containers = {containerA, containerB};
const std::vector<XrSpace> containerSpaces = {containerASpace, containerBSpace};
uint32_t containerCount = static_cast<uint32_t>(containers.size());
// 2. Setup individual locate info for each container
std::vector<XrSpatialContainerViewLocateInfoEXT> containerLocateInfos(containerCount, {
.type = XR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXT,
});
for (uint32_t i = 0; i < containerCount; ++i) {
containerLocateInfos[i].viewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
containerLocateInfos[i].space = containerSpaces[i]; // Recommended to use container's own space
containerLocateInfos[i].spatialContainer = containers[i];
}
// Setup bulk locate info
XrSpatialContainerViewsLocateInfoEXT locateInfo {
.type = XR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXT,
.displayTime = displayTime,
.viewLocateInfoCount = containerCount,
.viewLocateInfos = containerLocateInfos.data(),
};
// Prepare states to be populated by the runtime
std::vector<XrSpatialContainerViewStateEXT> viewStates(containerCount, {
.type = XR_TYPE_SPATIAL_CONTAINER_VIEW_STATE_EXT,
});
// Call the dedicated locate views function
// We know the required view count is 2 per container for STEREO
const uint32_t viewsPerConfig = 2;
uint32_t totalViewCount = containerCount * viewsPerConfig;
std::vector<XrView> views(totalViewCount, {.type = XR_TYPE_VIEW});
CHK_XR(xrLocateSpatialContainerViewsEXT(session, &locateInfo, containerCount, viewStates.data(), totalViewCount, views.data()));
// Process results
for (uint32_t i = 0; i < containerCount; ++i) {
XrBool32 shouldSubmitLayers = viewStates[i].shouldSubmitLayers;
XrExtent2Di recommendedImageExtent = viewStates[i].recommendedImageExtent;
XrViewConfigurationType viewConfigurationType = viewStates[i].viewConfigurationType;
bool isDecayedToMono = (viewConfigurationType == XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO);
if (shouldSubmitLayers) {
// App is expected to also verify viewStates[i].viewStateFlags has valid orientation/position bits before rendering
XrView& leftView = views[i * viewsPerConfig];
XrView& rightView = views[i * viewsPerConfig + 1];
// If isDecayedToMono is true, left and right will be identical.
} else {
// Skip layer submission but retain previous submission when calling
// xrEndFrame.
}
}
// 3. Setup projection layer for container A
XrCompositionLayerProjection projectionLayer = {.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION};
// ... standard projection layer setup (space, viewCount, views, etc.) ...
// Specify which view configuration was used to render this specific layer
XrSpatialContainerCompositionLayerViewConfigurationEXT containerViewConfig {
.type = XR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXT,
// Even if the runtime decayed to MONO, we indicate what we actually rendered
.viewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};
// Chain it to the projection layer
projectionLayer.next = &containerViewConfig;
const XrCompositionLayerBaseHeader* layersA[1] = {reinterpret_cast<const XrCompositionLayerBaseHeader*>(&projectionLayer)};
// Note: In a real app, you are required to submit ALL active containers in the render set.
XrSpatialContainerLayerVolumeClippingEXT containerClippingA = {
.type = XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT,
// Set volumeClipping appropriately for the rendering done.
.volumeClipping = XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT,
};
// Setup container A (Update with new pixels)
XrSpatialContainerLayerEXT containerLayerA {
.type = XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT,
.next = &containerClippingA,
.spatialContainer = containerA,
.retainPreviousSubmission = XR_FALSE,
.layerCount = 1,
.layers = layersA,
};
XrSpatialContainerLayerVolumeClippingEXT containerClippingB {
.type = XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT,
// Set volumeClipping appropriately for the rendering done.
.volumeClipping = XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT,
};
// Setup container B (Explicitly retain previous frame)
XrSpatialContainerLayerEXT containerLayerB {
.type = XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT,
.next = &containerClippingB,
.spatialContainer = containerB,
.retainPreviousSubmission = XR_TRUE,
.layerCount = 0, // Required to be 0 when retaining
.layers = nullptr,
};
// Aggregate all container layers
XrSpatialContainerLayerEXT containerLayers[] = { containerLayerA, containerLayerB };
XrSpatialContainerLayerFrameEndInfoEXT spatialEndInfo {
.type = XR_TYPE_SPATIAL_CONTAINER_LAYER_FRAME_END_INFO_EXT,
.containerLayerCount = 2, // Must equal the number of active containers
.containerLayers = containerLayers,
};
XrFrameEndInfo frameEndInfo {
.type = XR_TYPE_FRAME_END_INFO,
.next = &spatialEndInfo,
.displayTime = displayTime,
.environmentBlendMode = XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND,
.layerCount = 0, // MANDATORY: Must be 0 for self rendering extension
};
CHK_XR(xrEndFrame(session, &frameEndInfo));
// ... End Frame Loop ...
// 4. Remove from active render set when the container is destroyed or no longer needs rendering
XrSpatialContainerEndInfoEXT endInfoA {
.type = XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT,
.spatialContainer = containerA,
};
CHK_XR(xrEndSpatialContainerRenderingEXT(session, &endInfoA));
XrSpatialContainerEndInfoEXT endInfoB {
.type = XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT,
.spatialContainer = containerB,
};
CHK_XR(xrEndSpatialContainerRenderingEXT(session, &endInfoB));
سجلّ الإصدارات
المراجعة 1، 06-08-2026 (لاكلان فورد)
- الوصف الأولي للإضافة