XR_EXT_spatial_container_self_rendering

Name String

XR_EXT_spatial_container_self_rendering

Uzantı Türü

Örnek uzantısı

Kayıtlı Dahili Numara

814

Düzeltme

1

Onay Durumu

Onaylanmadı

Uzantı ve Sürüm Bağımlılıkları

XR_EXT_spatial_container

Son Değiştirilme Tarihi

2026-08-06

IP Durumu

Bilinen bir fikri mülkiyet hak talebi yok.

Katkıda bulunanlar

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

Genel Bakış

Bu uzantı, uzamsal kapsayıcılar için "kendi kendine oluşturma"yı tanımlar. Kendi kendine oluşturulan bir uzamsal kapsayıcının piksellerinin tamamı bir uygulama tarafından oluşturulur ve standart OpenXR takas zincirleri ile oluşturma katmanları kullanılarak çalışma zamanına gönderilir. Üç boyutlu kapsayıcılar her zaman ekranın tüm piksellerini kaplamadığından çalışma zamanı, uygulamaların daha verimli bir şekilde oluşturulmasını sağlamak için her üç boyutlu kapsayıcının önerilen çözünürlüğünü ve görünüm yapılandırmasını uygulamalara bildirir.

XR_EXT_spatial_container ile birleştirilen bu uzantı, geleneksel OpenXR 1.x temel kompozisyon katmanı oluşturma özelliklerinin bir üst kümesini sunmayı amaçlar. Grafik oluşturmayı ve bu uzantıyı destekleyen OpenXR 1.x çalışma zamanları, çevreleyici uzamsal kapsayıcıları desteklediklerini belirtmek için XrSystemSpatialContainerPropertiesEXT :: supportsImmersive değerini true olarak ayarlamalıdır (must).

Uzamsal kapsayıcı oluşturma yaşam döngüsü

Bir uygulama, uzamsal kapsayıcı için kendi kendine oluşturma özelliğini kullanmak istiyorsa xrCreateSpatialContainerEXT işlevini çağırırken XrSpatialContainerCreateInfoEXT :: graphicsPresentation değerini XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT olarak ayarlar. Ardından bu uygulama, xrBeginSpatialContainerRenderingEXT ve xrEndSpatialContainerRenderingEXT işlevlerini çağırarak bir uzamsal kapsayıcının etkin bir şekilde oluşturulup oluşturulmadığını yönetebilir. Bu işlevler, xrBeginSession ve xrEndSession'ın yerini alır. xrBeginFrame ve xrEndFrame gibi kare başına işlemler değildir.

Her karede bir uygulama aşağıdaki adımlardan geçer:

  • xrWaitFrame ve xrBeginFrame'i çağırın. Bu işlevlerin kapsayıcıya özgü yapıları yoktur ve temel spesifikasyondaki gibi çalışırlar.
  • xrLocateSpatialContainerViewsEXT ile aktif olarak oluşturulan tüm uzamsal kapsayıcılar için görünüm pozlarını, projeksiyon parametrelerini ve oluşturma önerilerini alın. Çalışma zamanı, her uzamsal kapsayıcı için oluşturma katmanlarının oluşturulması gerekip gerekmediğini ve katmanları oluşturmanın önerilen yolunu XrSpatialContainerViewStateEXT'yi doldurarak bildirir.
  • Pikselleri normal şekilde kompozisyon katmanlarına dönüştürün. Bu işlemlerin kapsayıcıya özgü yapıları yoktur.
  • xrEndFrame'i çağırıp XrSpatialContainerLayerFrameEndInfoEXT'yi zincirleyerek etkin bir şekilde oluşturulan tüm uzamsal kapsayıcılar için kompozisyon katmanları gönderin.

Bir XrSpatialContainerEXT herkese açık anahtarını yok etmek, onu etkin oluşturma grubundan dolaylı olarak kaldırır. Bir uygulama, xrEndSpatialContainerRenderingEXT ile ilişkili olmayan xrBeginSpatialContainerRenderingEXT çağrısını başarıyla yapmış olsa bile uzamsal kapsayıcıyı yok edebilir. Çalışma zamanı, xrDestroySpatialContainerEXT'nin uygulanmasının başlarında gerekirse xrEndSpatialContainerRenderingEXT dolaylı olarak çağrılmış gibi davranmalı ve başarılı bir şekilde döndürülmelidir.

