Если коротко:
OpenXR Composition Layers позволяют передать runtime отдельные изображения сцены и интерфейса, чтобы XR-композитор собрал итоговый кадр. Projection layer содержит стереоскопическую сцену, quad layer — плоскую панель, а cylinder layer — изогнутую поверхность при наличии расширения. Такой UI может выглядеть чётче геометрии в основном eye buffer, но приложение всё равно должно проверить поддержку, порядок слоёв, ввод и лимит runtime.
OpenXR Composition Layers — отдельные изображения, которые приложение передаёт XR runtime в конце кадра. Композитор собирает их в указанном порядке. Обычная VR-сцена тоже является слоем, но панель интерфейса необязательно превращать в mesh внутри неё.
Чем compositor layer отличается от объекта сцены
Панель-геометрия растеризуется в общий eye buffer вместе с миром. На неё влияют разрешение буфера, перспектива, сглаживание и выборка texture. Composition layer использует собственный swapchain: приложение обновляет изображение, а runtime накладывает его при финальной композиции.
Это полезно для текста, видео и меню. Но маленький viewport, низкое разрешение swapchain и неудачный размер панели всё равно ухудшат читаемость.
Projection, quad и cylinder layers
Projection layer содержит основную стереоскопическую сцену. Для каждого глаза приложение передаёт view с позой, полем зрения и участком swapchain. Здесь обычно находятся мир и объекты.
Quad layer — прямоугольник без толщины в выбранном XrSpace. Размер задаётся в метрах, а структура хранит pose, видимость для глаз и subimage. Это базовый вариант для плоского меню.
Cylinder layer изгибает изображение по цилиндрической поверхности. Радиус, центральный угол и aspect ratio задают её форму. Тип относится к расширению XR_KHR_composition_layer_cylinder: если runtime его не объявляет, нужен quad или геометрический fallback.
Движки могут показывать дополнительные shapes. Их наличие в Unity или Godot не означает поддержку на любой гарнитуре. Сначала проверяют OpenXR extensions активного runtime. Роль этой среды разобрана в материале об OpenXR.
Почему интерфейс может стать чётче
UI swapchain можно подобрать под размер панели перед глазами. Композитор получает исходное изображение отдельно, поэтому текст не проходит через рендер всей сцены и выборку с наклонного polygon. Composition layer не повышает детализацию исходного canvas: сравнивайте в гарнитуре одинаковый угловой размер, шрифт и resolution. Если texture меняется каждый frame, стоимость обновления остаётся.
Порядок слоёв, глубина и прозрачность
При xrEndFrame приложение передаёт массив layers. Слой с индексом 0 рисуется первым, последующие накладываются по painter’s algorithm независимо от виртуального расстояния. Поэтому quad, стоящий за предметом, не обязан скрыться за ним.
Depth extensions могут дать runtime данные для reprojection, но не меняют базовый порядок. Не рассчитывайте на обычный depth test между mesh из projection layer и отдельной панелью. Прозрачность требует корректных alpha и flags; итог зависит и от environment blend mode. Если интерфейсу нужны естественные пересечения с миром, geometry может быть проще.
Ввод не появляется автоматически
Compositor layer — изображение, а не collider. Луч должен пересечь плоскость или цилиндр, после чего приложение переводит точку в UV и координаты canvas. Затем вызывается hover или select. Цепочка событий описана в статье о VR-указателе. У готового component проверьте, создаёт ли он input mapping или лишь отправляет layer.
Что проверить перед внедрением
- Получить список extensions и не создавать cylinder без
XR_KHR_composition_layer_cylinder. - Уточнить
maxLayerCount: превышение лимита или нехватка ресурсов вызывает ошибку. - Подобрать resolution swapchain по угловому размеру панели.
- Задать
XrSpace, pose, eye visibility, alpha и порядок layers. - Проверить world-locked и head-locked режимы, читаемость и jitter на целевых гарнитурах.
- Измерить GPU frame time и память вместо предположения об автоматическом ускорении.
В Unity OpenXR 1.13 функция использует отдельный Composition Layers package. API меняется между версиями, поэтому фиксируйте package и проверяйте build на устройстве. Базовая схема: projection для мира, quad для панели и geometry fallback.