AR/VR
VR Rendering
2016 год. Первые потребители Oculus Rift массово жалуются на тошноту. Команда инженеров обнаруживает: проблема не в дисплее и не в трекинге - проблема в rendering pipeline. За 8 месяцев они изобретают ATW (Asynchronous TimeWarp). Motion sickness уходит. Сегодня весь VR стоит на этой идее.
- **Meta Quest 3:** Dynamic Foveated Rendering с eye tracking снижает нагрузку GPU на 50%, позволяя запускать игры AAA класса на мобильном SoC без перегрева
- **PlayStation VR2:** Adaptive Foveated Rendering - Sony's реализация для PS5. Eye tracking встроен в гарнитуру, latency <4 мс
- **Microsoft Flight Simulator VR:** без reprojection требует RTX 3090 для 90 FPS. С SteamVR Motion Smoothing - RTX 3060 достаточно
Исторический контекст
В 2016 году команда Oculus (впоследствии Meta) выпустила Asynchronous TimeWarp (ATW) - первую практическую реализацию reprojection для VR. ATW работает в отдельном высокоприоритетном потоке: даже если приложение не успело рендерить новый кадр, ATW репроецирует предыдущий с актуальной позой в течение 1-2 мс. Это устранило stutter-induced motion sickness. До ATW все VR-игры должны были гарантировать 90 FPS или пользователь чувствовал тошноту. После - допустим временный drop до 45 FPS. В 2021 Meta расширила идею до Application SpaceWarp (ASW 2.0) с нейросетевой генерацией intermediate frames.
Stereoscopic rendering: рендеринг для двух глаз
**Oculus Rift CV1, 2016. Первый mass-market VR с требованием 90 FPS для предотвращения motion sickness.** Проблема: обычная игра рендерит 1 кадр в 16 мс (60 FPS). VR должен рендерить 2 кадра (левый и правый глаз) в 11 мс (90 FPS). Это в 3x жёстче по вычислительному бюджету. Каждый глаз получает немного разную проекцию - межзрачковое расстояние (IPD) ~63 мм создаёт параллакс, мозг интерпретирует как глубину.
**Single Pass Stereo (SPS):** рендеринг обоих глаз за один draw call через geometry instancing. GPU дублирует геометрию с двумя разными матрицами проекции. Экономит 30-40% CPU time на draw call submission. Требует поддержки VK_KHR_multiview (Vulkan) или GL_OVR_multiview (OpenGL). Главный ограничитель - пропускная способность GPU fillrate, не CPU.
Почему VR требует именно 90+ FPS, а не стандартных 60 FPS для монитора?
Foveated rendering: экономим там, где глаз не замечает
**Meta Quest Pro, 2022. Первый потребительский VR с eye tracking для Dynamic Foveated Rendering.** Сетчатка человека имеет высокое разрешение только в центре (fovea, 2-5°) - там где смотрит взгляд. Периферийное зрение плохо воспринимает детали. Foveated rendering рендерит полное разрешение только в зоне взгляда, снижая разрешение к краям. Результат: 2-3x меньше пикселей при одинаковом воспринимаемом качестве.
| Метод | Eye tracking | GPU экономия | Риски |
|---|---|---|---|
| Fixed Foveated | Не нужен | 30-40% | Периферия всегда размыта, заметно при взгляде вбок |
| Dynamic Foveated | Нужен (IR камера) | 50-70% | Latency eye tracking >4 мс = saccade artifact |
| Perceptual Quality | Не нужен | 20-30% | Анализирует temporally stable зоны |
| Radial VRS | Не нужен | 35-50% | Артефакты на краях если не сглаживать |
Eye tracking для Dynamic Foveated Rendering должен иметь latency <4 мс. Почему такой жёсткий требование?
Reprojection: рендерим реже, отображаем чаще
**Atemporal reprojection - один из главных инноваций VR.** Суть: рендерить на 45 FPS, но отображать на 90 FPS. Между двумя реально рендеренными кадрами VR runtime вставляет synthetic кадр, репроецируя предыдущий на основе актуальной позы головы. Стоимость репроекции ~0.5 мс против ~5-10 мс полного рендера.
**Disocclusion artifacts:** при движении головы объекты за краем кадра становятся видимы - reprojection не имеет данных для этих пикселей. Края кадра заполняются stretch artifacts или чёрным. Решение: рендерить с overscan (110% размера) и обрезать. Или полагаться на ASW для генерации нового контента.
Reprojection вставляет synthetic кадр между двумя реальными. При каком движении головы артефакты минимальны?
ASW и Motion Smoothing: AI генерирует промежуточные кадры
**Oculus ASW 2.0 (Application SpaceWarp, 2021) - нейросетевая генерация intermediate frames.** Классический reprojection работает только для статичных объектов - движущиеся персонажи, анимация создают артефакты. ASW 2.0 и SteamVR Motion Smoothing используют optical flow + CNN для генерации реалистичного промежуточного кадра включая динамику сцены.
| Технология | FPS in / out | GPU экономия | Артефакты |
|---|---|---|---|
| Oculus ATW (2016) | любой / 90 | Только для dropped frames | Stretch на краях при translation |
| SteamVR Reprojection | 45 / 90 | ~45% | Ghosts на движущихся объектах |
| Oculus ASW 2.0 (2021) | 36/45 / 72/90 | ~50% | Temporal artifacts при быстром движении |
| NVIDIA DLSS Frame Gen | любой / 2x | ~50% на render | Нет (для обычных игр); VR-версия - 2023 |
Reprojection и ASW позволяют рендерить при любом FPS и всегда получать комфортные 90 FPS
Reprojection работает хорошо при 45 FPS (половина от 90). Ниже 36 FPS артефакты становятся заметны даже с ASW. При <30 FPS VR становится некомфортным независимо от reprojection.
Reprojection экстраполирует следующий кадр. При больших временных пропусках (>27 мс при 36 FPS) ошибка экстраполяции растёт. Быстрые движения головы или сцены с быстрой динамикой делают артефакты видимыми. ASW - не замена производительности, а страховочная сетка.
Почему ASW 2.0 требует от игры передавать motion vectors, а классический reprojection не требует?
VR Rendering: главное
- Stereo rendering: два разных viewport для IPD~63 мм. Single Pass Stereo через gl_ViewID экономит 30-40% CPU
- 90+ FPS обязательны для предотвращения motion sickness (motion-to-photon latency <20 мс)
- Foveated rendering: высокое разрешение только в зоне fovea (2-5°). Eye tracking для Dynamic FR экономит 50-70% GPU
- Reprojection: рендерить 45 FPS, отображать 90. Репроекция предыдущего кадра стоит <1 мс. Артефакты при translation
- ASW 2.0: нейросетевая генерация intermediate frames включая motion. Требует motion vectors от приложения
Вопросы для размышления
- Dynamic Foveated Rendering требует eye tracking с latency <4 мс. Современные eye trackers дают 8-12 мс. Какие алгоритмические подходы (prediction, extrapolation) можно использовать чтобы компенсировать эту задержку?