XR_EXT_spatial_container_self_rendering

Name String

XR_EXT_spatial_container_self_rendering

Loại tiện ích

Phần mở rộng thực thể

Số máy lẻ đã đăng ký

814

Bản sửa đổi

1

Trạng thái phê chuẩn

Chưa được phê chuẩn

Phần phụ thuộc của tiện ích và phiên bản

XR_EXT_spatial_container

Ngày sửa đổi gần đây nhất

2026-08-06

Trạng thái IP

Không có tuyên bố nào về tài sản trí tuệ.

Cộng tác viên

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

Tổng quan

Phần mở rộng này xác định "tự kết xuất" cho vùng chứa không gian. Tất cả pixel của vùng chứa không gian tự kết xuất đều do một ứng dụng tạo và gửi đến thời gian chạy bằng cách sử dụng chuỗi hoán đổi OpenXR và lớp kết hợp tiêu chuẩn. Vì vùng chứa không gian không phải lúc nào cũng chiếm tất cả pixel của màn hình, nên thời gian chạy sẽ thông báo cho ứng dụng về độ phân giải và cấu hình khung hiển thị được đề xuất của từng vùng chứa không gian để cho phép ứng dụng kết xuất hiệu quả hơn.

Tiện ích này kết hợp với XR_EXT_spatial_container nhằm cung cấp một tập hợp lớn hơn các chức năng của tính năng kết xuất lớp kết hợp cốt lõi OpenXR 1.x thông thường. Môi trường thời gian chạy OpenXR 1.x hỗ trợ kết xuất đồ hoạ và tiện ích này phải đặt XrSystemSpatialContainerPropertiesEXT :: supportsImmersive thành true để cho biết rằng các môi trường này hỗ trợ vùng chứa không gian sống động.

Vòng đời kết xuất vùng chứa không gian

Để sử dụng tính năng tự kết xuất cho vùng chứa không gian, ứng dụng sẽ đặt XrSpatialContainerCreateInfoEXT :: graphicsPresentation thành XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT khi gọi xrCreateSpatialContainerEXT . Sau đó, ứng dụng đó có thể quản lý xem vùng chứa không gian có đang hiển thị hay không bằng cách gọi các hàm xrBeginSpatialContainerRenderingEXT và xrEndSpatialContainerRenderingEXT. Các hàm này thay thế xrBeginSession và xrEndSession . Đây không phải là các thao tác theo từng khung hình, chẳng hạn như xrBeginFrame và xrEndFrame .

Mỗi khung hình, ứng dụng sẽ trải qua các bước sau:

  • Gọi xrWaitFrame và xrBeginFrame . Các hàm này không có cấu trúc dành riêng cho vùng chứa và hoạt động như trong thông số kỹ thuật cốt lõi.
  • Truy xuất tư thế xem, tham số chiếu và đề xuất kết xuất cho tất cả vùng chứa không gian đang kết xuất bằng xrLocateSpatialContainerViewsEXT . Đối với mỗi vùng chứa không gian, thời gian chạy sẽ báo cáo xem các lớp thành phần của vùng chứa đó có nên được kết xuất hay không và cách kết xuất các lớp được đề xuất bằng cách điền vào XrSpatialContainerViewStateEXT .
  • Kết xuất pixel thành các lớp thành phần như bình thường. Các thao tác này không có cấu trúc dành riêng cho vùng chứa.
  • Gửi các lớp thành phần cho tất cả vùng chứa không gian đang hiển thị bằng cách gọi xrEndFrame và liên kết XrSpatialContainerLayerFrameEndInfoEXT .

Việc huỷ một tay điều khiển XrSpatialContainerEXT sẽ ngầm xoá tay điều khiển đó khỏi tập hợp kết xuất đang hoạt động. Ứng dụng có thể huỷ một vùng chứa không gian ngay cả khi đã thực hiện lệnh gọi thành công đến xrBeginSpatialContainerRenderingEXT không liên kết với lệnh gọi tương ứng đến xrEndSpatialContainerRenderingEXT . Thời gian chạy phải hoạt động như thể xrEndSpatialContainerRenderingEXT được gọi ngầm nếu cần sớm trong quá trình triển khai xrDestroySpatialContainerEXT nếu hàm này trả về thành công.