Bir uygulama, etkin oluşturma kümesindeki bir kapsayıcı için XrEventDataSpatialContainerClosedEXT etkinliği aldığında xrEndSpatialContainerRenderingEXT'yi çağırmalı ve XrSpatialContainerEXT tutma yerini yok etmelidir.

xrBeginSpatialContainerRenderingEXT işlevi, uzamsal kapsayıcıyı oturum başına etkin oluşturma grubuna ekler. Böylece uygulama, uzamsal kapsayıcı için oluşturma katmanlarını xrEndFrame'e gönderebilir.

XrResult xrBeginSpatialContainerRenderingEXT(
    XrSession                                   session,
    const XrSpatialContainerBeginInfoEXT*       beginInfo);

Parametre Açıklamaları

Uygulamalar genellikle bunu, XrEventDataSpatialContainerVisibleChangedEXT :: visible değerinin doğru olarak ayarlandığı bir görünürlük değişikliği etkinliğine yanıt olarak çağırır.

xrCreateSpatialContainerEXT çağrılırken uzamsal kapsayıcı XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT ile oluşturulmadıysa çalışma zamanı XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT değerini döndürmelidir.

Uzamsal kapsayıcı zaten etkin oluşturma kümesindeyse çalışma zamanı XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT değerini döndürmelidir (must).

xrBeginSpatialContainerRenderingEXT, uygulamanın xrWaitFrame'i çağıramadığı bir zamanda (ör. xrBeginFrame ve xrEndFrame penceresinin içinde) çağrılırsa çalışma zamanı XR_ERROR_CALL_ORDER_INVALID değerini döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

İleti Dizisi Güvenliği

Dönüş Kodları

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

  • 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 yapısı, uzamsal kapsayıcının oluşturulmaya başlanmasıyla ilgili parametreleri belirtmek için kullanılır.

typedef struct XrSpatialContainerBeginInfoEXT {
    XrStructureType            type;
    const void*                next;
    XrSpatialContainerEXT      spatialContainer;
    XrViewConfigurationType    primaryViewConfigurationType;
} XrSpatialContainerBeginInfoEXT;

Üye Açıklaması

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • spatialContainer, oluşturmaya başlanacak XrSpatialContainerEXT'dir.
  • primaryViewConfigurationType, uzamsal kapsayıcı için kullanılacak birincil XrViewConfigurationType'tır.

primaryViewConfigurationType, uygulamanın oluşturma sırasında kullanmayı amaçladığı görünüm yapılandırmasıdır. Çalışma zamanı, optimizasyon amacıyla görünüm yapılandırmasını daha az görünüme sahip bir türe düşürebilir (ör. bir kapsayıcı çok uzakta ve küçüktür, bu nedenle stereo algılanamaz). Çalışma zamanı, xrLocateSpatialContainerViewsEXT çağrılarından eski görünüm yapılandırmasıyla ilgili ayrıntıları döndürür.

Geçerli Kullanım (Dolaylı)

xrEndSpatialContainerRenderingEXT işlevi, uzamsal kapsayıcıyı etkin oluşturma grubundan kaldırır.

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

Parametre Açıklamaları

Uygulamalar genellikle bunu, XrEventDataSpatialContainerVisibleChangedEXT :: visible değeri false olarak ayarlanmış bir görünürlük değişikliği etkinliğine yanıt olarak çağırır.

Uzamsal kapsayıcı etkin oluşturma grubunda değilse çalışma zamanı XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT değerini döndürmelidir (must).

xrEndSpatialContainerRenderingEXT, uygulamanın xrWaitFrame'i çağıramadığı bir zamanda (ör. xrBeginFrame ve xrEndFrame çağrıları arasındaki dönemde) çağrılırsa çalışma zamanı XR_ERROR_CALL_ORDER_INVALID değerini döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

İleti Dizisi Güvenliği

Dönüş Kodları

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

  • 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 yapısı, uzamsal kapsayıcının oluşturulmasını sonlandırma parametrelerini belirtmek için kullanılır.

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

Üye Açıklaması

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • spatialContainer, oluşturma işlemini sonlandıracak XrSpatialContainerEXT'dir.

Geçerli Kullanım (Dolaylı)

xrLocateSpatialContainerViewsEXT aracılığıyla görünümleri bulma

xrLocateSpatialContainerViewsEXT işlevi, bir dizi uzamsal kapsayıcının görünümlerini bulur.

