Зауважимо: коли 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. Порівнюємо кожну сцену візуально та за профайлером. Гарантуємо сумісність усіх виправлених шейдерів — якщо після впровадження виникнуть артефакти, доопрацюємо безкоштовно.
Зв'яжіться з нами для безкоштовного аудиту вашого проєкту. Отримайте консультацію прямо зараз — напишіть, і ми запропонуємо оптимальний план переходу з урахуванням вашого стеку та термінів.