Khi nhận được sự kiện XrEventDataSpatialContainerClosedEXT cho một vùng chứa trong tập hợp kết xuất đang hoạt động, ứng dụng nên gọi xrEndSpatialContainerRenderingEXT và huỷ tay điều khiển XrSpatialContainerEXT.

Hàm xrBeginSpatialContainerRenderingEXT thêm vùng chứa không gian vào nhóm kết xuất đang hoạt động theo phiên, cho phép ứng dụng gửi các lớp thành phần cho vùng chứa không gian đến xrEndFrame .

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

Nội dung mô tả về tham số

Ứng dụng thường gọi hàm này để phản hồi sự kiện thay đổi chế độ hiển thị khi XrEventDataSpatialContainerVisibleChangedEXT :: visible được đặt thành true.

Nếu vùng chứa không gian không được tạo bằng XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT khi gọi xrCreateSpatialContainerEXT , thì thời gian chạy phải trả về XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT .

Nếu vùng chứa không gian đã có trong tập hợp kết xuất đang hoạt động, thì thời gian chạy phải trả về XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT .

Nếu xrBeginSpatialContainerRenderingEXT được gọi tại thời điểm ứng dụng không thể gọi xrWaitFrame (tức là bên trong cửa sổ xrBeginFrame và xrEndFrame), thì thời gian chạy phải trả về XR_ERROR_CALL_ORDER_INVALID .

Cách sử dụng hợp lệ (Ngầm ẩn)

Độ an toàn cho chuỗi

Mã trả về

Thành công

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Không thành công

  • 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

Cấu trúc XrSpatialContainerBeginInfoEXT được dùng để chỉ định các tham số cho việc bắt đầu kết xuất vùng chứa không gian.

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

Nội dung mô tả về thành viên

  • type là XrStructureType của cấu trúc này.
  • next là NULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • spatialContainer là XrSpatialContainerEXT để bắt đầu kết xuất.
  • primaryViewConfigurationType là XrViewConfigurationType chính được dùng cho vùng chứa không gian.

primaryViewConfigurationType là cấu hình khung hiển thị mà ứng dụng dự định sử dụng khi kết xuất. Thời gian chạy có thể làm giảm cấu hình khung hiển thị thành một loại có ít khung hiển thị hơn cho mục đích tối ưu hoá (ví dụ: vùng chứa ở rất xa và nhỏ đến mức không thể nhận biết được âm thanh nổi). Thời gian chạy trả về thông tin chi tiết về cấu hình chế độ xem bị suy giảm từ các lệnh gọi đến xrLocateSpatialContainerViewsEXT .

Cách sử dụng hợp lệ (Ngầm ẩn)

Hàm xrEndSpatialContainerRenderingEXT xoá vùng chứa không gian khỏi tập hợp kết xuất đang hoạt động.

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

Nội dung mô tả về tham số

Ứng dụng thường gọi hàm này để phản hồi sự kiện thay đổi chế độ hiển thị bằng cách đặt XrEventDataSpatialContainerVisibleChangedEXT :: visible thành false.

Nếu vùng chứa không gian không nằm trong nhóm kết xuất đang hoạt động, thì thời gian chạy phải trả về XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT .

Nếu xrEndSpatialContainerRenderingEXT được gọi tại thời điểm ứng dụng không thể gọi xrWaitFrame (tức là trong khoảng thời gian giữa các lệnh gọi xrBeginFrame và xrEndFrame), thì thời gian chạy phải trả về XR_ERROR_CALL_ORDER_INVALID .

Cách sử dụng hợp lệ (Ngầm ẩn)

Độ an toàn cho chuỗi

Mã trả về

Thành công

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Không thành công

  • 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

Cấu trúc XrSpatialContainerEndInfoEXT được dùng để chỉ định các tham số cho việc kết thúc quá trình kết xuất vùng chứa không gian.

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

Nội dung mô tả về thành viên

  • type là XrStructureType của cấu trúc này.
  • next là NULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • spatialContainer là XrSpatialContainerEXT để kết thúc quá trình kết xuất.

Cách sử dụng hợp lệ (Ngầm ẩn)