XrResult xrLocateSpatialContainerViewsEXT(
    XrSession                                   session,
    const XrSpatialContainerViewsLocateInfoEXT* locateInfo,
    uint32_t                                    viewStateCount,
    XrSpatialContainerViewStateEXT*             viewStates,
    uint32_t                                    viewCount,
    XrView*                                     views);

Parametre Açıklamaları

Bu işlev, xrLocateViews'un yerini alır ve bir uygulamanın aynı anda birden fazla uzamsal kapsayıcı için görünümleri sorgulamasına olanak tanır.

Tüm uzamsal kapsayıcıların görünümleri tek bir views dizisinde döndürülür. Görünümler, XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos dizisindeki üç boyutlu kapsayıcının dizinine ve ardından bu kapsayıcının görünüm dizinine göre sıralanır.

Örneğin, bir uygulama XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos içinde üç uzamsal kapsayıcı sağlıyorsa:

  • Dizin 0: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO (1 görüntüleme)
  • Dizin 1: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO (2 görüntüleme)
  • Dizin 2: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO_WITH_FOVEATED_INSET (4 görüntüleme)

Ardından çalışma zamanı, views dizisini 7 görünümle doldurmalıdır:

  • views [0], 0 numaralı kapsayıcının görünümüdür.
  • views [1], 1. kapsayıcının sol göz görünümüdür.
  • views [2], 1. kapsayıcı için sağ göz görünümüdür.
  • views [3], 2. kapsayıcı için sol göz görünümüdür.
  • views [4], 2. kapsayıcının sağ göz görünümüdür.
  • views [5], 2. kapsayıcı için sol göz iç içe yerleştirilmiş görünümüdür.
  • views [6], 2. kapsayıcı için sağ göz iç içe yerleştirilmiş görünümüdür.

viewCount, her bir uzamsal kapsayıcının istenen görünüm yapılandırması türü için görüntüleme sayılarının toplamına eşit değilse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir (must).

Çalışma zamanı, optimizasyon amacıyla görünüm yapılandırmasını daha az görünüme sahip bir türe dönüştürebilir (ör. bir kapsayıcı çok uzakta ve küçüktür, bu nedenle stereo algılanamaz). Çalışma zamanı, görünüm yapılandırmasını bozarsa çalışma zamanı, söz konusu kapsayıcı için orijinal görünüm sayısını döndürmeye devam etmeli ve ek görünümleri, bozulan görünümlerin kopyalarıyla doldurmalıdır. Örneğin, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO değerine düşürülürse hem dizin 0 hem de dizin 1 tek mono görünümü içerir. Bu nedenle, views dizisinde döndürülen toplam görünüm sayısı, çalışma zamanının herhangi bir görünüm yapılandırmasını silmeye karar verip vermediğinden bağımsızdır.

Çalışma zamanı, döndürülen her XrView :: fov öğesini, kesik piramit mümkün olduğunca küçük olacak ve ilgili uzamsal kapsayıcının tüm sınırlarını içerecek şekilde uyarlamalıdır. Çalışma zamanları, simetrik olmayan FOV'ler döndürebilir. Örneğin, bir uzamsal kapsayıcı kullanıcının görüş açısına göre eğik bir açıdaysa veya başka bir nesne tarafından kısmen engelleniyorsa. Çalışma zamanları, uzamsal kapsayıcı için hedef oluşturma yüzeyini serbestçe konumlandırabilir. Üç boyutlu kapsayıcıların kullanıcıdan ayrıldığı çoklu uygulama oluşturma özelliğinin doğası gereği, çalışma zamanı piksel oluşturmaya uygun olmayan XrView değerleri döndürebilir. Örneğin, üç boyutlu kapsayıcı ekranda görünmüyorsa XrView :: fov için ayarlanacak geçerli değer yoktur. Bu gibi durumlarda çalışma zamanları, XrSpatialContainerViewStateEXT :: shouldSubmitLayers değerini false olarak ayarlamalıdır.

Çalışma zamanı, viewStates dizisinde her uzamsal kapsayıcı için ek oluşturma durumu bilgileri döndürür. viewStateCount, XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfoCount değerine eşit değilse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.

