Настройка Single Pass Instanced рендеринга для ускорения графики

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

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

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

Посетить персонализированный сайт
Показано 1 из 1 услугВсе 242 услуг
Настройка Single Pass Instanced рендеринга для ускорения графики
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции
Какие этапы разработки игры?
Последние работы
  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    671
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    860
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    490
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    533

tags: [vr-ar]

Настройка Single Pass Instanced рендеринга для ускорения графики

В Multi Pass рендеринге каждый фрейм VR отрисовывается дважды — отдельно для левого и правого глаза. Два полных прохода через весь рендер-пайплайн, два набора draw calls, двойная нагрузка на CPU. Single Pass Instanced решает это иначе: один проход, где геометрия инстансируется для обоих глаз одновременно через стерео-инстансинг. GPU обрабатывает два viewport за один вызов.

На Meta Quest 3 переход с Multi Pass на Single Pass Instanced даёт от 15% до 40% прироста производительности в CPU-heavy сценах. Это не гипотетическая оптимизация — это первое, что стоит сделать при портировании игры в VR.

Почему Simple переход ломает шейдеры

Включить Single Pass Instanced в Project Settings → XR Plugin Management — это одна галочка. После неё часть шейдеров перестаёт работать корректно. Это не баг настройки, это ожидаемое поведение.

В Single Pass Instanced шейдер получает стерео-индекс (unity_StereoEyeIndex) — 0 для левого глаза, 1 для правого. Матрицы проекции и вида тоже хранятся как массивы unity_StereoMatrixVP[2]. Шейдеры, написанные без учёта этого, используют только unity_MatrixVP — единственную матрицу для одного глаза — и визуально работают корректно только для одного глаза. Второй либо смещён, либо показывает картинку первого.

Surface Shaders в Built-in RP автоматически совместимы — Unity добавляет нужные макросы при компиляции. Кастомные Vertex/Fragment шейдеры требуют ручного использования макросов UNITY_MATRIX_MVP, UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX, UNITY_TRANSFER_STEREO_EYE_INDEX. Пропустить любой из них — и один глаз рендерится с артефактами.

В URP ситуация немного чище: большинство встроенных шейдеров уже совместимы с Single Pass Instanced через stereo matrices в UnityPerDraw cbuffer. Но кастомные рендер пассы в ScriptableRendererFeature часто написаны без учёта стерео — особенно если брались из туториалов для обычных игр.

Диагностика через Frame Debugger

Первый признак проблемы с Single Pass Instanced — артефакты строго на одном глазу. В Frame Debugger видно: вместо одного draw call с [Instanced: 2] идут два отдельных вызова — это значит, что инстансинг не применился для конкретного объекта.

Причин несколько. GPU Instancing выключен на материале — самое простое. Или материал использует MaterialPropertyBlock с данными, которые различаются на каждый инстанс — это ломает стандартный инстансинг (нужен специальный instanced property в шейдере). Или меш выходит за лимит вертексов для динамического батчинга — но это уже другой путь.

В URP с Forward Renderer проблемы чаще всего в Post Processing. Эффекты типа Depth of Field, Motion Blur, Bloom в большинстве реализаций не поддерживают стерео напрямую — они применяются к одному из renderTargets и дублируются, что даёт визуальный сдвиг. Решение — использовать VR Mode в Post Processing Volume, либо для критичных эффектов писать стерео-совместимые шейдеры вручную.

Подводные камни с текстурными атласами и UV

Single Pass Instanced использует Texture2DArray для рендер-таргетов обоих глаз. Это значит, что любой шейдер, который семплирует _CameraDepthTexture или _CameraColorTexture, должен делать это через SAMPLE_TEXTURE2D_ARRAY с правильным индексом слоя (unity_StereoEyeIndex), а не через обычный SAMPLE_TEXTURE2D.

Кастомные эффекты постобработки, написанные для обычного рендера, часто семплируют _CameraDepthTexture как обычную 2D-текстуру. В Single Pass Instanced это даёт глубину только левого глаза для обоих вьюпортов. Визуально: эффекты типа SSAO или outline работают правильно для левого глаза, а для правого — смещены или вовсе отсутствуют.

Процесс перехода на Single Pass Instanced

Стандартный план работы: включаем SPI → собираем список шейдеров с ошибками → приоритизируем по видимости → фиксируем по очереди. Обычно 70–80% шейдеров работают без изменений, 15–20% требуют добавления стерео-макросов, 5–10% нужно переписывать или искать альтернативу.

Тестирование ведётся параллельно на двух устройствах: одно в Multi Pass (эталон), второе в Single Pass Instanced. Сравниваем каждую сцену визуально и по профайлеру.

Объём проекта Количество кастомных шейдеров Ориентировочные сроки
Небольшой (до 10 кастомных шейдеров) До 10 3–7 дней
Средний 10–30 1–3 недели
Крупный (с постобработкой и кастомным RP) 30+ 3–6 недель

Стоимость рассчитывается после аудита шейдерной базы проекта и анализа текущего рендер-пайплайна.