Xác định vị trí của khung hiển thị thông qua xrLocateSpatialContainerViewsEXT

Hàm xrLocateSpatialContainerViewsEXT xác định vị trí của các khung hiển thị cho một nhóm vùng chứa không gian.

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

Nội dung mô tả về tham số

  • session là XrSession .
  • locateInfo là con trỏ đến cấu trúc XrSpatialContainerViewsLocateInfoEXT.
  • viewStateCount là số lượng của mảng viewStates.
  • viewStates là con trỏ trỏ đến một mảng cấu trúc XrSpatialContainerViewStateEXT do thời gian chạy điền sẵn.
  • viewCount là số lượng của mảng views.
  • views là một con trỏ trỏ đến một mảng cấu trúc XrView.

Hàm này thay thế xrLocateViews , cho phép ứng dụng truy vấn các khung hiển thị cho nhiều vùng chứa không gian cùng một lúc.

Chế độ xem cho tất cả vùng chứa không gian được trả về trong một mảng views. Các khung hiển thị được sắp xếp dựa trên chỉ mục của vùng chứa không gian trong mảng XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos, sau đó là chỉ mục khung hiển thị cho vùng chứa đó.

Ví dụ: nếu một ứng dụng cung cấp 3 vùng chứa không gian trong XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos:

  • Chỉ mục 0: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO (1 lượt xem)
  • Chỉ mục 1: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO (2 lượt xem)
  • Chỉ mục 2: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO_WITH_FOVEATED_INSET (4 lượt xem)

Sau đó, thời gian chạy phải điền vào mảng views bằng 7 thành phần hiển thị:

  • views [0] là chế độ xem cho vùng chứa 0.
  • views [1] là chế độ xem mắt trái cho vùng chứa 1.
  • views [2] là chế độ xem mắt phải cho vùng chứa 1.
  • views [3] là chế độ xem mắt trái cho vùng chứa 2.
  • views [4] là chế độ xem mắt phải cho vùng chứa 2.
  • views [5] là chế độ xem lồng mắt trái cho vùng chứa 2.
  • views [6] là chế độ xem lồng ghép mắt phải cho vùng chứa 2.

Nếu viewCount không bằng tổng số lượt xem cho từng loại cấu hình chế độ xem được yêu cầu của vùng chứa không gian, thì thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE .

Thời gian chạy có thể làm giảm cấu hình khung hiển thị thành một loại có ít khung hiển thị hơn cho mục đích tối ưu hoá (ví dụ: vùng chứa ở rất xa và nhỏ đến mức không thể nhận biết được âm thanh nổi). Nếu thời gian chạy làm giảm cấu hình khung hiển thị, thì thời gian chạy vẫn phải trả về số lượng khung hiển thị ban đầu cho vùng chứa đó, đồng thời điền các khung hiển thị bổ sung bằng bản sao của các khung hiển thị bị giảm. Ví dụ: nếu XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO được phân rã thành XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO, thì cả chỉ mục 0 và chỉ mục 1 đều sẽ chứa một chế độ xem đơn âm. Do đó, tổng số khung hiển thị được trả về trong mảng views không phụ thuộc vào việc thời gian chạy có quyết định giảm dần cấu hình khung hiển thị nào hay không.

Thời gian chạy phải điều chỉnh từng XrView :: fov được trả về sao cho hình cụt nhỏ nhất có thể trong khi vẫn chứa toàn bộ giới hạn của vùng chứa không gian tương ứng. Môi trường thời gian chạy có thể trả về FOV không đối xứng, ví dụ: nếu vùng chứa không gian nằm ở góc xiên so với chế độ xem của người dùng hoặc bị một đối tượng khác che khuất một phần. Môi trường thời gian chạy có thể tự do định vị nền tảng kết xuất mục tiêu cho vùng chứa không gian. Do bản chất của quá trình kết xuất nhiều ứng dụng, trong đó vùng chứa không gian tách biệt với người dùng, nên thời gian chạy có thể trả về các giá trị XrView không phù hợp để kết xuất pixel, ví dụ: nếu vùng chứa không gian không hiển thị trên màn hình, thì sẽ không có giá trị hợp lệ nào để đặt XrView :: fov. Trong những trường hợp như vậy, thời gian chạy phải đặt XrSpatialContainerViewStateEXT :: shouldSubmitLayers thành false.