Çalışma zamanı, bir uzamsal kapsayıcı için XrEventDataSpatialContainerClosedEXT etkinliğini sıraya aldıktan sonra bu işlev, ilgili uzamsal kapsayıcı için XrSpatialContainerViewStateEXT :: shouldSubmitLayers içinde XR_FALSE ve XrSpatialContainerViewStateEXT :: viewStateFlags içinde 0 değerini döndürmelidir.

Gerçek dünyada aktif olarak değişen konumlara sahip uzamsal kapsayıcılar için çalışma zamanı, yeniden projeksiyon kusurlarını en aza indirmek amacıyla views değerini doldururken kapsayıcının hareketini hesaba katmalıdır.

xrLocateSpatialContainerViewsEXT, şu anda etkin oluşturma grubunda olmayan bir veya daha fazla uzamsal kapsayıcı için çağrılırsa çalışma zamanı XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

  • XR_EXT_spatial_container_self_rendering uzantısı, xrLocateSpatialContainerViewsEXT çağrılmadan önce etkinleştirilmiş olmalıdır.
  • session geçerli bir XrSession herkese açık kullanıcı adı olmalıdır
  • locateInfo, geçerli bir XrSpatialContainerViewsLocateInfoEXT yapısına işaret eden bir işaretçi olmalıdır.
  • viewStates, viewStateCount XrSpatialContainerViewStateEXT yapılarından oluşan bir dizinin işaretçisi olmalıdır
  • views, viewCount XrView yapılarından oluşan bir dizinin işaretçisi olmalıdır.
  • viewStateCount parametresi 0 değerinden büyük olmalıdır.
  • viewCount parametresi 0 değerinden büyük olmalıdır.

Dönüş Kodları

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

  • 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 yapısı, bir uzamsal kapsayıcı koleksiyonundaki görünümleri bulmak için gereken parametreleri içerir.

typedef struct XrSpatialContainerViewsLocateInfoEXT {
    XrStructureType                               type;
    const void*                                   next;
    XrTime                                        displayTime;
    uint32_t                                      viewLocateInfoCount;
    const XrSpatialContainerViewLocateInfoEXT*    viewLocateInfos;
} XrSpatialContainerViewsLocateInfoEXT;

Üye Açıklaması

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • displayTime, görünümlerin bulunacağı XrTime değeridir.
  • viewLocateInfoCount, viewLocateInfos dizisindeki girişlerin sayısıdır.
  • viewLocateInfos, XrSpatialContainerViewLocateInfoEXT yapılarından oluşan bir dizinin işaretçisidir.

Geçerli Kullanım (Dolaylı)

XrSpatialContainerViewLocateInfoEXT yapısı, görünümlerini bulmak için tek bir uzamsal kapsayıcının parametrelerini içerir.

typedef struct XrSpatialContainerViewLocateInfoEXT {
    XrStructureType            type;
    const void*                next;
    XrViewConfigurationType    viewConfigurationType;
    XrSpace                    space;
    XrSpatialContainerEXT      spatialContainer;
} XrSpatialContainerViewLocateInfoEXT;

Üye Açıklaması

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • viewConfigurationType, uzamsal kapsayıcı için kullanılacak bir XrViewConfigurationType'tır.
  • space, uzamsal kapsayıcının görünümlerinin bulunduğu XrSpace'tir.
  • spatialContainer, XrSpatialContainerEXT herkese açık kullanıcı adıdır.

Uygulama, space içinde geçerli herhangi bir XrSpace sağlayabilir ancak XrSpatialContainerViewLocateInfoEXT yapısında belirtilen ilgili XrSpatialContainerEXT için uzamsal kapsayıcı alanını sağlaması önerilir.

Geçerli Kullanım (Dolaylı)

XrSpatialContainerViewStateEXT yapısı, her uzamsal kapsayıcı için oluşturma uygunluğu bilgileriyle xrLocateSpatialContainerViewsEXT çağrıları tarafından doldurulur.

typedef struct XrSpatialContainerViewStateEXT {
    XrStructureType            type;
    void*                      next;
    XrViewStateFlags           viewStateFlags;
    XrViewConfigurationType    viewConfigurationType;
    XrBool32                   shouldSubmitLayers;
    XrExtent2Di                recommendedImageExtent;
} XrSpatialContainerViewStateEXT;

