AR на одних маркерах и плоскостях имеет врождённый дефект: виртуальный диван просвечивает сквозь реальный стол, а человек проходит сквозь голограмму как через туман. Позицию трекинг найти умеет, геометрию — нет. Глубинная камера Orbbec закрывает ровно этот пробел: у рендера появляется карта реальных расстояний, и реальные предметы начинают перекрывать виртуальные. Разбираем, как протащить глубину в Unity и не утопить кадры.
Что карта глубины даёт AR-проекту
Первое и главное — окклюзия: виртуальный объект корректно прячется за реальной мебелью, колоннами и людьми. Второе — физика: коллизии и «прилипание» к настоящей геометрии комнаты, а не к плоскости пола. Третье — интеракции без контроллеров: рука перед камерой распознаётся простым порогом глубины, и «коснуться» виртуальной кнопки можно пальцем. Наконец, измерения: раз в кадре лежат миллиметры, линейка и углы делаются без каких-либо маркеров.
Путь данных: кадр → текстура → шейдер
Поток глубины приходит из SDK как массив uint16 в миллиметрах. Его не нужно декодировать: в Unity под него создаётся Texture2D формата R16, и кадр заливается в текстуру одной операцией LoadRawTextureData. Дальше текстура уходит в материал, а сравнение происходит в шейдере: реальная глубина сцены против глубины конкретного виртуального пикселя. API обёртки зависит от выбранного биндинга, суть не меняется.
public class DepthOcclusion : MonoBehaviour {
[SerializeField] Material _mat; // материал с шейдером окклюзии
Texture2D _depthTex; // R16, значения в миллиметрах
const int W = 640, H = 576; // режим Femto Bolt
void Start() {
_depthTex = new Texture2D(W, H, TextureFormat.R16, false) {
filterMode = FilterMode.Point
};
// здесь же открывается пайплайн обёртки OrbbecSDK для Unity
}
void Update() {
ushort[] frame = FetchDepthFromOrbbecWrapper(); // uint16, мм
if (frame == null) return;
_depthTex.LoadRawTextureData(frame); // копия без перекодирования
_depthTex.Apply(false);
_mat.SetTexture("_DepthTex", _depthTex);
_mat.SetFloat("_DepthScaleMm", 0.001f); // мм -> метры в шейдере
}
}
Шейдерная часть на built-in render pipeline выглядит так:
sampler2D _DepthTex;
float _DepthScaleMm;
half4 frag (v2f i) : SV_Target {
// реальная сцена: 16-битная глубина (мм) -> метры
float realM = tex2Dlod(_DepthTex, float4(i.uv, 0, 0)).r * 65535.0 * _DepthScaleMm;
// глубина этого виртуального пикселя от глаза (built-in RP)
float fragM = LinearEyeDepth(i.pos.z);
clip(realM - fragM); // реальный объект ближе - пиксель скрыт
return tex2D(_MainTex, i.uv);
}
Если фрагмент виртуального объекта дальше реальной поверхности — он отбрасывается clip() и честно скрывается за стеной или спиной человека. Для мягких краёв вместо clip используют взвешенное смешивание по разнице глубин.
Выбор камеры и связки
Для настольных и витринных AR-станций логика простая. Astra 2 — ближняя зона: киоски, жесты у экрана, примерочные. Femto Bolt — ToF-камера для больших залов и сцен с несколькими людьми: стабильная глубина на дистанциях, где структурированная подсветка уже не дотягивается. Отдельный класс — Persee: камера и компьютер в одном корпусе, готовый «мозг» для автономной станции, которую не надо собирать из системника и проводов.

Производительность и подводные камни
Тридцати кадров глубины в секунду AR-станции хватает с запасом. Правила экономии простые: одна LoadRawTextureData на кадр, никаких промежуточных Color32; point-фильтрация вместо билинейной, чтобы миллиметры не размывались; перевод мм в метры — в шейдере, умножением, а не на CPU. Из физических сюрпризов ждите дыры на зеркалах, стеклянных витринах и чёрных глянцевых поверхностях — их закрывают временные фильтры SDK или inpainting-проход. И помните про временной паритет: кадр глубины старше текущего рендера на десятки миллисекунд, на быстрых сценах окклюзия слегка «дышит» — лечится короткой экстраполяцией или уменьшением глубины сцены.
Частые вопросы
Нужен ли AR Foundation?
Для настольной станции — нет: AR Foundation решает те же задачи на телефонах с их встроенными датчиками. Ваша внешняя камера, своя текстура и свой шейдер работают поверх любого пайплайна, включая built-in и URP.
Можно обойтись без шейдера, сегментацией на CPU?
Можно — бинаризацией по порогу глубины и маской через stencil. Но это отдельный проход на каждый кадр и нагрузка на CPU; сравнение в шейдере выполняется на GPU практически бесплатно.
Что лучше: ToF или стерео?
Для AR вблизи важна плотность и стабильность карты, это территория структурированной подсветки и ToF. Активная стерео хороша дальностью, но у самых стен её карта рябит — для примерочных и киосков берите Astra 2, для сцены в зале — Femto Bolt.
Камеры для проекта
Femto Bolt — для AR-сцен с людьми и большими залами, Astra 2 — для киосков и жестовых интерфейсов вблизи. Каталог Orbbec — счёт для юрлица, консультация по SDK, гарантия.
Камеры Orbbec в наличии на LUWAM
- Orbbec Femto Bolt — iToF 4K, замена Azure Kinect — 99 900 ₽
- Orbbec Gemini 335L — стерео для роботов и SLAM — 99 900 ₽
- Orbbec Astra 2 — структурированный свет, сканирование помещений — 99 900 ₽
Весь каталог Orbbec · консультация по SDK · счёт для юрлица в день обращения · гарантия 1 год.