Thời gian chạy trả về thông tin bổ sung về trạng thái kết xuất cho mỗi vùng chứa không gian trong mảng viewStates. Nếu viewStateCount không bằng XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfoCount , thì thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE .

Sau khi thời gian chạy đưa sự kiện XrEventDataSpatialContainerClosedEXT vào hàng đợi cho một vùng chứa không gian, hàm này phải trả về XR_FALSE trong XrSpatialContainerViewStateEXT :: shouldSubmitLayers và 0 trong XrSpatialContainerViewStateEXT :: viewStateFlags cho vùng chứa không gian tương ứng.

Đối với các vùng chứa không gian có vị trí thay đổi liên tục trong thế giới thực, thời gian chạy nên tính đến chuyển động của vùng chứa khi điền views để giảm thiểu các cấu phần phần mềm chiếu lại.

Nếu xrLocateSpatialContainerViewsEXT được gọi cho một hoặc nhiều vùng chứa không gian hiện không có trong tập hợp kết xuất đang hoạt động, thì thời gian chạy phải trả về XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT .

Cách sử dụng hợp lệ (Ngầm ẩn)

  • Bạn phải bật tiện ích XR_EXT_spatial_container_self_rendering trước khi gọi xrLocateSpatialContainerViewsEXT
  • session phải là một tên người dùng XrSession hợp lệ
  • locateInfo phải là con trỏ đến cấu trúc XrSpatialContainerViewsLocateInfoEXT hợp lệ
  • viewStates phải là con trỏ trỏ đến một mảng cấu trúc viewStateCount XrSpatialContainerViewStateEXT
  • views phải là một con trỏ trỏ đến một mảng cấu trúc viewCount XrView
  • Tham số viewStateCount phải lớn hơn 0
  • Tham số viewCount phải lớn hơn 0

Mã trả về

Thành công

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Không thành công

  • 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

Cấu trúc XrSpatialContainerViewsLocateInfoEXT chứa các tham số để định vị khung hiển thị trên một tập hợp vùng chứa không gian.

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

Nội dung mô tả về thành viên

  • type là XrStructureType của cấu trúc này.
  • next là NULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • displayTime là XrTime để xác định vị trí của các thành phần hiển thị.
  • viewLocateInfoCount là số lượng mục trong mảng viewLocateInfos.
  • viewLocateInfos là một con trỏ đến một mảng cấu trúc XrSpatialContainerViewLocateInfoEXT.

Cách sử dụng hợp lệ (Ngầm ẩn)

Cấu trúc XrSpatialContainerViewLocateInfoEXT chứa các tham số cho một vùng chứa không gian riêng lẻ để xác định khung hiển thị.

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

Nội dung mô tả về thành viên

  • type là XrStructureType của cấu trúc này.
  • next là NULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • viewConfigurationType là một XrViewConfigurationType được dùng cho vùng chứa không gian.
  • space là XrSpace chứa các khung hiển thị của vùng chứa không gian.
  • spatialContainer là tên người dùng XrSpatialContainerEXT.

Ứng dụng có thể cung cấp bất kỳ XrSpace hợp lệ nào trong space , tuy nhiên, bạn nên cung cấp không gian vùng chứa không gian cho XrSpatialContainerEXT tương ứng được chỉ định trong cấu trúc XrSpatialContainerViewLocateInfoEXT.

Cách sử dụng hợp lệ (Ngầm ẩn)

Cấu trúc XrSpatialContainerViewStateEXT được điền sẵn bằng các lệnh gọi đến xrLocateSpatialContainerViewsEXT với thông tin về mức độ phù hợp của việc kết xuất cho mỗi vùng chứa không gian.

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