Üye Açıklaması

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • viewStateFlags, XrViewStateFlags'in bit maskesidir. Bu işaretler, temel XrViewState yapısındaki viewStateFlags ile aynı amaca sahiptir.
  • viewConfigurationType, çalışma zamanının uzamsal kapsayıcı için kullandığı görünüm yapılandırma türünü belirten bir XrViewConfigurationType'tır. Çalışma zamanları, istenenden daha az sayıda görünüme sahip bir görünüm yapılandırmasına düşebilir.
  • shouldSubmitLayers, çalışma zamanı tarafından döndürülen bir XrBool32 değeridir. XR_FALSE ise uygulama, şu anda görünür olmadığı veya oluşturma işleminin gerekli olmadığı bir durumda olduğu için bu uzamsal kapsayıcıya oluşturma göndermekten kaçınmalıdır.
  • recommendedImageExtent, uzamsal kapsayıcı için önerilen çözünürlüğü temsil eden bir XrExtent2Di yapısıdır.

Temel OpenXR görünüm konumunda olduğu gibi, uygulama, oluşturma için görünüm verilerini kullanmadan önce konum ve yönün geçerli ve izlendiğinden emin olmak için XrSpatialContainerViewStateEXT :: viewStateFlags değerini kontrol etmelidir.

Uygulama, çalışma zamanının önerdiğinden daha fazla öğe oluşturmamak için shouldSubmitLayers ve viewConfigurationType değerlerini kontrol etmelidir. shouldSubmitLayers değeri false olduğunda uygulama, oluşturma davranışını aşağıdaki gibi değiştirir:

  • Uygulama, ilgili XrView :: fov değerini okumamalıdır .
  • Uygulama recommendedImageExtent değerini okumamalıdır.
  • Uygulama, ilgili uzamsal kapsayıcı için takas zincirlerine görüntü oluşturmaktan ve oluşturma katmanları göndermekten kaçınmalıdır.
  • Uygulama, XrSpatialContainerLayerEXT :: retainPreviousSubmission değerini true olarak ayarlamalıdır. Uygulama yine de katmanları göndermeyi seçerse katmanlarla ne yapmak istediğini belirlemek çalışma zamanına bağlıdır (ör. çalışma zamanı bunları bırakmayı seçebilir).

recommendedImageExtent, kapsayıcı konumuna veya kullanıcının görünümüne göre güncellenecek katmanlar için özel olarak kullanılır. Uygulama, katmanları uzamsal kapsayıcının konumuna veya kullanıcının görünümüne bağlı içerikle (normal 3D içerik gibi) güncellerken varsayılan önerilen görünüm boyutu yerine bu daha küçük görüntü alanına oluşturma işlemi yapmalıdır. Uygulama, uzamsal kapsayıcının konumuna veya kullanıcının görünümüne bağlı olmayan içeriklere sahip katmanları (ör. statik dörtlü katmanlar) güncellerken bu değerleri güvenli bir şekilde yoksayabilir. Görünüme bağlı katmanlar için recommendedImageExtent, örtüşmeyi en aza indirmeyi ve oluşturma performansını iyileştirmeyi amaçlayan çalışma zamanından uygulamaya yönelik bir öneridir. Uygulama, dilerse tam çözünürlükte gönderebilir.

recommendedImageExtent öğesinin XrExtent2Di :: width ve XrExtent2Di :: height değerleri, her zaman uzamsal kapsayıcının birincil görünüm yapılandırması için XrViewConfigurationView öğesinin XrViewConfigurationView :: recommendedImageRectWidth ve XrViewConfigurationView :: recommendedImageRectHeight değerlerinden küçük veya bunlara eşit pozitif bir tam sayı olmalıdır. Uygulama, yalnızca recommendedImageExtent değiştiği için bir swapchain'i yeniden oluşturmamalıdır (should). Bu, gönderdiği tam çözünürlüklü kompozisyon katmanlarının XrSwapchainSubImage'inde kullanılacak XrSwapchainSubImage :: imageRect değerini belirten dinamik bir ipucudur ve her karede değişebilir (can).

Geçerli Kullanım (Dolaylı)

Referans alanını görüntüleme

Görünüm referans alanı, OpenXR çekirdeğinde olduğu gibi değişmeden kalır. Çekirdekte olduğu gibi, oluşturma amaçlı değildir.

xrEndFrame aracılığıyla katman gönderme

Uygulama, uzamsal kapsayıcıları oluşturmak için xrEndFrame'e ilgili uzamsal kapsayıcılarıyla ilişkili katmanların listesini sağlamalıdır. Bu işlem, XrSpatialContainerLayerFrameEndInfoEXT yapısı aracılığıyla gerçekleştirilir.

