AR / Сквозная передача
Дополненная реальность поддерживается различными методами в зависимости от возможностей оборудования.
Такие гарнитуры, как Magic Leap, и очки, например, TiltFive, показывают визуализированный результат на прозрачных дисплеях, позволяя пользователю видеть реальный мир.
В таких гарнитурах, как Quest, HTC Elite и Lynx R1, это реализовано с помощью технологии, называемой сквозной передачей видео, когда камеры записывают реальный мир, а эти изображения используются в качестве фона, поверх которого используется наш визуализированный результат.
Примечание
Сквозная передача реализована по-разному на разных платформах.
В Godot 4.3 мы реализовали единый подход, который объясняется на этой странице справки, поэтому вам не нужно беспокоиться об этих различиях. Реализация XRInterface теперь отвечает за применение правильного платформенно-зависимого метода [1].
Для таких гарнитур, как Meta Quest и HTC Elite, вам потребуется использовать плагин OpenXR vendors plugin v3.0.0 или более позднюю версию, чтобы включить сквозную передачу видео.
Для обеспечения обратной совместимости старый API для сквозной передачи по-прежнему доступен, но рекомендуется следовать новым инструкциям, приведенным ниже.
Режимы смешивания окружения
Функциональность виртуальной и дополненной реальности настраивается посредством установки режима смешивания окружения. Этот режим определяет, как реальная среда смешивается с виртуальным миром.
Режим смешивания |
Описание |
|---|---|
XR_ENV_BLEND_MODE_OPAQUE |
Визуализированное изображение непрозрачно, мы не видим реальный мир. Мы находимся в режиме VR. Это отключит сквозную передачу, если используется сквозная передача видео. |
XR_ENV_BLEND_MODE_ADDITIVE |
Визуализированное изображение добавляется к реальному миру и выглядит полупрозрачным. Этот режим обычно используется с прозрачными устройствами, которые не могут загораживать реальный мир. При использовании сквозного видеопропускания включается сквозное прохождение. |
XR_ENV_BLEND_MODE_ALPHA_BLEND |
Визуализированное изображение подвергается альфа-смешиванию с реальным миром. На устройствах с поддержкой прозрачного изображения, поддерживающих эту функцию, альфа-канал управляет прозрачностью оптики. На устройствах с поддержкой видеосигнала альфа-канал применяется к видеоизображению. При необходимости также будет включена функция сквозного пропускания. |
Вы можете установить режим смешивания среды для своего приложения через свойство environment_blend_mode экземпляра XRInterface.
Вы можете запросить поддерживаемые аппаратным обеспечением режимы смешивания, используя свойство get_supported_environment_blend_modes в том же экземпляре.
Настройка вашего фона
При установке режима смешивания XR_ENV_BLEND_MODE_ALPHA_BLEND необходимо установить свойство transparent_bg для Viewport в значение true. При использовании режима смешивания XR_ENV_BLEND_MODE_ADDITIVE необходимо установить цвет фона чёрным.
В любом случае рендеринг фона не будет учитываться при освещении. Поэтому рекомендуется соответствующим образом настроить параметры окружающей среды и убедиться, что окружающее освещение достаточно для освещения сцены.
Примечание
Некоторые AR SDK предоставляют информацию об окружающем освещении или даже полную карту яркости, чтобы учитывать отражения реального мира в виртуальных объектах. Базовый функционал Godot XR в настоящее время не поддерживает эту функцию, однако её можно реализовать с помощью плагинов.
Специфика OpenXR
В OpenXR можно настроить режим смешивания по умолчанию. Godot выберет этот режим смешивания при запуске, если он доступен. Если он недоступен, Godot по умолчанию использует первый поддерживаемый режим смешивания, предоставляемый средой выполнения XR.
Для устройств сквозного доступа OpenXR требует настройки дополнительных параметров. Эти параметры зависят от платформы и предоставляются через плагин OpenXR Vendor.
Например, вот настройки, требуемые для Meta Quest:
Параметр Passthrough определяет, поддерживается ли сквозной пропуск или требуется ли он вообще.
Boundary Mode позволяет вам определить, нужен ли защитник, при его полном отключении сквозная передача должна быть включена постоянно.
Собираем всё вместе
Объединяя все вышесказанное, мы можем использовать следующий код в качестве основы:
@onready var viewport : Viewport = get_viewport()
@onready var environment : Environment = $WorldEnvironment.environment
func switch_to_ar() -> bool:
var xr_interface: XRInterface = XRServer.primary_interface
if xr_interface:
var modes = xr_interface.get_supported_environment_blend_modes()
if XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND in modes:
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND
viewport.transparent_bg = true
elif XRInterface.XR_ENV_BLEND_MODE_ADDITIVE in modes:
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ADDITIVE
viewport.transparent_bg = false
else:
return false
environment.background_mode = Environment.BG_COLOR
environment.background_color = Color(0.0, 0.0, 0.0, 0.0)
environment.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
return true
func switch_to_vr() -> bool:
var xr_interface: XRInterface = XRServer.primary_interface
if xr_interface:
var modes = xr_interface.get_supported_environment_blend_modes()
if XRInterface.XR_ENV_BLEND_MODE_OPAQUE in modes:
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_OPAQUE
else:
return false
viewport.transparent_bg = false
environment.background_mode = Environment.BG_SKY
environment.ambient_light_source = Environment.AMBIENT_SOURCE_BG
return true
От тени к непрозрачности
"От тени к непрозрачности" — это режим рендеринга пространственных шейдеров Godot, представленный в Godot 3 специально для дополненной реальности. Это особый режим рендеринга, в котором чем больше поверхность находится в тени, тем более непрозрачной она становится. Когда поверхность полностью освещена, она становится полностью прозрачной, отображая реальный мир.
Однако в непрозрачном состоянии поверхность фактически визуализируется. Это имеет два последствия:
Поскольку записываются как буфер глубины, так и буфер цвета, мы скрываем любую геометрию за нашей поверхностью, даже если она полностью прозрачна.
Поскольку мы делаем поверхность непрозрачной, если она находится в тени, мы можем заставить виртуальные объекты отбрасывать тени на объекты реального мира [2].
На изображении показано, как для отображения рабочего стола пользователя используется переход от тени к непрозрачности.
Это позволило реализовать следующие варианты использования:
Вы можете визуализировать сетку-бокс вокруг реального стола, это гарантирует, что стол останется видимым, даже если под ним помещен виртуальный объект. Виртуальный объект будет корректно перекрыт. Размещение виртуального объекта поверх реального стола приведёт к появлению тени на столе.
Вы можете использовать шейдер с этим режимом рендеринга при рендеринге сетки руки с использованием функции отслеживания рук и убедиться, что ваши руки правильно перекрывают виртуальные объекты.
Следующий код шейдера является хорошей основой для этой функциональности:
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, shadow_to_opacity;
void fragment() {
ALBEDO = vec3(0.0, 0.0, 0.0);
}