Nội dung mô tả về thành viên

  • type là XrStructureType của cấu trúc này.
  • next là NULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • viewStateFlags là một mặt nạ bit của XrViewStateFlags . Các cờ này có cùng mục đích với viewStateFlags trong cấu trúc XrViewState cốt lõi.
  • viewConfigurationType là một XrViewConfigurationType cho biết loại cấu hình khung hiển thị mà thời gian chạy đang sử dụng cho vùng chứa không gian, thời gian chạy có thể giảm xuống cấu hình khung hiển thị có số lượng khung hiển thị thấp hơn số lượng được yêu cầu.
  • shouldSubmitLayers là một XrBool32 do thời gian chạy trả về. Nếu XR_FALSE , ứng dụng nên tránh gửi thành phần cho vùng chứa không gian này vì vùng chứa này hiện không hiển thị hoặc đang ở trạng thái không cần kết xuất.
  • recommendedImageExtent là một cấu trúc XrExtent2Di đại diện cho độ phân giải được đề xuất cho vùng chứa không gian.

Giống như vị trí khung hiển thị OpenXR chính, ứng dụng phải kiểm tra XrSpatialContainerViewStateEXT :: viewStateFlags để đảm bảo vị trí và hướng là hợp lệ và được theo dõi trước khi sử dụng dữ liệu khung hiển thị để kết xuất.

Ứng dụng nên kiểm tra shouldSubmitLayers và viewConfigurationType để tránh hiển thị nhiều hơn mức đề xuất của thời gian chạy. Khi shouldSubmitLayers là false, ứng dụng sẽ thay đổi hành vi kết xuất như sau:

  • Ứng dụng không được đọc XrView :: fov tương ứng.
  • Ứng dụng không được đọc recommendedImageExtent .
  • Ứng dụng nên tránh kết xuất vào chuỗi hoán đổi và gửi các lớp thành phần cho vùng chứa không gian tương ứng.
  • Ứng dụng phải đặt XrSpatialContainerLayerEXT :: retainPreviousSubmission thành true. Nếu ứng dụng vẫn chọn gửi các lớp, thì thời gian chạy sẽ quyết định việc cần làm với các lớp đó (ví dụ: thời gian chạy có thể chọn loại bỏ các lớp đó).

recommendedImageExtent dành riêng cho các lớp sẽ được cập nhật dựa trên vị trí vùng chứa hoặc chế độ xem của người dùng. Khi cập nhật các lớp có nội dung phụ thuộc vào vị trí của vùng chứa không gian hoặc chế độ xem của người dùng (chẳng hạn như nội dung 3D thông thường), ứng dụng nên kết xuất vào khung nhìn nhỏ hơn này thay vì kích thước chế độ xem được đề xuất mặc định. Khi cập nhật các lớp có nội dung không phụ thuộc vào vị trí của vùng chứa không gian hoặc chế độ xem của người dùng (chẳng hạn như các lớp tứ giác tĩnh), ứng dụng có thể bỏ qua các giá trị này một cách an toàn. Đối với các lớp phụ thuộc vào khung hiển thị, recommendedImageExtent là một đề xuất cho ứng dụng từ thời gian chạy nhằm giảm thiểu hiện tượng răng cưa và cải thiện hiệu suất kết xuất. Ứng dụng có thể gửi ảnh ở độ phân giải đầy đủ nếu muốn.

XrExtent2Di :: width và XrExtent2Di :: height của recommendedImageExtent phải luôn là số nguyên dương nhỏ hơn hoặc bằng XrViewConfigurationView :: recommendedImageRectWidth và XrViewConfigurationView :: recommendedImageRectHeight của XrViewConfigurationView cho cấu hình chế độ xem chính của vùng chứa không gian. Ứng dụng không nên tạo lại chuỗi hoán đổi chỉ vì recommendedImageExtent đã thay đổi, vì đây là gợi ý động cho ứng dụng chỉ định XrSwapchainSubImage :: imageRect để sử dụng trong XrSwapchainSubImage của bất kỳ lớp thành phần có độ phân giải đầy đủ nào mà ứng dụng gửi và có thể thay đổi mọi khung hình.

Cách sử dụng hợp lệ (Ngầm ẩn)

Xem không gian tham chiếu

Không gian tham chiếu khung hiển thị vẫn không thay đổi như trong lõi OpenXR. Giống như trong lõi, lớp này không dùng để kết xuất.

Gửi các lớp thông qua xrEndFrame

Để kết xuất vùng chứa không gian, ứng dụng phải cung cấp danh sách các lớp liên kết với vùng chứa không gian tương ứng cho xrEndFrame . Bạn có thể thực hiện việc này thông qua cấu trúc XrSpatialContainerLayerFrameEndInfoEXT.

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