typedef struct XrSpatialContainerLayerFrameEndInfoEXT {
    XrStructureType                      type;
    const void*                          next;
    uint32_t                             containerLayerCount;
    const XrSpatialContainerLayerEXT*    containerLayers;
} XrSpatialContainerLayerFrameEndInfoEXT;

Üye Açıklaması

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • containerLayerCount, containerLayers dizisindeki öğelerin sayısıdır.
  • containerLayers, XrSpatialContainerLayerEXT yapılarından oluşan bir dizinin işaretçisidir.

containerLayers dizisi, etkin oluşturma grubundaki her uzamsal kapsayıcı için bir XrSpatialContainerLayerEXT içerir (kapsayıcılar, oturum başına xrBeginSpatialContainerRenderingEXT ve xrEndSpatialContainerRenderingEXT tarafından yönetilir). Her XrSpatialContainerLayerEXT, belirli uzamsal kapsayıcıyla ilişkili XrCompositionLayerBaseHeader işaretçilerinin listesini içerir. Çalışma zamanları, containerLayers sırasından bağımsız olarak seçtikleri herhangi bir sırada kapsayıcıları birleştirebilir. Örneğin, çalışma zamanları, kapsayıcıları kullanıcıya göre derinliklerine göre birleştirebilir, uzamsal bir kapsayıcının arka plan katmanı olarak davranmasını sağlayabilir veya uzamsal bir kapsayıcıyı derinliğinden bağımsız olarak her zaman en üstte olacak şekilde "sabitleyebilir". Çalışma zamanları, sınırlı veya yoğun içerik modlarında uzamsal kapsayıcılar için farklı stratejiler kullanarak katmanları birleştirebilir. Örneğin, çalışma zamanları, her sınırlı uzamsal kapsayıcının oluşturma katmanlarını, ikinci bir oluşturma adımında diğer tüm kapsayıcılarla birleştirilen tek bir stereo dörtlü katman halinde önceden birleştirebilir.

XrFrameEndInfo :: displayTime ve XrFrameEndInfo :: environmentBlendMode, XrSpatialContainerLayerFrameEndInfoEXT içinde sağlanan tüm uzamsal kapsayıcılara uygulanır.

Bu yapı, XrFrameEndInfo'ya zincirlenerek xrEndFrame'e iletildiğinde etkin oluşturma grubuna göre aşağıdaki ek hata durumları eklenir:

  • Bir uzamsal kapsayıcıya birden fazla containerLayers öğesi tarafından referans veriliyorsa çalışma zamanları XR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXT değerini döndürmelidir .
  • Etkin oluşturma kümesindeki bir uzamsal kapsayıcıya containerLayers öğesi tarafından referans verilmiyorsa çalışma zamanları XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT değerini döndürmelidir (must).
  • containerLayers tarafından referans verilen bir uzamsal kapsayıcı, etkin oluşturma grubunun üyesi değilse çalışma zamanları XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT değerini döndürmelidir (must).

Ayrıca, etkin oluşturma kümesinde uzamsal kapsayıcılar varsa ve bu yapı XrFrameEndInfo'ya bağlı değilse çalışma zamanları XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT değerini döndürmelidir (must).

Yukarıdaki hata durumlarından herhangi birinde, çalışma zamanı herhangi bir uzamsal kapsayıcı için içerik oluşturmamalıdır.

Etkin oluşturma grubunda uzamsal kapsayıcı yoksa uygulama, herhangi bir oluşturma katmanı göndermediği sürece xrEndFrame'i çağırabilir.

Bağımsız takas zincirlerinin, geçerli bir yapıdaki katmanlar aracılığıyla birden fazla kapsayıcı için gönderilebileceğini unutmayın. Örneğin, birden fazla uzamsal kapsayıcıya gönderilen tek bir takas zinciri aracılığıyla oluşturulan dörtlü katman. Bu durum, diğer oluşturma işlemleriyle aynı şekilde ele alınır: Çalışma zamanı, bu tür tüm uzamsal kapsayıcılarda dörtgeni oluşturmalıdır.

Geçerli Kullanım (Dolaylı)

XrSpatialContainerLayerEXT yapısı, standart oluşturma katmanlarını gruplandırır ve bunları belirli bir uzamsal kapsayıcıyla ilişkilendirir.

