Если коротко:
VR-линза меняет геометрию изображения между дисплеем и глазом. Поэтому compositor заранее применяет противоположное искривление, или pre-warp: после прохождения через оптику линии выглядят прямыми. Для разных цветовых каналов также корректируют хроматическую аберрацию. Параметры зависят от модели линзы, положения глаза и профиля гарнитуры, поэтому коррекцию обычно выполняет runtime производителя, а не сама игра.
VR lens distortion correction нужна потому, что линза между display и eye увеличивает поле зрения, но одновременно меняет геометрию image. Если показать обычный прямоугольный кадр без обработки, через оптику прямые линии будут казаться выгнутыми. Runtime заранее искривляет картинку в обратную сторону, чтобы две деформации приблизительно компенсировали друг друга.
Путь кадра от игры к глазу
Упрощённый конвейер выглядит так:
- Игра выполняет rendering отдельного изображения для каждого глаза.
- Кадры передаются системному compositor как проекционные слои.
- Композитор применяет distortion correction и другие преобразования.
- Предварительно искривлённый кадр выводится на экран.
- Lens снова меняет ход лучей, а пользователь видит геометрически выправленную сцену.
Такое предварительное преобразование называют pre-warp. На зеркале монитора оно может выглядеть как кадр с выгнутыми краями, хотя внутри шлема результат должен быть правильным.
Barrel и pincushion distortion
Pincushion distortion визуально втягивает линии к центру, словно стороны прямоугольника прижали внутрь. В документации Meta и HTC именно такой базовый эффект связывается с оптикой VR. Для компенсации compositor применяет противоположный barrel distortion, при котором линии на подготовленном кадре выгибаются наружу.
Термин correct здесь означает компенсацию. Все lenses не описываются одним коэффициентом. Реальный method учитывает центр оптики, два глаза и несколько параметров. HTC показывает коэффициентную модель с подбором по фактическому результату. Профиль одной гарнитуры нельзя переносить на другую только из-за похожей формы линз.
Зачем нужен профиль конкретной оптики
Сила correction зависит от конструкции lens, панели и положения глаза. Производитель передаёт параметры runtime. Приложение рендерит проекцию, а compositor выполняет аппаратно-зависимую часть.
Положение пользователя тоже имеет значение. При смещении гарнитуры, неверном IPD или увеличенном eye relief из-за очков pupil попадает в другую часть оптики. Могут появиться остаточное искривление, размытие или цветные края. Коррекция не заменяет правильную посадку.
Chromatic aberration correction
Материал lens по-разному преломляет длины волн. Красный, зелёный и синий colors могут расходиться у края. Это chromatic aberration: у контрастного объекта появляется цветная кайма.
Для компенсации compositor смещает каналы не одинаково. HTC предусматривает отдельные параметры RGB, а Meta включает обработку в этап вывода. Подробнее эффект разобран в статье о хроматической аберрации в VR.
OpenXR передаёт слои системному runtime. Флаг XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT в OpenXR 1.1 устарел и игнорируется: нужная обработка выполняется по умолчанию.
Почему коррекция не означает плохие линзы
VR-оптика увеличивает небольшой дисплей и формирует широкое поле рядом с глазом. Геометрическая correction является частью общего проекта панели, lenses и программного конвейера. Её наличие не оценивает качество одной детали.
Fresnel и pancake создают разные блики и потери света, но обе архитектуры требуют согласования рендера с оптическим профилем. Отличия собраны в сравнении Fresnel и pancake-линз.
Приложению не нужно повторно «выпрямлять» кадр: двойная correction снова исказит сцену. Оно передаёт слои runtime и оставляет финальное преобразование композитору. Итого compositor делает pre-warp и цветовую компенсацию, затем оптика преобразует свет для глаза. Искривлённый кадр на display является подготовленным изображением, а не доказательством дефекта lens.