Разработка шейдеров прозрачности для стекол AR-шлемов

Наша компания по разработке видеоигр ведет независимые проекты, совместно с клиентом создает игры и оказывает дополнительные операционные услуги. Опыт нашей команды позволяет нам охватить все игровые платформы и разработать потрясающий продукт, соответствующий видению клиента и предпочтениям игроков.

От иммерсивных приложений до игровых миров и 3D-сцен

Наша выделенная команда для VR/AR/MR-разработки, Unity-продакшна и 3D-моделирования и анимации с собственными кейсами и презентациями.

Посетить персонализированный сайт
Показано 1 из 1Все 242 услуг
Разработка шейдеров прозрачности для стекол AR-шлемов
Сложный
~1-2 недели
Часто задаваемые вопросы

Наши компетенции

Какие этапы разработки игры?

Последние работы

  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    1421
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    954
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    577
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    637

Разработка шейдеров прозрачности для стекол AR шлемов в играх

Мы разрабатываем оптимизированные шейдеры для AR-шлемов, учитывающие особенности аддитивных дисплеев. Наш опыт включает проекты для HoloLens 2 и Magic Leap 2, где каждая голограмма должна быть чёткой и естественно вписываться в окружение. Без понимания физики дисплея шейдеры дают графику, которая либо неразличима в светлых помещениях, либо выглядит как мутное пятно на тёмных объектах.

HoloLens 2 и Magic Leap 2 — аддитивные дисплеи. Они не рисуют чёрный фон: голограммы накладываются прямо на то, что видит пользователь через стекло. Это фундаментально меняет логику шейдеров. «Прозрачность» здесь — не альфа-блендинг поверх виртуального фона, а буквальная прозрачность для реального мира, проходящего через линзы.

Почему стандартные шейдеры не подходят для AR-шлемов?

На аддитивном дисплее пиксель с цветом (0, 0, 0) — абсолютно прозрачный. Чёрный цвет буквально не излучает свет. Это значит, что тёмные участки голограммы не маскируют реальный мир — сквозь них всё видно. Для создания иллюзии непрозрачного объекта нужно, чтобы объект был достаточно ярким относительно окружающего освещения.

Следствие первое: стандартные шейдеры Unity с Rendering Mode = Opaque будут выглядеть не непрозрачными, а полупрозрачными, потому что их «тёмные» части — тени, AO, затемнённые грани — пропускают реальный мир насквозь. Шейдер для HoloLens должен минимизировать тёмные области. Ambient lighting нужно поднимать значительно выше физически корректных значений — на практике Environment Lighting Intensity Multiplier от 1.5 до 2.5 в зависимости от сцены.

Следствие второе: альфа-канал на аддитивном дисплее работает иначе. Alpha = 0 даёт полную прозрачность (не виден ни реальный мир, ни голограмма — пиксель просто не светится). Но промежуточные значения альфа используются для плавного появления/исчезновения голограммы, а не для смешения с задним планом. Нет никакого «заднего плана» кроме реального мира.

Как создать эффект прозрачного стекла в ShaderGraph?

Основная задача в играх для AR шлемов — создать эффект прозрачного стекла с контролируемой степенью помутнения. Например, защитный щит, который частично блокирует обзор, или иллюминатор космического корабля.

В ShaderGraph (URP) это строится так: базовый цвет объекта смешивается с Fresnel Effect для акцента на краях (стекло сильнее отражает под углом). Зона чистой прозрачности в центре — Alpha близко к нулю, края — Alpha выше через Smoothstep. На тёмном объекте за стеклом эффект будет заметен, на светлом — почти нет, потому что аддитивный дисплей не затемняет реальный мир.

Для эффекта «запотевшего стекла» используется Procedural Noise в качестве маски — она нарушает однородность прозрачности и создаёт органичный вид. Но нельзя использовать тёмные значения в noise-маске для «помутнения»: тёмные области просто станут прозрачными. Помутнение на аддитивном дисплее делается светлым цветом поверх, не тёмным.

Отдельный шейдер — окантовка объекта. Стандартный outline через Stencil или Normal Extrusion не работает хорошо на аддитивных дисплеях, потому что тёмная окантовка невидима. Нужен светящийся outline: Emission на контурных пикселях с интенсивностью 2–4, цвет — тёплый или насыщенный (синий, зелёный работают лучше красного из-за спектра аддитивного дисплея).

Работа с MRTK и Mixed Reality Toolkit

Для HoloLens разработка ведётся через MRTK (Mixed Reality Toolkit). Согласно официальной документации Microsoft, есть готовый MRTKStandardShader, оптимизированный под аддитивные дисплеи — он учитывает ограничения платформы и работает значительно лучше стандартного URP Lit шейдера. Но его возможности ограничены, и для кастомных эффектов нужно писать кастомные шейдеры с учётом тех же принципов.