typedef struct XrSpatialContainerLayerEXT {
    XrStructureType                               type;
    const void*                                   next;
    XrSpatialContainerEXT                         spatialContainer;
    XrBool32                                      retainPreviousSubmission;
    uint32_t                                      layerCount;
    const XrCompositionLayerBaseHeader* const*    layers;
} XrSpatialContainerLayerEXT;

Üye Açıklaması

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • spatialContainer, hedef kapsayıcıyı tanımlayan XrSpatialContainerEXT'dir.
  • retainPreviousSubmission, XrBool32 . XR_TRUE ise çalışma zamanı, bu uzamsal kapsayıcı için gönderilen son kareyi korur.
  • layerCount, layers dizisindeki kompozisyon katmanlarının sayısıdır.
  • layers, XrCompositionLayerBaseHeader işaretçileri dizisine işaret eder.

retainPreviousSubmission, XR_TRUE olduğunda çalışma zamanı, retainPreviousSubmission'nin XR_FALSE olduğu en son xrEndFrame çağrısı sırasında kilitlendiği şekilde oluşturma katmanlarını ve swapchain resim içeriklerini yeniden kullanmalıdır. Kalan katmanlar tarafından kullanılan takas zincirlerinde yapılan sonraki değişiklikler, oluşturulan çıkışa yansıtılmamalıdır.

Tek bir uzamsal kapsayıcı için gönderilen katmanlarda (kapsayıcı içi oluşturma), çalışma zamanı, katman oluşturma sıralaması için önceden belirtilen kurallara uymalıdır. Yani, kapsayıcıların içindeki katmanlar, belirtildikleri sırayla çizilmeli ve ressam algoritması aracılığıyla oluşturulmalıdır.

Uzamsal kapsayıcıyı "temizleme", uzamsal kapsayıcıdaki tüm içeriğin kaldırılmasını ifade eder. Bu işlem, mevcut karede söz konusu kapsayıcı için hiçbir şeyin oluşturulmamasına neden olur. Çalışma zamanları, bunu uygulamanın kapsayıcı içindeki her piksel için şeffaf siyah (tüm bitler 0) göndermesine eşdeğer olarak değerlendirmelidir. Uzamsal kapsayıcıyı "tutma", çalışma zamanının söz konusu kapsayıcı için en son gönderilen katman grubunu göstermeye devam etmesini ifade eder.

Uygulama, her uzamsal kapsayıcı için yeni katmanlar göndermeyi, önceki gönderimi korumayı veya uzamsal kapsayıcıyı temizlemeyi seçebilir:

  • Yeni katmanlar göndermek için uygulama, sıfır olmayan bir layerCount ve geçerli bir layers işaretçisi sağlar.
  • Bir uzamsal kapsayıcıyı temizlemek için girişinin layerCount değeri 0 olmalı ve retainPreviousSubmission değeri XR_FALSE olmalıdır.
  • Gönderilen son katmanları ve swapchain görüntülerini korumak için (koruma) girişinin layerCount değeri 0 olmalı ve retainPreviousSubmission değeri XR_TRUE olmalıdır.

Kapsayıcı başına yapılan bu açık kontrol, uygulamanın amacının her karede net bir şekilde iletilmesini sağlar.

retainPreviousSubmission, XR_TRUE ise ve layerCount 0 değilse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir (must).

XrSpatialContainerCompositionLayerViewConfigurationEXT, uzamsal kapsayıcının parçası olan bir XrCompositionLayerProjection'a bağlı değilse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir. Bu yapı yalnızca XrCompositionLayerProjection katmanları için geçerlidir. Diğer katman türlerine (ör. dörtgen veya silindir katmanlar) zincirlenmişse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

Yansıtma Katmanları İçin Görünüm Yapılandırmasını Belirtme

XrSpatialContainerCompositionLayerViewConfigurationEXT yapısı, uzamsal kapsayıcı için projeksiyon katmanı oluşturmak amacıyla kullanılan görünüm yapılandırmasını belirtmek için kullanılır.

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

Üye Açıklaması

Uygulama, uzamsal kapsayıcı için XrCompositionLayerProjection gönderirken katmanı oluşturmak için hangi görünüm yapılandırmasının kullanıldığını belirtmelidir. Uygulama, her kareyi uzamsal kapsayıcının birincil görünüm yapılandırmasıyla mı yoksa çalışma zamanının önerilen bozulmuş görünüm yapılandırmasıyla mı (varsa) oluşturacağını seçebileceğinden bu gereklidir.