Nội dung mô tả về thành viên

  • type là XrStructureType của cấu trúc này.
  • next là NULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • containerLayerCount là số phần tử trong mảng containerLayers.
  • containerLayers là con trỏ đến một mảng cấu trúc XrSpatialContainerLayerEXT.

Mảng containerLayers chứa một XrSpatialContainerLayerEXT cho mỗi vùng chứa không gian trong tập hợp kết xuất đang hoạt động (các vùng chứa được quản lý theo phiên bằng xrBeginSpatialContainerRenderingEXT và xrEndSpatialContainerRenderingEXT ). Mỗi XrSpatialContainerLayerEXT chứa một danh sách con trỏ XrCompositionLayerBaseHeader liên kết với vùng chứa không gian đã cho. Thời gian chạy có thể kết hợp các vùng chứa theo thứ tự bất kỳ mà chúng chọn, độc lập với thứ tự của containerLayers . Ví dụ: thời gian chạy có thể kết hợp các vùng chứa dựa trên độ sâu của chúng so với người dùng, có một vùng chứa không gian đóng vai trò là lớp nền hoặc "ghim" một vùng chứa không gian sao cho vùng chứa đó luôn ở trên cùng bất kể độ sâu của vùng chứa đó. Môi trường thời gian chạy có thể kết hợp các lớp bằng nhiều chiến lược cho vùng chứa không gian ở chế độ giới hạn hoặc chế độ hiển thị tối đa. Ví dụ: thời gian chạy có thể kết hợp trước các lớp thành phần của mỗi vùng chứa không gian có giới hạn thành một lớp tứ diện âm thanh nổi duy nhất, được kết hợp với tất cả các vùng chứa khác trong bước kết hợp thứ hai.

XrFrameEndInfo :: displayTime và XrFrameEndInfo :: environmentBlendMode sẽ được áp dụng cho tất cả vùng chứa không gian được cung cấp trong XrSpatialContainerLayerFrameEndInfoEXT .

Khi cấu trúc này được truyền đến xrEndFrame bằng cách liên kết với XrFrameEndInfo , các trường hợp lỗi bổ sung sau đây sẽ được thêm vào dựa trên tập hợp kết xuất đang hoạt động:

  • Nếu một vùng chứa không gian được tham chiếu bởi nhiều phần tử của containerLayers , thì thời gian chạy phải trả về XR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXT .
  • Nếu một vùng chứa không gian trong nhóm kết xuất đang hoạt động không được một phần tử của containerLayers tham chiếu, thì thời gian chạy phải trả về XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT .
  • Nếu vùng chứa không gian được containerLayers tham chiếu không phải là thành viên của tập hợp kết xuất đang hoạt động, thì thời gian chạy phải trả về XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT .

Hơn nữa, nếu có bất kỳ vùng chứa không gian nào trong tập hợp kết xuất đang hoạt động và cấu trúc này không được liên kết với XrFrameEndInfo , thì thời gian chạy phải trả về XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT .

Trong bất kỳ trường hợp lỗi nào nêu trên, thời gian chạy không được hiển thị bất kỳ nội dung nào cho bất kỳ vùng chứa không gian nào.

Nếu không có vùng chứa không gian nào trong tập hợp kết xuất đang hoạt động, thì ứng dụng có thể gọi xrEndFrame miễn là không gửi bất kỳ lớp thành phần nào.

Xin lưu ý rằng bạn có thể gửi từng chuỗi hoán đổi cho nhiều vùng chứa thông qua các lớp trong một cấu trúc hợp lệ, ví dụ: một lớp tứ giác được kết xuất thông qua một chuỗi hoán đổi duy nhất được gửi đến nhiều vùng chứa không gian. Trường hợp này được xử lý đồng nhất với các hoạt động kết xuất khác: thời gian chạy phải kết xuất hình tứ giác trong tất cả các vùng chứa không gian như vậy.

Cách sử dụng hợp lệ (Ngầm ẩn)

Cấu trúc XrSpatialContainerLayerEXT nhóm các lớp thành phần tiêu chuẩn và liên kết các lớp đó với một vùng chứa không gian cụ thể.

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