Magic Leap 2 использует другой SDK — Magic Leap Unity SDK, — но физика дисплея та же: аддитивный, только более яркий. Шейдеры, написанные для HoloLens, в основном переносятся напрямую, но нужно пересматривать пороги ambient intensity из-за разной яркости дисплея. Экономия времени на отладку достигает 40% по сравнению с самостоятельной разработкой.

Кейс: интерфейс кабины с прозрачными экранами (из нашей практики)

В AR-симуляторе кабины самолёта нужно было реализовать приборные панели, которые видны поверх реального кресла пилота. Экраны должны выглядеть как стеклянные — с видимостью сквозь них реального оборудования за экраном.

Проблема: эмиссивные элементы интерфейса (шкалы, числа) были яркими и читаемыми. Но «подложка» экрана — тёмно-серый прямоугольник — была практически невидима (аддитивный дисплей не показывает тёмные цвета). Интерфейс висел «в воздухе» без рамки, которая давала бы ощущение физического экрана.

Решение: замена тёмной подложки на слабо светящуюся (Emission 0.15, цвет тёплый серый). Это добавило достаточно свечения, чтобы граница экрана была видна, но не настолько яркого, чтобы перекрывать реальный мир. Дополнительно — Fresnel на краях корпуса с интенсивностью 0.3 для акцента формы.

Тип шейдера Сложность Ориентировочные сроки
Кастомизация MRTKStandardShader Средняя 2–5 дней
Шейдер прозрачного стекла (ShaderGraph) Средняя 3–7 дней
Сложный эффект (запотевание, динамическое помутнение) Высокая 1–3 недели
Портирование шейдеров между платформами Зависит от набора 1–2 недели

Процесс разработки шейдера под AR

  1. Анализ платформы и требований — определяем целевое устройство (HoloLens 2, Magic Leap 2 и т.д.), требования к производительности и визуалу.
  2. Проектирование шейдера — выбираем подход: кастомизация MRTKStandardShader или создание кастомного шейдера в ShaderGraph/HLSL.
  3. Реализация — пишем шейдер, настраиваем параметры (ambient, emission, alpha).
  4. Тестирование на устройстве — проверяем в реальных условиях освещения, оптимизируем draw calls и fill rate.
  5. Деплой и сопровождение — передаём исходники, документацию, обучаем команду.

Что входит в работу

Этап Результат
Исходные коды шейдера .shader или .shadergraph, включая комментарии
Конфигурация материалов Unity Material с настроенными параметрами
Документация Описание принципов работы и инструкция по настройке
Поддержка Консультации в течение 1 месяца после сдачи
Типичные ошибки при разработке шейдеров для AR
  • Использование тёмных цветов для помутнения — на аддитивном дисплее они становятся прозрачными.
  • Игнорирование Fresnel Effect — без него стекло выглядит плоским.
  • Применение стандартного Outline без эмиссии — окантовка невидима.
  • Отсутствие тестов при разном освещении — шейдер может работать только в темноте.

Сроки и стоимость

Стоимость разработки шейдера варьируется в зависимости от сложности, точную сумму рассчитываем после анализа вашего проекта — свяжитесь с нами для оценки. Мы гарантируем корректную работу на всех поддерживаемых устройствах и предоставляем исходные коды. Наш опыт — более 10 лет в геймдеве и AR, свыше 50 реализованных проектов. Получите консультацию прямо сейчас.

VR и AR разработка

Когда мы впервые запускаем проект в VR-гарнитуре, большинство команд сталкивается с одним и тем же: технически всё работает, но в гарнитуре либо укачивает, либо руки «плавают» с задержкой, либо сцена выглядит дёрганой на периферии взгляда. Это не баги в привычном смысле — это следствие того, что VR/AR разработка требует другого подхода к архитектуре рендера, взаимодействию и UX с самого начала проекта. Наш опыт — более 7 лет в геймдеве, 15+ завершённых VR/AR-проектов для Meta Quest, SteamVR, PSVR2, HoloLens.

Платформы и SDK

Работаем со всем актуальным стеком. OpenXR используем как базовый слой везде, где это возможно — он даёт кроссплатформенность между Meta, Valve Index, HP Reverb и другими PC VR-устройствами (OpenXR на Wikipedia). Поверх OpenXR строим на XR Interaction Toolkit (Unity) или VR Expansion Plugin (Unreal).

Платформа SDK / Framework
Meta Quest 2/3/Pro Meta XR SDK, OpenXR
PC VR (SteamVR) SteamVR Plugin, OpenXR
PlayStation VR2 Sony PSVR2 SDK
HoloLens 2 Mixed Reality Toolkit (MRTK)
ARKit (iOS) AR Foundation + ARKit XR Plugin
ARCore (Android) AR Foundation + ARCore XR Plugin
WebXR Unity WebXR Export