XrSpatialContainerCompositionLayerViewConfigurationEXT zincirlendiğinde uygulama, XrCompositionLayerProjection :: viewCount değerinin, zincirlenmiş yapıda belirtilen XrViewConfigurationType için geçerli bir görüntüleme sayısı olmasını sağlamalıdır. Zincirleme yapıda belirtilen viewConfigurationType, kapsayıcı başlatılırken belirtilen XrSpatialContainerBeginInfoEXT :: primaryViewConfigurationType, çalışma zamanı tarafından XrSpatialContainerViewStateEXT içinde döndürülen bozulmuş görünüm yapılandırma türü veya bir uzantı aracılığıyla etkinleştirilen ek değerler olmalıdır.

Geçerli Kullanım (Dolaylı)

Piksel kırpma davranışı

Uygulamalar, oluşturma katmanlarını gönderirken XrSpatialContainerLayerVolumeClippingEXT'yi zincirleyerek pikselleri uzamsal kapsayıcı sınırlarının dışında oluşturup oluşturmadıklarını çalışma zamanına bildirmelidir (should).

typedef struct XrSpatialContainerLayerVolumeClippingEXT {
    XrStructureType                        type;
    const void*                            next;
    XrSpatialContainerVolumeClippingEXT    volumeClipping;
} XrSpatialContainerLayerVolumeClippingEXT;

Üye Açıklaması

Bu yapı, uygulamanın pikselleri uzamsal kapsayıcının sınırları dışında oluşturup oluşturmadığına dair bir ipucu görevi görür. Üç boyutlu kapsayıcı yoğun içerik modundayken sınırlar sonsuz olduğundan bu ipucunun bir anlamı yoktur.

Kendi kendine oluşturma kullanan sınırlı uzamsal kapsayıcılar için çalışma zamanının hem 3D hacim sınırları hem de 2D piksel sınırları hakkında bilgi sahibi olması gerekir. 3D hacim sınırları xrGetSpatialContainerBoundsEXT'ten döndürülür. 2D piksel sınırları, 3D hacim sınırlarının sistem için her ekrana yansıtılmasıdır.

Çalışma zamanları, 2D piksel sınırlarının dışındaki takas zinciri resimlerinden pikselleri atmalıdır. Ancak çalışma zamanları, 2D piksel sınırlarının içinde ancak 3D hacim sınırlarının dışında olan pikselleri atmamalıdır. İçeriğin, kapsayıcının 3D hacim sınırlarının ötesine veya önüne uzandığı stereo efektler mümkündür. Uygulamalar, derinlik paradokslarını azaltmak için sınırlı bir uzamsal kapsayıcının 3D hacim sınırlarının dışındaki pikselleri silebilir ve bunu nasıl yaptıklarına bağlı olarak volumeClipping değerini ayarlamalıdır. Derinlik paradoksları genellikle göz yorgunluğuna ve kullanıcıların rahatsız olmasına neden olur.

Çalışma zamanları, belirli bir uzamsal kapsayıcıyı nasıl göstereceklerini ayarlamak için volumeClipping kullanabilir. Örneğin, XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT olarak ayarlandığında çalışma zamanı, 3D hacim sınırlarının arka yüzlerini oluşturabilir. Bu durum, uzamsal kapsayıcı kapsayıcının 3D hacim sınırlarının arkasında piksel çizerse derinlik paradokslarına neden olabilir.

Gelecekteki uzantılar, derinlik bilgileri gönderilirse 3D hacim sınırlarına göre kırpmaya izin verebilir.

Geçerli Kullanım (Dolaylı)

Yeni Komutlar

Yeni Yapılar

Yeni Enum Sabitleri

  • XR_EXT_SPATIAL_CONTAINER_SELF_RENDERING_EXTENSION_NAME
  • XR_EXT_spatial_container_self_rendering_SPEC_VERSION
  • XrResult'ı genişletme:

    • 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'yi genişletme:

    • XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
  • XrStructureType'ı genişletme:

    • 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

Kod Örnekleri

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

Sürüm Geçmişi

  • Düzeltme 1, 06.08.2026 (Lachlan Ford)

    • İlk uzantı açıklaması