Реалізація оклюзії віртуальних об'єктів реальними предметами в AR
Без оклюзії AR виглядає як наклейка поверх реальності. Віртуальний персонаж стоїть за реальним стільцем – але стілець не перекриває персонажа, та ілюзія рассипається. Користувач миттєво це чита як "накладення картинки", а не як присутність об'єкта у просторі.
AR Foundation 5.x надає AROcclusionManager – компонент, який використовує карту глибини з сенсора (LiDAR на iPhone Pro / iPad Pro, depth estimation на пристроях без LiDAR) для маскування віртуальних об'єктів за реальними. Але "просто додати компонент" не працює.
Де оклюзія ломається
На пристроях з LiDAR карта глибини (environmentDepthTexture) оновлюється у реальному часі з частотою близько 30 fps – це чесний depth buffer реального світу. На Android та iPhone без LiDAR AR Foundation використовує ML-оцінку глибини через AROcclusionManager.requestedEnvironmentDepthMode = EnvironmentDepthMode.Best, що дає значно більше артефактів на краях.
Головна проблема – розрив між глибиною реального світу та Z-буфером Unity. Віртуальні об'єкти рендерються у стандартному пайплайні з звичайним depth testing, а "реальний світ" приходить як 2D-текстура. Потрібно явно реалізовувати оклюзію: рендерити реальні поверхні у глибину через DepthShader, записувати в depth buffer до рендеру віртуальних об'єктів.
Конкретно в URP це виглядає так: створюється ScriptableRendererFeature з двома RenderPass. Перший проход бере environmentDepthTexture з AROcclusionManager, конвертує в depth buffer (враховуючи різницю в near/far clip плейнах між AR-камерою та Unity-камерою) та записує в _CameraDepthTexture. Другий проход – стандартний рендер сцени. Віртуальні об'єкти автоматично отримують коректний depth test щодо реального світу.
Звучить просто, але є нюанс: конвертація глибини. AR Foundation повертає лінійну глибину в метрах, Unity depth buffer – нелінійний (logarithmic або reversed-Z залежно від налаштувань). Неправильна конвертація дає "мерцання" на граничах оклюзії або повне відсутність ефекту.
М'які краї та альфа-змішення
Жорстока оклюзія – об'єкт або видно, або ні – виглядає грубо. На краях реальних об'єктів карта глибини завжди має неточності: розмиття, артефакти ML-оцінки. Віртуальний об'єкт ріже по цьому нечіткому краю, та отримується зубчата границя.
Правильне рішення – soft occlusion через розмиття карти глибини перед depth testing. AROcclusionManager в AR Foundation 5.x підтримує OcclusionPreferenceMode.PreferEnvironmentOcclusion та PreferSmoothOcclusion – другий режим застосовує bilateral filter для згладжування границь. Але в URP це потрібно підключати вручну через кастомний рендер пасс; автоматично це працює тільки в Built-in RP.
На практиці ми робимо так: у шейдері віртуального об'єкта додаємо стадію оклюзії з smoothstep по порівнянню глибини реального світу та глибини об'єкта. Діапазон змішення – 2–5 см у світових координатах. Це дає плавний перехід на краях без явних артефактів.
Кейс: персонаж за меблями
Проект – AR-гра з мобільним AR-персонажем, який взаємодіє з реальною кімнатою. Завдача: персонаж повинен "сховатися" за реальними предметами меблі.
Без LiDAR (основна аудиторія – середньорядні Android) довелось використовувати ML-depth estimation. Проблема: ML погано працює на однорідних поверхнях (біла стіна, гладкий стіл) – глибина там нестабільна, та персонаж "проваливався" в стіл або виходив перед ним хаотично.
Рішення – гібридний підхід. Для крупних виявлених площин (ARPlane) використовуємо точну геометрію з ARPlaneManager (ми знаємо їх положення у просторі), рендеримо як 3D-меші у depth buffer. ML-depth використовуємо тільки для об'єктів, які не є площинами – стільці, люди, предмети на столі. Це убрало 80% артефактів на типових інтер'єрних сценах.
Терміни та процес
Оцінка починається з аудиту цільових пристроїв та поточного рендер-пайплайну. URP та HDRP потребують різних підходів. HDRP у мобільному AR практично не використовується – занадто важкий, але якщо проект для Magic Leap або HoloLens, там своя специфіка.
| Сценарій | Терміни |
|---|---|
Базова оклюзія через AROcclusionManager (URP) |
3–7 днів |
| М'яка оклюзія з кастомним рендер пассом | 1–2 тижні |
| Гібридний підхід (площини + ML depth) | 2–4 тижні |
| HoloLens / Magic Leap (окремий пайплайн) | від 3 тижнів |
Вартість – після аналізу проекту та цільових платформ. Ключові питання: який RP, є ли LiDAR у цільовій аудиторії, потрібна ли підтримка Android нижче ARCore 1.24.