Nội dung mô tả về thành viên

  • type là XrStructureType của cấu trúc này.
  • next là NULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • spatialContainer là XrSpatialContainerEXT xác định vùng chứa mục tiêu.
  • retainPreviousSubmission là XrBool32 . Nếu XR_TRUE , thời gian chạy sẽ giữ lại khung hình được gửi gần đây nhất cho vùng chứa không gian này.
  • layerCount là số lượng lớp kết hợp trong mảng layers.
  • layers là một con trỏ đến một mảng con trỏ XrCompositionLayerBaseHeader.

Khi retainPreviousSubmission là XR_TRUE , thời gian chạy phải sử dụng lại các lớp thành phần và nội dung hình ảnh chuỗi hoán đổi như đã chốt trong lệnh gọi xrEndFrame gần đây nhất, trong đó retainPreviousSubmission là XR_FALSE . Mọi nội dung sửa đổi tiếp theo đối với chuỗi hoán đổi mà các lớp được giữ lại sử dụng không được phản ánh trong kết quả hiển thị.

Đối với các lớp được gửi cho một vùng chứa không gian riêng lẻ (kết xuất trong vùng chứa), thời gian chạy phải tuân theo các quy tắc đã chỉ định cho thứ tự kết hợp lớp. Nghĩa là các lớp trong vùng chứa phải được vẽ theo cùng thứ tự như được chỉ định, được kết hợp thông qua thuật toán của hoạ sĩ.

"Xoá" vùng chứa không gian là việc xoá tất cả nội dung khỏi vùng chứa không gian, dẫn đến việc không có nội dung nào được kết xuất cho vùng chứa đó trong khung hình hiện tại. Môi trường thời gian chạy phải coi việc này tương đương với việc ứng dụng gửi màu đen trong suốt (tất cả bit đều là 0) cho mọi pixel bên trong vùng chứa. Việc "giữ lại" một vùng chứa không gian đề cập đến việc thời gian chạy tiếp tục hiển thị tập hợp các lớp được gửi gần đây nhất cho vùng chứa đó.

Đối với mỗi vùng chứa không gian, ứng dụng có thể chỉ định việc gửi lớp mới, giữ lại nội dung đã gửi trước đó hay xoá vùng chứa không gian:

  • Để gửi các lớp mới, ứng dụng sẽ cung cấp một layerCount khác 0 và một con trỏ layers hợp lệ.
  • Để xoá vùng chứa không gian, layerCount cho mục nhập của vùng chứa đó phải là 0 và retainPreviousSubmission phải là XR_FALSE .
  • Để giữ lại các lớp và hình ảnh chuỗi hoán đổi được gửi gần đây nhất (giữ lại), layerCount cho mục nhập của lớp và hình ảnh đó phải là 0 và retainPreviousSubmission phải là XR_TRUE .

Chế độ kiểm soát rõ ràng theo vùng chứa này đảm bảo rằng ý định của ứng dụng được truyền đạt rõ ràng trong mọi khung hình.

Nếu retainPreviousSubmission là XR_TRUE và layerCount không phải là 0, thì thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE .

Nếu XrSpatialContainerCompositionLayerViewConfigurationEXT không được liên kết với XrCompositionLayerProjection thuộc vùng chứa không gian, thì thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE . Cấu trúc này chỉ áp dụng cho các lớp XrCompositionLayerProjection. Nếu được liên kết với các loại lớp khác (ví dụ: lớp tứ giác hoặc lớp hình trụ), thì thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE .

Cách sử dụng hợp lệ (Ngầm ẩn)

Chỉ định cấu hình khung hiển thị cho các lớp chiếu

Cấu trúc XrSpatialContainerCompositionLayerViewConfigurationEXT được dùng để chỉ định cấu hình khung hiển thị dùng để kết xuất một lớp chiếu cho vùng chứa không gian.

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

Nội dung mô tả về thành viên

Khi gửi XrCompositionLayerProjection cho vùng chứa không gian, ứng dụng phải chỉ định cấu hình khung hiển thị được dùng để kết xuất lớp. Điều này là cần thiết vì ứng dụng có thể chọn từng khung hình để kết xuất bằng cấu hình khung hiển thị chính của vùng chứa không gian hoặc cấu hình khung hiển thị suy giảm do thời gian chạy đề xuất (nếu có).

