XR_EXT_spatial_container_self_rendering
رشته نام
XR_EXT_spatial_container_self_rendering
نوع افزونه
افزونه نمونه
شماره داخلی ثبتشده
814
بازبینی
1
وضعیت تصویب
تصویبنشده
وابستگیهای افزونه و نسخه
XR_EXT_spatial_container
تاریخ آخرین تغییر
2026-08-06
وضعیت IP
هیچ ادعای مالکیت فکری شناختهشدهای وجود ندارد.
همیاران
Lachlan Ford، Google
Andreas Loeve Selvik، Meta Platforms
Adam Gousetis، Meta Platforms
Bjorn Swenson، LÖVR
Cass Everitt، Meta Platforms
Christian Kruse، Meta Platforms
Denny Rönngren، Varjo Technologies
Fredia Huya-Kouadio، Godot Engine
Jakob Bornecrantz، NVIDIA
Jared Finder، Google
Jonathan Wright، Meta Platforms
Jian Zhang، ByteDance
Kurtis Eveleigh، Qualcomm
Mauricio Narvaez، Meta Platforms
Nick Klingensmith، Qualcomm
Nikita Lutsenko، Meta Platforms
Praveen Babu J D، ByteDance
Rylie Pavlik، Collabora
Salar Khan، Google
Shuai Liu، ByteDance
Walter Luh، Meta Platforms
Yin Li، Microsoft
نمای کلی
این افزونه «خودپردازشی» را برای محفظههای فضایی تعریف میکند. پیکسلهای یک محفظه فضایی خودپردازششده همگی توسط یک برنامه تولید میشوند و بااستفاده از زنجیرههای مبادله استاندارد OpenXR و لایههای ترکیببندی به زمان اجرا ارسال میشوند. ازآنجاییکه محفظههای فضایی همیشه همه پیکسلهای صفحهنمایش را اشغال نمیکنند، زمان اجرا به برنامهها درباره وضوح توصیهشده و پیکربندی نمای هر محفظه فضایی اطلاع میدهد تا برنامهها بتوانند بهطور مؤثرتری پردازش کنند.
این افزونه در ترکیب با XR_EXT_spatial_container برای ارائه مجموعهای از قابلیتهای رندرینگ لایه ترکیببندی هسته OpenXR 1.x معمولی درنظر گرفته شده است. زمانهای اجرای OpenXR 1.x که از رندر گرافیکی پشتیبانی میکنند و این افزونه باید XrSystemSpatialContainerPropertiesEXT :: supportsImmersive را روی true تنظیم کنند تا نشان دهند که از محفظههای فضایی فراگیر پشتیبانی میکنند.
چرخه حیات پرداز زدن محفظه فضایی
برای استفاده از خودپردازی برای محفظه فضایی، برنامه XrSpatialContainerCreateInfoEXT :: graphicsPresentation را هنگام فراخوانی xrCreateSpatialContainerEXT روی XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT تنظیم میکند. سپس آن برنامه میتواند با فراخوانی توابع xrBeginSpatialContainerRenderingEXT و xrEndSpatialContainerRenderingEXT، مدیریت کند که آیا محفظه فضایی بهطور فعال رندر میشود یا نه. این توابع جایگزین xrBeginSession و xrEndSession میشوند. این عملیاتها عملیاتهای هر قاب نیستند، مانند xrBeginFrame و xrEndFrame .
در هر قاب، برنامه مراحل زیر را طی میکند:
- xrWaitFrame و xrBeginFrame را فراخوانی کنید. این توابع ساختارهای خاص محفظه ندارند و عملکرد آنها مانند عملکردشان در مشخصات اصلی است.
- Retrieve view poses, projection parameters, and rendering recommendations for all spatial containers actively rendering with 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 باشد
ایمنی رشتهای
- دسترسی به پارامتر
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;
شرح عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
spatialContainerهمان XrSpatialContainerEXT برای شروع رندر کردن است. primaryViewConfigurationTypeXrViewConfigurationType اصلی است که برای ظرف فضایی استفاده میشود.
primaryViewConfigurationType پیکربندی نمایی است که برنامه قصد دارد هنگام پردازش استفاده کند. زمان اجرا ممکن است پیکربندی نما را برای اهداف بهینهسازی به نوعی با نماهای کمتر کاهش دهد (مثلاً یک محفظه بسیار دور و کوچک است بهطوریکه استریو غیرقابلتشخیص است). زمان اجرا جزئیاتی درباره پیکربندی نمای زوالیافته از تماسها با xrLocateSpatialContainerViewsEXT برمیگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerBeginInfoEXT فعال شود -
typeبایدXR_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 باشد
ایمنی رشتهای
- دسترسی به پارامتر
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;
شرح عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
spatialContainerهمان XrSpatialContainerEXT برای پایان دادن به پردازش است.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerEndInfoEXT فعال شود -
typeبایدXR_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 ارائه دهد:
- نمایه ۰:
XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO(۱ بازدید) - شاخص ۱:
XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO(۲ بازدید) - نمایه ۲:
XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO_WITH_FOVEATED_INSET(۴ بازدید)
سپس زمان اجرا باید آرایه views را با ۷ نما پر کند:
views[0] نمای محفظه 0 است.views[1] نمای چشم چپ برای محفظه ۱ است.views[2] نمای چشم راست برای ظرف ۱ است.views[3] نمای چشم چپ برای محتوی ۲ است.views[4] نمای چشم راست برای محفظه ۲ است.views[5] نمای حاشیه چشم چپ برای محفظه ۲ است.views[6] نمای درجشده چشم راست برای محفظه ۲ است.
اگر viewCount با مجموع تعداد بازدیدها برای هر نوع پیکربندی نمای درخواستی محفظه فضایی برابر نباشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
زمان اجرا ممکن است پیکربندی نما را برای اهداف بهینهسازی به نوعی با نماهای کمتر کاهش دهد (مثلاً یک محفظه بسیار دور و کوچک است بهطوریکه استریو نامحسوس است). اگر زمان اجرا پیکربندی نما را کاهش دهد، زمان اجرا باید همچنان تعداد اصلی نماها را برای آن محفظه برگرداند و نماهای اضافی را با نسخههای تکراری نماهای کاهشیافته پر کند. برای مثال، اگر XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO به XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO کاهش یابد، هر دو نمایه ۰ و نمایه ۱ حاوی نمای تکصدایی خواهند بود. درنتیجه، تعداد کل بازدیدهای برگرداندهشده در آرایه views مستقل از این است که آیا زمان اجرا تصمیم گرفته است پیکربندیهای بازدید را کاهش دهد یا نه.
زمان اجرا باید هر XrView :: fov برگرداندهشده را بهگونهای تطبیق دهد که هرم ناقص تا حد امکان کوچک باشد و درعینحال کل مرزهای محفظه فضایی مربوطه را دربرگیرد. زمانهای اجرا ممکن است میدانهای دید نامتقارن برگردانند، مثلاً اگر محفظه فضایی در زاویه مایل نسبتبه نمای کاربر باشد یا بخشیاز آن توسط شیء دیگری مسدود شده باشد. زمانهای اجرا میتوانند سطح رندر هدف را برای محفظه فضایی آزادانه قرار دهند. بهدلیل ماهیت پردازش چندبرنامهای، که در آن محفظههای فضایی از کاربر جدا میشوند، زمان اجرا ممکن است مقادیر XrView را برگرداند که برای پردازش پیکسل مناسب نیستند، برای مثال اگر محفظه فضایی روی صفحه قابلمشاهده نباشد، مقادیر معتبری برای تنظیم XrView :: fov وجود ندارد. در چنین مواردی، زمانهای اجرا باید XrSpatialContainerViewStateEXT :: shouldSubmitLayers را روی false تنظیم کنند.
زمان اجرا اطلاعات وضعیت پرداخت اضافی برای هر محفظه فضایی را در آرایه 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;
شرح عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. displayTimeXrTimeاست که بازدیدها در آن قرار دارد.viewLocateInfoCountتعداد ورودیها در آرایهviewLocateInfosاست.viewLocateInfosاشارهگری به آرایهای از ساختارهای XrSpatialContainerViewLocateInfoEXT است.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerViewsLocateInfoEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
viewLocateInfosباید اشارهگری به آرایهای از ساختارهای معتبرviewLocateInfoCountXrSpatialContainerViewLocateInfoEXT باشد - پارامتر
viewLocateInfoCountباید بزرگتر از0باشد
ساختار XrSpatialContainerViewLocateInfoEXT حاوی پارامترهایی برای یک محفظه فضایی مجزا است تا نماها را برای آن مکانیابی کند.
typedef struct XrSpatialContainerViewLocateInfoEXT {
XrStructureType type;
const void* next;
XrViewConfigurationType viewConfigurationType;
XrSpace space;
XrSpatialContainerEXT spatialContainer;
} XrSpatialContainerViewLocateInfoEXT;
شرح عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
viewConfigurationTypeیک XrViewConfigurationType است که برای محفظه فضایی استفاده میشود. -
spaceهمان XrSpace است که نماهای محفظه فضایی در آن قرار دارد. -
spatialContainerدسته XrSpatialContainerEXT است.
برنامه میتواند هر XrSpace معتبری را در space ارائه دهد، اما توصیه میشود که فضای محفظه فضایی را برای XrSpatialContainerEXT مربوطه که در ساختار XrSpatialContainerViewLocateInfoEXT مشخص شده است ارائه دهد.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerViewLocateInfoEXT فعال شود -
typeبایدXR_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;
شرح عضو
typeXrStructureType این ساختار است.-
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را روی true تنظیم کند. اگر برنامه تصمیم بگیرد لایهها را بههرحال ارسال کند، تعیین اینکه با لایهها چه کاری انجام شود برعهده زمان اجرا است (برای مثال، زمان اجرا ممکن است تصمیم بگیرد آنها را رها کند).
recommendedImageExtent صریحاً برای لایههایی است که براساس موقعیت محفظه یا نمای کاربر بهروزرسانی خواهند شد. هنگام بهروزرسانی لایهها با محتوایی که به موقعیت محفظه فضایی یا نمای کاربر بستگی دارد (مانند محتوای سهبعدی معمولی)، برنامه باید بهجای اندازه نمای توصیهشده پیشفرض، در این نمای هدف کوچکتر رندر شود. هنگام بهروزرسانی لایههایی با محتوایی که به موقعیت محفظه فضایی یا نمای کاربر بستگی ندارد (مانند لایههای چهارگوش ایستا)، برنامه میتواند با اطمینان این مقادیر را نادیده بگیرد. برای لایههای وابسته به نما، recommendedImageExtent توصیهای به برنامه از زمان اجرا است که هدف آن بهحداقل رساندن پلهپله شدن و بهبود عملکرد پردازش است. برنامه میتواند درصورت تمایل، با وضوح کامل ارسال شود.
XrExtent2Di :: width و XrExtent2Di :: height از recommendedImageExtent باید همیشه عدد صحیح مثبتی کمتر از یا مساوی با XrViewConfigurationView :: recommendedImageRectWidth و XrViewConfigurationView :: recommendedImageRectHeight از XrViewConfigurationView برای پیکربندی نمای اصلی محفظه فضایی باشد. برنامه نباید زنجیره تعویض را صرفاً بهدلیل تغییر recommendedImageExtent بازسازی کند، زیرا این یک اشاره پویا به برنامه است که XrSwapchainSubImage :: imageRect را برای استفاده در XrSwapchainSubImage هر لایه ترکیببندی با وضوح کامل که ارسال میکند مشخص میکند و میتواند در هر فریم تغییر کند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerViewStateEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_CONTAINER_VIEW_STATE_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
viewStateFlagsباید ترکیب معتبری از مقادیر XrViewStateFlagBits باشد -
viewStateFlagsنباید0باشد -
viewConfigurationTypeباید مقدار XrViewConfigurationType معتبری باشد
مشاهده فضای مرجع
فضای مرجع نما بدون تغییر باقی میماند، همانطور که در هسته OpenXR است. همانند هسته، برای استفاده در پردازش درنظر گرفته نشده است.
ارسال لایهها ازطریق xrEndFrame
برای رندر کردن محفظههای فضایی، برنامه باید فهرستی از لایههای مرتبط با محفظههای فضایی مربوطه را به xrEndFrame ارائه دهد. این کار ازطریق ساختار XrSpatialContainerLayerFrameEndInfoEXT انجام میشود.
typedef struct XrSpatialContainerLayerFrameEndInfoEXT {
XrStructureType type;
const void* next;
uint32_t containerLayerCount;
const XrSpatialContainerLayerEXT* containerLayers;
} XrSpatialContainerLayerFrameEndInfoEXT;
شرح عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. containerLayerCountتعداد عناصر در آرایهcontainerLayersاست.-
containerLayersاشارهگری به آرایهای از ساختارهای XrSpatialContainerLayerEXT است.
آرایه containerLayers حاوی یک XrSpatialContainerLayerEXT برای هر محفظه فضایی در مجموعه رندر فعال است (محفظههایی که در هر جلسه توسط xrBeginSpatialContainerRenderingEXT و xrEndSpatialContainerRenderingEXT مدیریت میشوند). هر XrSpatialContainerLayerEXT حاوی فهرستی از اشارهگرهای XrCompositionLayerBaseHeader مرتبط با محفظه فضایی دادهشده است. زمانهای اجرا میتوانند محفظهها را به هر ترتیبی که انتخاب میکنند، مستقل از ترتیب containerLayers، ترکیب کنند. برای مثال، زمانهای اجرا ممکن است محفظههای ترکیبی را براساس عمق آنها نسبت به کاربر ایجاد کنند، یک محفظه فضایی را بهعنوان لایه پسزمینه قرار دهند، یا یک محفظه فضایی را «سنجاق» کنند تا بدون توجه به عمق آن، همیشه در بالا قرار گیرد. زمانهای اجرا ممکن است لایههای ترکیبی باشند که از استراتژیهای مختلفی برای محفظههای فضایی در حالتهای محدود یا فراگیر استفاده میکنند. برای مثال، زمانهای اجرا ممکن است لایههای ترکیببندی هر محفظه فضایی محدودشده را در یک لایه چهارگانه استریو پیشترکیب کنند که در مرحله ترکیببندی دوم با همه محفظههای دیگر ترکیب میشود.
XrFrameEndInfo :: displayTime و XrFrameEndInfo :: environmentBlendMode برای همه محفظههای فضایی ارائهشده در XrSpatialContainerLayerFrameEndInfoEXT اعمال خواهد شد.
وقتی این ساختار با زنجیر شدن به XrFrameEndInfo به xrEndFrame منتقل میشود، موارد خطای اضافی زیر براساس مجموعه رندر فعال اضافه میشود:
- اگر بیشاز یک عنصر
containerLayersبه یک محفظه فضایی ارجاع دهد، زمانهای اجرا بایدXR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXTرا برگردانند. - اگر یک محفظه فضایی در مجموعه رندر فعال توسط عنصری از
containerLayersارجاع داده نشود، زمانهای اجرا بایدXR_ERROR_SPATIAL_CONTAINER_MISSING_EXTرا برگردانند. - اگر محفظه فضایی ارجاعشده توسط
containerLayersعضوی از مجموعه پرداز فعال نباشد، زمانهای اجرا بایدXR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXTرا برگردانند.
علاوهبراین، اگر هرگونه محفظه فضایی در مجموعه رندر فعال وجود داشته باشد و این ساختار به XrFrameEndInfo زنجیر نشده باشد، زمانهای اجرا باید XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT را برگردانند.
در هریک از موارد خطای بالا، زمان اجرا نباید هیچ محتوایی را برای هیچ ظرف فضایی ارائه دهد.
اگر هیچ محفظه فضایی در مجموعه پردازش فعال نباشد، برنامه میتواند xrEndFrame را فراخوانی کند، بهشرطی که هیچ لایه ترکیببندی ارسال نکند.
توجه داشته باشید که زنجیرههای تعویض تکی ممکن است برای چندین محفظه ازطریق لایهها در ساختاری معتبر ارسال شوند، مثلاً یک لایه چهارگانه که ازطریق یک زنجیره تعویض تکی رندر شده و به چندین محفظه فضایی ارسال شده است. این مورد بهطور یکسان با سایر موارد پردازشی مدیریت میشود: زمان اجرا باید چهارضلعی را در همه این محفظههای فضایی پردازش کند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerLayerFrameEndInfoEXT فعال شود -
typeبایدXR_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;
شرح عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
spatialContainerXrSpatialContainerEXT است که محفظه هدف را شناسایی میکند. -
retainPreviousSubmissionیکXrBool32است. اگرXR_TRUE، زمان اجرا آخرین قاب ارسالشده را برای این محفظه فضایی حفظ خواهد کرد. layerCountتعداد لایههای ترکیببندی در آرایهlayersاست.-
layersاشارهگری به آرایهای از اشارهگرهای XrCompositionLayerBaseHeader است.
وقتی retainPreviousSubmission برابر با XR_TRUE باشد، زمان اجرا باید لایههای ترکیببندی و محتوای تصویر زنجیره تعویض را همانطور که درطول آخرین فراخوانی xrEndFrame که retainPreviousSubmission برابر با XR_FALSE بود قفل شدهاند، مجدداً استفاده کند. هرگونه تغییر بعدی در زنجیرههای تعویض مورداستفاده توسط لایههای حفظشده نباید در خروجی رندرشده منعکس شود.
برای لایههای ارسالشده برای یک محفظه فضایی مجزا (بازپردازی درون محفظه)، زمان اجرا باید از قوانین ازپیش مشخصشده برای ترتیب ترکیببندی لایه پیروی کند. یعنی لایههای درون محفظهها باید به همان ترتیبی که مشخص شدهاند ترسیم شوند و ازطریق الگوریتم نقاش ترکیب شوند.
«پاک کردن» محفظه فضایی به برداشتن همه محتوا از محفظه فضایی اشاره دارد که باعث میشود هیچچیز برای آن محفظه در قاب فعلی ارائه نشود. زمانهای اجرا باید این را معادل ارسال سیاه شفاف (همه بیتها ۰) توسط برنامه برای هر پیکسل داخل محفظه درنظر بگیرند. «حفظ» محفظه فضایی به زمان اجرا اشاره دارد که همچنان جدیدترین مجموعه لایههای ارسالشده برای آن محفظه را نمایش میدهد.
برای هر محفظه فضایی، برنامه میتواند مشخص کند که آیا لایههای جدید ارسال شود، ارسال قبلی حفظ شود، یا محفظه فضایی پاک شود:
- برای ارسال لایههای جدید، برنامه یک
layerCountغیرصفر و یک اشارهگرlayersمعتبر ارائه میدهد. - برای پاک کردن محفظه فضایی،
layerCountبرای ورودی آن باید ۰ باشد وretainPreviousSubmissionبایدXR_FALSEباشد. - برای حفظ آخرین لایههای ارسالشده و تصاویر زنجیره تعویض (حفظ)،
layerCountبرای ورودی آن باید ۰ باشد وretainPreviousSubmissionبایدXR_TRUEباشد.
این کنترل صریح برای هر محفظه تضمین میکند که هدف برنامه بهوضوح در هر قاب منتقل میشود.
اگر retainPreviousSubmission برابر با XR_TRUE باشد و layerCount برابر با ۰ نباشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
اگر XrSpatialContainerCompositionLayerViewConfigurationEXT به XrCompositionLayerProjection که بخشی از محفظه فضایی است زنجیر نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند. این ساختار فقط برای لایههای XrCompositionLayerProjection قابلاجرا است. اگر به انواع لایههای دیگر (مثلاً لایههای چهارگوش یا استوانهای) زنجیر شده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerLayerEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_CONTAINER_LAYER_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد. همچنین ببینید: XrSpatialContainerLayerVolumeClippingEXT -
spatialContainerباید شناسه مجازی XrSpatialContainerEXT معتبر باشد - اگر
layerCountبرابر با0نباشد،layersباید اشارهگری به آرایهای از ساختارهای معتبر مبتنی بر XrCompositionLayerBaseHeader به تعدادlayerCountباشد. همچنین ببینید: XrCompositionLayerCubeKHR ،XrCompositionLayerCylinderKHR ،XrCompositionLayerEquirect2KHR ،XrCompositionLayerEquirectKHR ،XrCompositionLayerPassthroughANDROID ،XrCompositionLayerPassthroughFB ،XrCompositionLayerPassthroughHTC ،XrCompositionLayerProjection ،XrCompositionLayerQuad
مشخص کردن پیکربندی نما برای لایههای طرحافکنی
ساختار XrSpatialContainerCompositionLayerViewConfigurationEXT برای مشخص کردن پیکربندی نمای استفادهشده برای رندر کردن لایه پخش محتوا برای محفظه فضایی استفاده میشود.
typedef struct XrSpatialContainerCompositionLayerViewConfigurationEXT {
XrStructureType type;
const void* next;
XrViewConfigurationType viewConfigurationType;
} XrSpatialContainerCompositionLayerViewConfigurationEXT;
شرح عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
viewConfigurationTypeهمان XrViewConfigurationType است که برای رندر کردن XrCompositionLayerProjection استفاده شده است.
هنگام ارسال XrCompositionLayerProjection برای محفظه فضایی، برنامه باید مشخص کند که از کدام پیکربندی نما برای رندر کردن لایه استفاده شده است. این کار ضروری است زیرا برنامه میتواند برای هر فریم انتخاب کند که با پیکربندی نمای اصلی محفظه فضایی رندر شود یا با پیکربندی نمای تضعیفشده پیشنهادی زمان اجرا (درصورت وجود).
وقتی XrSpatialContainerCompositionLayerViewConfigurationEXT زنجیرهای باشد، برنامه باید مطمئن شود که XrCompositionLayerProjection :: viewCount شمار بازدید معتبری برای XrViewConfigurationType مشخصشده در ساختار زنجیرهای است. viewConfigurationType مشخصشده در ساختار زنجیرهای باید XrSpatialContainerBeginInfoEXT :: primaryViewConfigurationType مشخصشده هنگام شروع محفظه، یا نوع پیکربندی نمای زوالیافته برگرداندهشده توسط زمان اجرا در XrSpatialContainerViewStateEXT ، یا مقادیر اضافی فعالشده ازطریق افزونه باشد.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerCompositionLayerViewConfigurationEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
viewConfigurationTypeباید مقدار XrViewConfigurationType معتبری باشد
رفتار برش Pixel
برنامهها باید با زنجیرهای کردن XrSpatialContainerLayerVolumeClippingEXT هنگام ارسال لایههای ترکیببندی، به زمان اجرا اطلاع دهند که آیا پیکسلها را خارج از مرزهای محفظه فضایی ارائه میکنند یا نه.
typedef struct XrSpatialContainerLayerVolumeClippingEXT {
XrStructureType type;
const void* next;
XrSpatialContainerVolumeClippingEXT volumeClipping;
} XrSpatialContainerLayerVolumeClippingEXT;
شرح عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
volumeClippingهمان XrSpatialContainerVolumeClippingEXT است که برنامه اعمال کرده است.
این ساختار بهعنوان راهنمایی برای زمانی عمل میکند که برنامه پیکسلها را خارج از مرزهای محفظه فضایی ارائه میدهد. وقتی محفظه فضایی در حالت فراگیر است، چون مرزها بینهایت هستند، این راهنمایی معنایی ندارد.
برای محفظههای فضایی محدودشده که از خودپردازی استفاده میکنند، زمان اجرا باید هم حدود حجم سهبعدی و هم حدود پیکسل دوبعدی را استدلال کند. مرزهای حجم سهبعدی از xrGetSpatialContainerBoundsEXT برگردانده میشود. محدوده پیکسل دوبعدی، تصویر محدوده حجم سهبعدی روی هر نمایشگر برای سیستم است.
زمانهای اجرا باید پیکسلها را از تصاویر زنجیره تعویض خارج از مرزهای پیکسل دوبعدی دور بیندازند، اما زمانهای اجرا نباید پیکسلهایی را که داخل مرزهای پیکسل دوبعدی اما خارج از مرزهای حجم سهبعدی هستند دور بیندازند. جلوههای استریو که در آنها محتوا فراتر از مرزهای حجم سهبعدی ظرف یا در جلوی آن بهنظر میرسد امکانپذیر است. برنامهها میتوانند پیکسلهای خارج از مرزهای حجم سهبعدی یک محفظه فضایی محدودشده را برای کاهش پارادوکسهای عمق حذف کنند و باید volumeClipping را براساس نحوه انجام این کار تنظیم کنند. پارادوکسهای عمق اغلب باعث خستگی چشم و ناراحتی کاربر میشوند.
زمانهای اجرا ممکن است از volumeClipping برای تنظیم نحوه نمایش یک محفظه فضایی خاص استفاده کنند. برای مثال، وقتی روی XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT تنظیم شده باشد، زمان اجرا میتواند وجههای پشتی مرزهای حجم سهبعدی را رندر کند که اگر ظرف فضایی پیکسلها را پشت مرزهای حجم سهبعدی ظرف ترسیم کند، باعث پارادوکسهای عمق میشود.
افزونههای آینده ممکن است درصورت ارسال اطلاعات عمق، امکان برش براساس حدود حجم سهبعدی را فراهم کنند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_container_self_renderingباید قبلاز استفاده از XrSpatialContainerLayerVolumeClippingEXT فعال شود -
typeبایدXR_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));
سابقه نسخه
بازبینی ۱، ۲۰۲۶-۰۸-۰۶ (Lachlan Ford)
- شرح اولیه افزونه