Top.Mail.Ru
Технические посты | BlackVR

Перекрытие виртуальных объектов реальными на примере создания AR-масок

В BlackVR нам часто приходят запросы на разработку AR-масок. В рамках данного поста мы разберем проблемы, связанные с перекрытием виртуальных обьектов настоящими. Подобную задачу можно разбить на две части:
  • определение объекта(метки, лица) на изображении с камеры;
  • перекрытие и маскировка виртуальных объектов.
Первое решается использованием специальных ассетов для трекинга меток и объектов наподобие Vuforia и MaxST AR. В случае трекинга лица используются решения на основе нейросетей, позволяющие построить виртуальную модель лица.

Для того, чтобы разъяснить вторую часть задачи на рисунке ниже приведена простая проблема.

image
Рис. 1
Модель маски с патчами на глаза
(Для наглядности сетка маски подсвечена)

При первом взгляде кажется, что все нормально. Однако, на рисунке отчетливо видно как через нос видна другая сторона маски. Естественно, такого быть не должно. При наложении маски на лицо, подобная недоработка будет заметна. Поэтому стоит разобраться в решении.

Этот случай можно определить как перекрытие объекта самим собой.

Однозначно для такой маски нужен transparent (прозрачный) шейдер. Только вот подобные шейдеры в Unity, из коробки, не предназначены для таких магических задач. Остается только писать свой или же доработать существующий. В этом нет ничего страшного, а проблему помогут исправить несколько заветных строчек кода:

SubShader {
         Tags { "RenderType"="Opaque" }
         LOD 200
         Pass{
                ZWrite On
                 ColorMask 0
}

Вкратце, происходит добавление дополнительного прохода(pass) в начало шейдера. Этот проход отвечает за запись глубины и отрисовку пикселя. Подробнее можно прочитать здесь.

В результате, без колдовства, удалось замаскировать то, что должно быть скрыто от глаз.

image
рис. 2