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);

شرح پارامترها

برنامه‌ها معمولاً این را در پاسخ به رویداد 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_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT
  • XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT
  • XR_ERROR_VALIDATION_FAILURE
  • XR_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 برمی‌گرداند.

استفاده معتبر (ضمنی)

تابع xrEndSpatialContainerRenderingEXT محفظه فضایی را از مجموعه پرداز فعال برمی‌دارد.

XrResult xrEndSpatialContainerRenderingEXT(
    XrSession                                   session,
    const XrSpatialContainerEndInfoEXT*         endInfo);

شرح پارامترها

برنامه‌ها معمولاً این را در پاسخ به رویداد visible-changed با XrEventDataSpatialContainerVisibleChangedEXT :: visible تنظیم‌شده روی false فراخوانی می‌کنند.

اگر محفظه فضایی در مجموعه رندر فعال نباشد، زمان اجرا باید XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT را برگرداند.

اگر xrEndSpatialContainerRenderingEXT در زمانی فراخوانی شود که برنامه نمی‌تواند xrWaitFrame را فراخوانی کند (یعنی در دوره بین فراخوانی‌های xrBeginFrame و xrEndFrame)، زمان اجرا باید XR_ERROR_CALL_ORDER_INVALID را برگرداند.

استفاده معتبر (ضمنی)

ایمنی رشته‌ای

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • XR_ERROR_VALIDATION_FAILURE

ساختار XrSpatialContainerEndInfoEXT برای مشخص کردن پارامترهای پایان دادن به پردازاندن محفظه فضایی استفاده می‌شود.

typedef struct XrSpatialContainerEndInfoEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrSpatialContainerEndInfoEXT;

شرح عضو

  • type XrStructureType این ساختار است.
  • ‫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 باید اشاره‌گری به آرایه‌ای از ساختارهای viewStateCount XrSpatialContainerViewStateEXT باشد
  • views باید اشاره‌گری به آرایه‌ای از ساختارهای viewCount XrView باشد
  • پارامتر viewStateCount باید بزرگ‌تر از 0 باشد
  • پارامتر viewCount باید بزرگ‌تر از 0 باشد

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE
  • XR_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 است.

استفاده معتبر (ضمنی)

ساختار 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 مشخص شده است ارائه دهد.

استفاده معتبر (ضمنی)

ساختار 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 را روی true تنظیم کند. اگر برنامه تصمیم بگیرد لایه‌ها را به‌هرحال ارسال کند، تعیین اینکه با لایه‌ها چه کاری انجام شود برعهده زمان اجرا است (برای مثال، زمان اجرا ممکن است تصمیم بگیرد آن‌ها را رها کند).

recommendedImageExtent صریحاً برای لایه‌هایی است که براساس موقعیت محفظه یا نمای کاربر به‌روزرسانی خواهند شد. هنگام به‌روزرسانی لایه‌ها با محتوایی که به موقعیت محفظه فضایی یا نمای کاربر بستگی دارد (مانند محتوای سه‌بعدی معمولی)، برنامه باید به‌جای اندازه نمای توصیه‌شده پیش‌فرض، در این نمای هدف کوچک‌تر رندر شود. هنگام به‌روزرسانی لایه‌هایی با محتوایی که به موقعیت محفظه فضایی یا نمای کاربر بستگی ندارد (مانند لایه‌های چهارگوش ایستا)، برنامه می‌تواند با اطمینان این مقادیر را نادیده بگیرد. برای لایه‌های وابسته به نما، recommendedImageExtent توصیه‌ای به برنامه از زمان اجرا است که هدف آن به‌حداقل رساندن پله‌پله شدن و بهبود عملکرد پردازش است. برنامه می‌تواند درصورت تمایل، با وضوح کامل ارسال شود.

XrExtent2Di :: width و XrExtent2Di :: height از recommendedImageExtent باید همیشه عدد صحیح مثبتی کمتر از یا مساوی با XrViewConfigurationView :: recommendedImageRectWidth و XrViewConfigurationView :: recommendedImageRectHeight از XrViewConfigurationView برای پیکربندی نمای اصلی محفظه فضایی باشد. برنامه نباید زنجیره تعویض را صرفاً به‌دلیل تغییر recommendedImageExtent بازسازی کند، زیرا این یک اشاره پویا به برنامه است که XrSwapchainSubImage :: imageRect را برای استفاده در XrSwapchainSubImage هر لایه ترکیب‌بندی با وضوح کامل که ارسال می‌کند مشخص می‌کند و می‌تواند در هر فریم تغییر کند.

استفاده معتبر (ضمنی)

مشاهده فضای مرجع

فضای مرجع نما بدون تغییر باقی می‌ماند، همان‌طور که در هسته OpenXR است. همانند هسته، برای استفاده در پردازش درنظر گرفته نشده است.

ارسال لایه‌ها ازطریق 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 اعمال خواهد شد.

وقتی این ساختار با زنجیر شدن به 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;

شرح عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است.
  • ‫spatialContainer XrSpatialContainerEXT است که محفظه هدف را شناسایی می‌کند.
  • ‫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 را برگرداند.

استفاده معتبر (ضمنی)

مشخص کردن پیکربندی نما برای لایه‌های طرح‌افکنی

ساختار XrSpatialContainerCompositionLayerViewConfigurationEXT برای مشخص کردن پیکربندی نمای استفاده‌شده برای رندر کردن لایه پخش محتوا برای محفظه فضایی استفاده می‌شود.

typedef struct XrSpatialContainerCompositionLayerViewConfigurationEXT {
    XrStructureType            type;
    const void*                next;
    XrViewConfigurationType    viewConfigurationType;
} XrSpatialContainerCompositionLayerViewConfigurationEXT;

شرح عضو

هنگام ارسال XrCompositionLayerProjection برای محفظه فضایی، برنامه باید مشخص کند که از کدام پیکربندی نما برای رندر کردن لایه استفاده شده است. این کار ضروری است زیرا برنامه می‌تواند برای هر فریم انتخاب کند که با پیکربندی نمای اصلی محفظه فضایی رندر شود یا با پیکربندی نمای تضعیف‌شده پیشنهادی زمان اجرا (درصورت وجود).

وقتی XrSpatialContainerCompositionLayerViewConfigurationEXT زنجیره‌ای باشد، برنامه باید مطمئن شود که XrCompositionLayerProjection :: viewCount شمار بازدید معتبری برای XrViewConfigurationType مشخص‌شده در ساختار زنجیره‌ای است. viewConfigurationType مشخص‌شده در ساختار زنجیره‌ای باید XrSpatialContainerBeginInfoEXT :: primaryViewConfigurationType مشخص‌شده هنگام شروع محفظه، یا نوع پیکربندی نمای زوال‌یافته برگردانده‌شده توسط زمان اجرا در XrSpatialContainerViewStateEXT ، یا مقادیر اضافی فعال‌شده ازطریق افزونه باشد.

استفاده معتبر (ضمنی)

رفتار برش Pixel

برنامه‌ها باید با زنجیره‌ای کردن 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_EXTENSION_NAME
  • XR_EXT_spatial_container_self_rendering_SPEC_VERSION
  • درحال گسترش دادن XrResult :

    • XR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXT
    • XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • درحال گسترش دادن XrSpatialContainerGraphicsPresentationEXT :

    • XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
  • درحال گسترش دادن XrStructureType :

    • XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXT
    • XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_FRAME_END_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXT
    • XR_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)

    • شرح اولیه افزونه