Как минимизировать укачивание при локомоции в VR?

Locomotion — главный источник motion sickness для неопытных VR-пользователей. Согласно исследованиям, около 70% пользователей испытывают дискомфорт при неправильной настройке движения (Oculus Developer Guidelines). Teleportation — стандартный способ навигации, когда плавное передвижение нежелательно.

Компоненты из XR Interaction Toolkit: TeleportationArea, TeleportationAnchor, TeleportationProvider. Базовая реализация работает «из коробки», но для продакшна дорабатываем её в четыре шага:

  1. Настройка XRRayInteractor с изогнутым лучом (Bend Ray) — дуга телепортации выглядит натуральнее прямого луча, лучше считывается пользователями.
  2. Добавление валидной зоны приземления — визуальный индикатор меняет цвет при наведении на препятствие (красный/зелёный).
  3. Внедрение fade transition — плавное затухание экрана (black fade) перед телепортом снижает дезориентацию.
  4. Rotation snapping — после телепорта предлагаем snap-поворот на 45° или 90° вместо плавного, что снижает риск укачивания.

Для проектов, где нужна плавная локомоция (экшн-игры, симуляторы), используем comfort settings: виньетирование при движении, снижение FOV во время ускорения. Настройки доступны пользователю в меню — разные люди имеют разный порог чувствительности.

Детали реализации: Kinematic vs Physics-based movement

При захвате объекта ключевой выбор — Kinematic (мгновенное следование за рукой) или Physics-based (удержание через Joint). Первое отзывчиво, но объекты проходят сквозь стены. Второе даёт реалистичные коллизии, но при быстрых движениях joint «растягивается» — потребуется velocity damping и max joint force.

Как сделать захват объектов в VR физически реалистичным?

Это самая недооценённая часть VR-разработки. Клиенты часто воспринимают её как «просто анимация рук», но на практике — сложная система, где физическая корректность, отзывчивость и комфорт вступают в противоречие.

Grab (захват)

XR Interaction Toolkit предоставляет три типа Interactable для захвата:

  • XRGrabInteractable — стандартный захват, объект следует за контроллером через физический joint или direct position/rotation
  • XRSimpleInteractable — для объектов без физического перемещения (кнопки, рычаги)
  • Кастомные Interactable через наследование от XRBaseInteractable

Attach Transform — часто игнорируемая деталь. У каждого Interactable должен быть правильно настроенный Attach Transform (точка, к которой рука «прилипает»). Без него рукоятка пистолета окажется по центру меша, а не там, где её держат.

Для оружия и инструментов с двуручным захватом — отдельная система TwoHandGrab: ведущая рука определяет позицию, вторая — ориентацию. XR Interaction Toolkit поддерживает это через XRTwoHandGrabInteractable или кастомную логику с двумя Attach Points.

Throw (бросок)

Почему velocity smoothing критично для реалистичного броска? Проблема в том, что Rigidbody.velocity в момент отпускания контроллера отражает мгновенную скорость, которая часто некорректна из-за дискретизации трекинга. Пользователь делает быстрое движение запястьем — а объект летит вдвое медленнее.

Решение: velocity smoothing за последние N кадров (типично 5-10 кадров, ~80-160 мс при 60 Hz) перед отпусканием. XR Interaction Toolkit делает это через VelocityEstimator. Дополнительно применяем velocity scaling multiplier — небольшое умножение скорости (1.2-1.5x) делает броски субъективно более удовлетворительными. Угловую скорость (для объектов, которые должны крутиться в полёте) тоже усредняем аналогичным образом.

AR: Plane Tracking и работа с окружением

AR добавляет другой класс проблем — работу с реальным, непредсказуемым окружением. AR Foundation — кроссплатформенный слой поверх ARKit и ARCore. Большинство базовых функций (plane detection, raycasting, image tracking, face tracking) доступны через единый API.

Plane Detection

ARPlaneManager обнаруживает горизонтальные и вертикальные плоскости. Практические нюансы:

  • Инициализация занимает время — пользователь должен осмотреть помещение, пока система строит карту. Нужен явный onboarding с инструкцией «медленно поводите камерой по поверхностям».
  • Плоскости нестабильны — их границы и позиция обновляются по мере накопления данных. Объекты, размещённые на плоскости, нужно привязывать через parenting к ARPlane, а не к мировым координатам.
  • Слияние плоскостей — два обнаруженных сегмента пола могут слиться в один, что двигает якорь. Для критичных якорей используем ARAnchor вместо прямой привязки к плоскости.
Детали Image Tracking

