Если коротко:
Dynamic foveated rendering в OpenXR может означать две разные функции: runtime меняет силу фовеации по запасу производительности либо область высокого качества следует за взглядом. Первая функция не требует eye tracking, вторая требует совместимых гарнитуры, runtime, расширения и разрешения пользователя. Режим выбирают по GPU time и качеству периферии на целевом устройстве, а не по универсальному проценту ускорения.
OpenXR foveated rendering снижает детализацию в части изображения, чтобы сократить работу GPU. При этом слово dynamic используют для разных механизмов: изменения силы эффекта по доступному запасу производительности и перемещения качественной зоны вслед за взглядом. В OpenXR это не одна универсальная функция, поэтому перед настройкой проверяют расширения runtime, возможности гарнитуры и путь рендеринга движка.
Три режима вместо одной настройки
Удобно разделять фовеацию по двум признакам: где находится область максимального качества и кто выбирает силу эффекта.
| Режим | Центр качественной области | Кто меняет силу |
|---|---|---|
| Fixed, статический уровень | Обычно фиксирован относительно изображения | Приложение задаёт уровень |
| Fixed, динамический уровень | Остаётся фиксированным | Runtime меняет уровень в пределах заданного максимума |
| Eye-tracked | Следует за направлением взгляда | Runtime применяет профиль с данными eye tracking |
В OpenXR-расширении XR_FB_foveation_configuration перечисление XrFoveationDynamicFB описывает именно динамику уровня. При включённом режиме runtime меняет фовеацию по доступному performance headroom до максимума, который запросило приложение. Это не означает, что центр автоматически следует за глазами.
Eye-tracked foveation — отдельный случай. Для него нужны камеры слежения за глазами, доступные данные взгляда и поддерживаемый runtime. В расширении XR_META_foveation_eye_tracked соответствующая структура добавляется к профилю уровня. Если гарнитура умеет eye tracking, но runtime или приложение не поддерживают этот путь, динамической зоны по взгляду не будет.
Общий принцип и зрительные ограничения технологии разобраны в статье о foveated rendering в VR. Здесь основное внимание уделено OpenXR API и измерениям.
Что означают уровни OpenXR
XrFoveationLevelFB содержит четыре значения: NONE, LOW, MEDIUM и HIGH. Они задают желаемую силу эффекта. С ростом уровня периферийная детализация уменьшается, а потенциальный запас производительности увеличивается. Спецификация не превращает эти имена в одинаковый радиус зоны, размер блока или процент экономии для каждого устройства.
Структура XrFoveationLevelProfileCreateInfoFB объединяет три параметра:
level— максимальный желаемый уровень;verticalOffset— вертикальное смещение области в градусах;dynamic— разрешение runtime менять силу по запасу производительности.
Если dynamic отключён, runtime применяет статическую фовеацию на указанном максимальном уровне. Если включён, уровень может меняться, но его верхняя граница остаётся заданной приложением. Поэтому HIGH не означает постоянно одинаковую картинку во всех реализациях, а динамический режим не гарантирует, что runtime обязательно будет часто переключать ступени.
В Unity OpenXR используется другой слой абстракции. Свойство XRDisplaySubsystem.foveatedRenderingLevel принимает значение от 0 до 1, после чего провайдер сопоставляет его с нативным API устройства. Unity прямо указывает, что разные типы устройств могут интерпретировать значение подходящим для себя способом. Такой ползунок нельзя считать переносимой физической шкалой качества.
Профиль и поддержка runtime
OpenXR отделяет стандартный механизм расширений от возможностей конкретной системы. Приложение должно узнать список доступных instance extensions, включить необходимые расширения и создать совместимые swapchain и foveation profile. Наличие типа в заголовочном файле SDK ещё не доказывает, что активный runtime реализует его на выбранном устройстве.
Проверку runtime support выполняют при запуске для текущей системы. Конфигурацию из одного OpenXR runtime нельзя считать совместимой с остальными без отдельного теста.
Для семейства расширений FB обычно участвуют базовая фовеация, конфигурация уровня и обновление состояния swapchain. Eye-tracked вариант добавляет vendor extension к цепочке профиля. Другой runtime может предлагать иной набор, например конфигурацию с несколькими проекционными видами. Смешивать команды из разных расширений без проверки поддержки нельзя.
Движок скрывает часть этой последовательности, но не снимает ограничений. В Unity OpenXR функцию включают в настройках плагина, а затем активируют во время работы приложения. Для gaze-based режима задают соответствующий runtime flag и обрабатывают разрешение на eye tracking. По документации Unity, при недоступном режиме взгляда или отказе в разрешении система переходит к fixed foveated rendering. Приложение должно считать такой вариант штатным, а не ошибкой запуска.
Подробнее о границе между приложением, runtime и устройством рассказано в материале о стандарте OpenXR.
Что меняется в изображении
Foveated rendering сокращает цену обработки периферийной области. Конкретная реализация может использовать variable rate shading, fragment density map или другой поддерживаемый путь. Экономия относится прежде всего к пиксельной работе; тяжёлый game thread, физика и большое число объектов сами по себе дешевле не становятся.
Периферия чувствительна к мелкому тексту, тонким диагоналям, решёткам, листве, прозрачности и контрастным контурам. Агрессивный уровень может дать ступенчатые границы, мерцание или заметный переход между зонами. В fixed-режиме пользователь способен перевести глаза к краю линзы, не поворачивая голову, и увидеть область сниженного качества.
Eye-tracked схема переносит центральную область по данным взгляда, но добавляет новые условия. Нужны корректная калибровка, разрешение пользователя и устойчивое состояние трекера. При потере данных приложение не должно сохранять качественную зону в случайном месте. Логику калибровки и ограничений датчика описывает статья об eye tracking в VR.
Как собрать профиль производительности
Сначала выясните, ограничена ли сцена GPU. Если кадр упирается в CPU, изменение плотности shading может не дать заметного результата. Смотрите показатели CPU time, GPU time, пропущенных кадров и выбранной частоты дисплея; среднего FPS недостаточно.
Базовый тест проводят так:
- Зафиксируйте гарнитуру, runtime, версию движка, графический API, частоту и разрешение.
- Выберите повторяемую тяжёлую сцену и маршрут с поворотами головы и переводом взгляда.
- Запишите профиль при выключенной фовеации после одинакового прогрева.
- По очереди проверьте уровни LOW, MEDIUM и HIGH, не меняя остальные параметры.
- Отдельно включите dynamic level и, если поддерживается, eye-tracked профиль.
- Сравните GPU time, стабильность кадров и визуальные дефекты внутри гарнитуры.
Каждый вариант следует записывать несколько раз. Первый запуск может включать компиляцию шейдеров и холодную загрузку, а последующие использовать кэш. Краткий всплеск нельзя скрывать средним значением за длинную сессию. Порядок разделения CPU- и GPU-ограничений приведён в руководстве по профилированию VR-проекта в Unity.
Адаптация уровня без раскачивания качества
Если runtime управляет dynamic level, приложение задаёт допустимый максимум, а решение внутри диапазона принимает реализация. Если уровень меняет собственная система проекта, ей нужны пороги и гистерезис: повышение после устойчивой нагрузки и снижение после достаточного периода запаса. Переключение около одного порога каждый кадр создаёт заметное пульсирование периферии.
Не заставляйте foveated rendering и dynamic resolution одновременно реагировать на один краткий всплеск. Сначала определите роль каждой системы, затем профилируйте их вместе. Например, фовеация может отвечать за периферийную цену пикселей, а разрешение — за более длительное изменение нагрузки. Это схема испытания, а не универсальный рецепт для любого runtime.
Проверяйте также пользовательский интерфейс. Подсказка, которую нужно читать боковым зрением, может попасть в менее детальную область. Для eye-tracked режима испытайте быстрые саккады, временную потерю tracking и отказ в разрешении. Для fixed-режима осмотрите края линз глазами при неподвижной голове.
Когда настройку оставлять выключенной
Фовеация не обязательна, если проект ограничен CPU, runtime не сообщает поддержку или визуальная цена выше измеренного выигрыша. Её также нельзя считать активной по одному переключателю в Editor: подтверждение получают в профиле собранного приложения на целевой гарнитуре.
Рабочая конфигурация фиксирует версию runtime, доступные extensions, профиль, частоту дисплея и результаты тестового маршрута. Это позволяет заметить изменение после обновления движка или прошивки. Dynamic foveated rendering полезен как управляемый инструмент GPU-бюджета, но уровень и режим выбираются только по измерениям и качеству изображения.