Single Pass Instanced: налаштування та оптимізація VR-рендерингу

Зауважимо: коли VR-проєкт на Unity переходить з Multi Pass на Single Pass Instanced, перше, що ламається — кастомні шейдери. Причина не в багах, а в очікуваній поведінці: шейдери, написані для одноглазого рендеру, не враховують стерео-індекс і матриці. Без правильної адаптації одне око бачить артефа

Наші компетенції

Інші послуги студії

VR/AR/MR застосунки на замовлення

Вражайте клієнтів і навчайте команду у віртуальній реальності

Розробка ігор на Unity

Від ідеї до релізу — ігри, які запам'ятовуються

3D-моделювання та анімація

Оживимо ваш продукт в об'ємній графіці та анімації

VR-тренажери промислового обладнання

Тренуємо операторів на техніці без ризику і простою

AR-інструкції для виробництва

Покрокові підказки прямо на обладнанні — без паперу

Safety-тренажери

Відпрацювання НС і техніки безпеки без виходу на об'єкт

VR/AR-тренінги

Навчаємо персонал сервісу, адаптації та soft skills у VR

Навчальні вікторини

Перевірка знань у форматі гри — легко і без стресу

Корпоративні відеоінструкції

Зрозумілі ролики для навчання співробітників і клієнтів

Гейміфікація бізнес-процесів

Мотивуємо команду через ігрові механіки в KPI та HR

Застосунки для інфокіосків

Інтерактивні екрани для магазинів, стендів і офісів

VR/AR-інсталяції

Wow-ефект для брендів на виставках, івентах і в шоу-румах

Віртуальні виставки та музеї

Ваша експозиція доступна з будь-якої точки світу — 24/7

Event-квести та брендовані ігри

Незабутні ігри для конференцій та клієнтських івентів

Часті запитання

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    1504
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    1006
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    635
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    716
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Навчальна вікторина для дітей «Покупки в магазині»
    95

Зауважимо: коли 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 працюють правильно для лівого ока, а для правого зміщені або відсутні.

Як перевірити сумісність шейдерів?

Покрокова процедура:

  1. Увімкніть Single Pass Instanced в XR Plugin Management.
  2. Відкрийте Frame Debugger під час запуску сцени.
  3. Знайдіть draw call для кожного об'єкта. Якщо він позначений [Instanced: 2] — шейдер сумісний.
  4. Якщо замість цього два окремі draw call — проблема в шейдері або матеріалі.
  5. Візуально перевірте артефакти: надягніть гарнітуру та подивіться на сцену двома очима.
Типові помилки в кастомних шейдерах
  • Відсутність макросу 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. Порівнюємо кожну сцену візуально та за профайлером. Гарантуємо сумісність усіх виправлених шейдерів — якщо після впровадження виникнуть артефакти, доопрацюємо безкоштовно.

Зв'яжіться з нами для безкоштовного аудиту вашого проєкту. Отримайте консультацію прямо зараз — напишіть, і ми запропонуємо оптимальний план переходу з урахуванням вашого стеку та термінів.