ARTrackedImageManager — для маркеров. Качество трекинга напрямую зависит от качества reference image. Изображения с высокой частотой деталей и контрастными краями (как QR-код, но красиво) трекаются надёжнее, чем гладкие логотипы. ARCore Geospatial API — для outdoor AR с привязкой к реальным координатам (точность до 10 см в хорошо картированных зонах).

Оптимизация для VR: фреймрейт и комфорт

VR требует стабильного высокого фреймрейта. Около 60% времени разработки в мобильном VR уходит на оптимизацию, а не на функционал — ретрофит в два раза дороже правильной архитектуры с первого спринта.

Устройство Целевой Hz Критический порог
Meta Quest 2 72 / 90 Hz < 72 Hz — заметно
Meta Quest 3 90 / 120 Hz < 90 Hz — заметно
Valve Index 90 / 120 / 144 Hz < 90 Hz — заметно
PSVR2 90 / 120 Hz < 90 Hz — заметно

Single Pass Instanced Rendering

Главная оптимизация рендера в VR. Без неё сцена рендерится дважды (для каждого глаза), что удваивает draw calls. Single Pass Instanced рендерит оба глаза за один проход через instancing: geometry обрабатывается один раз, шейдер получает два view/projection matrix через GPU instancing. Включается в Unity через XR Plug-in Management > Rendering Mode: Single Pass Instanced. Важно: кастомные шейдеры должны поддерживать SPI — стандартные URP/HDRP шейдеры поддерживают, кастомные HLSL требуют правки (UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX и связанные макросы). Применение этой техники сокращает количество draw calls на 40-50%.

Foveated Rendering

На Meta Quest доступен Fixed Foveated Rendering (FFR) — снижение разрешения на периферии кадра, где острота восприятия ниже. Настраивается через OVRManager или Meta XR SDK:

OVRManager.fixedFoveatedRenderingLevel = OVRManager.FixedFoveatedRenderingLevel.High;
OVRManager.useDynamicFixedFoveatedRendering = true;

Dynamic FFR автоматически повышает уровень при просадке фреймрейта — удобнее фиксированного в сценах с переменной нагрузкой.

IPD и Comfort Settings

IPD (Inter-Pupillary Distance) — расстояние между зрачками, влияет на восприятие глубины. На программируемом уровне в большинстве устройств доступно только чтение IPD (OVRPlugin.GetSystemDisplayFrequency), физическая настройка — на гарнитуре. Для приложений с точным позиционированием (медицинские симуляторы, тренинги) учитываем IPD в расчётах масштаба сцены.

Haptics

Тактильный фидбек — недооценённый инструмент. Даже простой вибрационный отклик при захвате объекта или попадании значительно повышает ощущение присутствия. В среднем интеграция тактильных паттернов занимает 30–80 часов на проект.

XR Haptics через OpenXR:

var hapticImpulse = new UnityEngine.XR.HapticCapabilities();
InputDevice device = InputDevices.GetDeviceAtXRNode(XRNode.RightHand);
device.SendHapticImpulse(0, amplitude: 0.5f, duration: 0.1f);

Для сложных паттернов (тактильная «текстура» поверхности при прикосновении, нарастающая вибрация при натяжении тетивы лука) используем Meta Haptics Studio — позволяет дизайнить haptic-клипы визуально.

Что входит в разработку VR/AR-приложения

При заказе проекта под ключ мы предоставляем:

  • Архитектурный документ с описанием стека, логики рендера и системы взаимодействия
  • Рабочий прототип (MVP) для тестирования на целевом устройстве
  • Интеграцию необходимых SDK (Meta XR, OpenXR, AR Foundation и др.)
  • Оптимизацию под целевые частоты 72/90/120 Hz с профилированием draw calls и FPS
  • Тестирование на физическом оборудовании (Quest, SteamVR, HoloLens) с привлечением пользователей
  • Полную документацию по сборке, деплою и поддержке
  • Обучение команды заказчика (воркшоп по работе с XR Toolkit)
  • Гарантийную поддержку в течение 1 месяца после сдачи

Что влияет на стоимость и сроки

VR/AR проекты дороже обычных игр аналогичного объёма. Итерации медленнее — каждую правку нужно тестировать в гарнитуре, эмулятор не передаёт реальный опыт. Motion sickness вынуждает переделывать часть концептуальных решений после первого плейтеста. Оптимизация занимает существенную долю времени — для мобильного VR (Quest) до 60-70% цикла. Для проектов под Quest начинаем оптимизацию с первого спринта. Стоимость интеграции базового SDK (XR Interaction Toolkit) обычно варьируется от 200 000 до 600 000 рублей в зависимости от объёма кастомных Interactable. Средний бюджет полного проекта под Quest составляет от 1 500 000 до 4 000 000 рублей.

Получите консультацию по вашему проекту — оценим задачу, стек и сроки. Закажите разработку VR/AR-приложения под ключ с гарантией стабильного фреймрейта.