Если коротко:
Mixed Reality Occlusion сравнивает глубину виртуального пикселя с глубиной реальной сцены. Если стол, рука или другой физический объект ближе к камере, соответствующая часть виртуального объекта не выводится. Depth API обновляет карту глубины динамически, scene mesh описывает заранее распознанную комнату, а ручная маска подходит для известной геометрии. Неточность глубины и задержка дают дрожание и ореолы на границах.
Mixed Reality Occlusion создаёт правильный порядок глубины между реальным и виртуальным миром. Когда физическая рука проходит перед virtual object, его закрытая часть исчезает; когда объект ближе руки, он остаётся видимым. Без этого passthrough выглядит как видеофон под графикой.
Что именно сравнивает система
Система сравнивает глубину виртуального пикселя с расстоянием до физической поверхности. Если реальная поверхность ближе, shader не рисует пиксель либо плавно уменьшает его видимость у границы.
OpenXR передаёт depth information с projection layer, но доступ к глубине окружения зависит от runtime. На Meta Quest Unity получает Environment Depth через Meta OpenXR.
Depth API: динамическая окклюзия
Depth API обновляет карту глубины в реальном времени. Поэтому moving objects, hands и передвинутая мебель могут закрывать цифровой контент без заранее созданной модели. Meta указывает поддержку для Quest 3 и Quest 3S.
Близкие поверхности примерно до 0,2 м оцениваются ненадёжно, а быстрое движение может оставить запаздывающий контур. Поэтому dynamic occlusion проверяют на устройстве.
Scene mesh: статичная комната
Scene API и MR Utility Kit строят mesh стен, пола и мебели. Геометрия пригодна для окклюзии неподвижных поверхностей, размещения и столкновений. Подробнее см. scene understanding.
Scene mesh не знает, что человек вошёл в комнату или кресло передвинули. Сочетание с Depth API добавляет динамические изменения.
Ручные маски и известная геометрия
Если форма и поза предмета известны, developers могут отрисовать невидимый occluder только в depth buffer. Следом virtual objects проходят тест глубины и скрываются за маской. Метод подходит для tracked object или hands.
Маска работает без Depth API, но верна лишь пока совпадает с предметом. Ошибка трекинга создаёт заметный вырез, а непрозрачный mesh не воспроизводит полупрозрачный материал.
Hard и soft occlusion
Hard occlusion дешевле, но подчёркивает ступенчатый и дрожащий край. Soft occlusion смешивает пиксели возле границы и выглядит спокойнее, хотя требует больше GPU.
Когда виртуальный объект лежит на реальном столе, ошибка depth вызывает z-fighting. Небольшой depth bias отделяет слои, но слишком большое значение создаёт ореол.
Тонкая геометрия, волосы и прозрачность остаются сложными случаями. В Unity-примере Meta low-resolution hand заменяется tracked hand mesh ради более чистых границ пальцев.
Как выбрать метод
- Для людей и движущихся предметов нужен Depth API.
- Для стен и мебели полезен scene mesh.
- Для известного tracked object подходит ручной depth-only occluder.
- Для интерфейса иногда лучше вовсе исключить поверхность из окклюзии, чтобы важная панель не исчезала.
Начинайте с корректного passthrough, затем проверяйте разные расстояния и движение. Симулятор не показывает реальный шум и задержку сенсора.
Итог
Depth API даёт текущую глубину, scene mesh хранит статичную структуру комнаты, а ручная маска представляет известный физический объект. Убедительный результат обычно сочетает методы и скрывает ошибки краёв мягким переходом, разумным bias и дизайном сцены.