Отметим: когда VR-проект на Unity переходит с Multi Pass на Single Pass Instanced, первое, что ломается — кастомные шейдеры. Причина не в багах, а в ожидаемом поведении: шейдеры, написанные для одноглазого рендера, не учитывают стерео-индекс и матрицы. Без правильной адаптации один глаз видит артефакты, а второй — пустой экран. Наши инженеры с 10-летним опытом в геймдеве решают эту проблему комплексно: аудит, фикс, тестирование на двух устройствах. Результат — стабильные 90+ FPS на Quest 3 без визуальных искажений.
Сбои шейдеров при активации Single Pass Instanced
Включить 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 большинство встроенных шейдеров уже совместимы, но кастомные рендер пассы в ScriptableRendererFeature часто написаны без учёта стерео.
Диагностика проблем с Single Pass Instanced
Первый признак — артефакты строго на одном глазу. В Frame Debugger видно: вместо одного draw call с [Instanced: 2] идут два отдельных вызова. Это значит, что инстансинг не применился к объекту. Причины: GPU Instancing выключен на материале, использование MaterialPropertyBlock с разными данными на инстанс, или превышение лимита вертексов для динамического батчинга.
В URP с Forward Renderer проблемы часто в Post Processing. Эффекты Depth of Field, Motion Blur, Bloom не поддерживают стерео напрямую — применяются к одному renderTarget и дублируются, давая визуальный сдвиг. Решение — использовать VR Mode в Post Processing Volume или писать стерео-совместимые шейдеры вручную.
Подводные камни с текстурными атласами и UV
Single Pass Instanced использует Texture2DArray для рендер-таргетов обоих глаз. Шейдеры, семплирующие _CameraDepthTexture или _CameraColorTexture, должны делать это через SAMPLE_TEXTURE2D_ARRAY с индексом слоя unity_StereoEyeIndex, а не через SAMPLE_TEXTURE2D. Кастомные эффекты постобработки, написанные для обычного рендера, часто семплируют глубину как 2D-текстуру — в Single Pass Instanced получают глубину только левого глаза для обоих вьюпортов. Визуально: SSAO или outline работают правильно для левого глаза, а для правого смещены или отсутствуют.
Как проверить совместимость шейдеров?
Пошаговая процедура:
- Включите Single Pass Instanced в XR Plugin Management.
- Откройте Frame Debugger во время запуска сцены.
- Найдите draw call для каждого объекта. Если он помечен
[Instanced: 2]— шейдер совместим. - Если вместо этого два отдельных draw call — проблема в шейдере или материале.
- Визуально проверьте артефакты: наденьте гарнитуру и посмотрите на сцену двумя глазами.
Типовые ошибки в кастомных шейдерах
- Отсутствие макроса
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEXв вертексном шейдере. - Использование
TransformationMatrixMвместоUNITY_MATRIX_MVP. - Семплинг текстуры без учёта
unity_StereoEyeIndexпри работе сTexture2DArray. - Применение эффектов постобработки, не совместимых с
VR Mode.
Что даёт Single Pass Instanced в цифрах?
| Метрика | Multi Pass | Single Pass Instanced | Улучшение |
|---|---|---|---|
| CPU-нагрузка на фрейм | 100% (база) | 40-60% | Снижение до 60% |
| Draw calls на глаз | ~2x отдельных | 1 инстансированный | Уменьшение в 2 раза |
| FPS в тяжелой сцене (Quest 3) | 45 FPS | 72 FPS | +60% |
| GPU-нагрузка | 100% | ~70% | Снижение на 30% |
Производительность на практике: по нашим замерам на Quest 3 с CPU-heavy сценами, Single Pass Instanced даёт прирост FPS от 15% до 40%. Сравнение с Multi Pass: CPU-нагрузка в 2–3 раза меньше (подтверждено документацией Unity).
Что входит в нашу работу
Мы берём полный цикл перехода: аудит всех шейдеров и рендер-пассов, починка (добавление стерео-макросов, адаптация кастомных эффектов), настройка XR Plugin Management, постобработки и батчинга, тестирование на двух устройствах (Multi Pass эталон vs Single Pass Instanced) с записью профайлера. Предоставляем отчёт с изменениями и гарантируем совместимость.
| Объём проекта | Количество кастомных шейдеров | Ориентировочные сроки |
|---|---|---|
| Небольшой | до 10 | 3–7 дней |
| Средний | 10–30 | 1–3 недели |
| Крупный (с постобработкой и кастомным RP) | 30+ | 3–6 недель |
Стоимость рассчитывается после аудита шейдерной базы и анализа текущего рендер-пайплайна. Закажите консультацию — мы бесплатно оценим ваш проект за один день.
Процесс перехода на Single Pass Instanced
Стандартный план: включаем SPI → собираем список шейдеров с ошибками → приоритизируем по видимости → фиксим по очереди. Обычно 70–80% шейдеров работают без изменений, 15–20% требуют добавления стерео-макросов, 5–10% нужно переписывать или заменять.
Тестирование ведётся параллельно на двух гарнитурах: одна в Multi Pass (эталон), вторая в Single Pass Instanced. Сравниваем каждую сцену визуально и по профайлеру. Гарантируем совместимость всех исправленных шейдеров — если после внедрения возникнут артефакты, доработаем бесплатно.
Свяжитесь с нами для бесплатного аудита вашего проекта. Получите консультацию прямо сейчас — напишите, и мы предложим оптимальный план перехода с учётом вашего стека и сроков.