Khi XrSpatialContainerCompositionLayerViewConfigurationEXT được liên kết, ứng dụng phải đảm bảo rằng XrCompositionLayerProjection :: viewCount là số lượt xem hợp lệ cho XrViewConfigurationType được chỉ định trong cấu trúc liên kết. viewConfigurationType được chỉ định trong cấu trúc theo chuỗi phải là XrSpatialContainerBeginInfoEXT :: primaryViewConfigurationType được chỉ định khi vùng chứa bắt đầu, hoặc loại cấu hình khung hiển thị bị suy giảm do thời gian chạy trả về trong XrSpatialContainerViewStateEXT hoặc các giá trị bổ sung được bật thông qua một tiện ích.

Cách sử dụng hợp lệ (Ngầm ẩn)

Hành vi cắt pixel

Ứng dụng nên thông báo cho thời gian chạy biết liệu ứng dụng có kết xuất pixel bên ngoài ranh giới của vùng chứa không gian hay không bằng cách liên kết XrSpatialContainerLayerVolumeClippingEXT khi gửi các lớp thành phần kết hợp.

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

Nội dung mô tả về thành viên

Cấu trúc này đóng vai trò là gợi ý cho biết liệu ứng dụng có kết xuất pixel bên ngoài ranh giới của vùng chứa không gian hay không. Khi vùng chứa không gian ở chế độ hiển thị tối đa, vì các giới hạn là vô hạn nên gợi ý này không có ý nghĩa.

Đối với các vùng chứa không gian có giới hạn sử dụng tính năng tự kết xuất, thời gian chạy cần phải suy luận về cả ranh giới thể tích 3D và ranh giới pixel 2D. Giới hạn thể tích 3D được trả về từ xrGetSpatialContainerBoundsEXT . Giới hạn pixel 2D là hình chiếu của giới hạn thể tích 3D lên mỗi màn hình cho hệ thống.

Môi trường thời gian chạy phải loại bỏ các pixel khỏi hình ảnh chuỗi hoán đổi nằm ngoài ranh giới pixel 2D, tuy nhiên, môi trường thời gian chạy không được loại bỏ các pixel nằm trong ranh giới pixel 2D nhưng nằm ngoài ranh giới thể tích 3D. Bạn có thể sử dụng hiệu ứng âm thanh nổi khi nội dung có vẻ như mở rộng ra ngoài hoặc ở phía trước ranh giới âm lượng 3D của vùng chứa. Ứng dụng có thể loại bỏ các pixel nằm ngoài ranh giới thể tích 3D của vùng chứa không gian có giới hạn để giảm nghịch lý về chiều sâu và nên đặt volumeClipping dựa trên cách ứng dụng thực hiện việc này. Nghịch lý về chiều sâu thường gây mỏi mắt và khó chịu cho người dùng.

Môi trường thời gian chạy có thể sử dụng volumeClipping để điều chỉnh cách hiển thị một vùng chứa không gian cụ thể. Ví dụ: khi được đặt thành XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT, thời gian chạy có thể kết xuất các mặt sau của ranh giới khối 3D, điều này sẽ gây ra nghịch lý về chiều sâu nếu vùng chứa không gian vẽ các pixel phía sau ranh giới khối 3D của vùng chứa.

Các tiện ích trong tương lai có thể cho phép cắt dựa trên ranh giới thể tích 3D nếu thông tin về chiều sâu được gửi.

Cách sử dụng hợp lệ (Ngầm ẩn)

Lệnh mới

Cấu trúc mới

Hằng số enum mới

  • XR_EXT_SPATIAL_CONTAINER_SELF_RENDERING_EXTENSION_NAME
  • XR_EXT_spatial_container_self_rendering_SPEC_VERSION
  • Mở rộng 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
  • Mở rộng XrSpatialContainerGraphicsPresentationEXT :

    • XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
  • Mở rộng 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

Mẫu mã

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

Danh sách phiên bản

  • Bản sửa đổi 1, ngày 6 tháng 8 năm 2026 (Lachlan Ford)

    • Nội dung mô tả ban đầu về tiện ích