XR_EXT_frame_synthesis

Строка имени

XR_EXT_frame_synthesis

Тип расширения

Расширение экземпляра

Зарегистрированный добавочный номер

212

Пересмотр

1

Статус ратификации

Не ратифицировано

Зависимости расширений и версий

OpenXR 1.0

Авторы

Цзянь Чжан, Meta Platforms
Нил Бедекар, Meta Platforms
Сян Вэй, Meta Platforms
Годун Жун, Meta Platforms
Тревор Даш, Meta Platforms
Реми Арно, Варжо
Пауло Гомес, Samsung Electronics
Брайс Хатчингс, Microsoft
Райли Павлик, Коллабора
Шуай Лю, ByteDance

Обзор

Это расширение обеспечивает поддержку синтеза кадров в приложениях на основе дополнительных данных, предоставляемых приложением. Сгенерированные приложением изображения векторов движения и изображения глубины могут использоваться средой выполнения для высококачественной экстраполяции и перепроецирования кадров с целью синтеза нового кадра, обеспечивая плавную работу даже при работе приложения ниже целевого значения частоты кадров.

Это расширение разработано таким образом, чтобы быть независимым от XR_KHR_composition_layer_depth , и оба параметра могут быть включены и использованы одновременно для разных целей. XrFrameSynthesisInfoEXT :: depthSubImage может использовать данные о глубине, предназначенные для синтеза кадров, и его разрешение может быть ниже, чем у XrCompositionLayerDepthInfoKHR :: subImage . Рекомендуемое разрешение depthSubImage см. в XrFrameSynthesisConfigViewEXT .

Отправьте изображения векторов движения и изображения глубины.

Структура XrFrameSynthesisInfoEXT определяется следующим образом:

typedef struct XrFrameSynthesisInfoEXT {
    XrStructureType                 type;
    const void*                     next;
    XrFrameSynthesisInfoFlagsEXT    layerFlags;
    XrSwapchainSubImage             motionVectorSubImage;
    XrVector4f                      motionVectorScale;
    XrVector4f                      motionVectorOffset;
    XrPosef                         appSpaceDeltaPose;
    XrSwapchainSubImage             depthSubImage;
    float                           minDepth;
    float                           maxDepth;
    float                           nearZ;
    float                           farZ;
} XrFrameSynthesisInfoEXT;

Описание участников

  • type — это XrStructureType данной структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур.
  • layerFlags — это битовая маска XrFrameSynthesisInfoFlagsEXT .
  • motionVectorSubImage идентифицирует изображение вектора движения XrSwapchainSubImage , используемое для синтеза кадров.
  • motionVectorScale — это объект XrVector4f , который масштабирует интерпретацию вектора движения в motionVectorSubImage .
  • motionVectorOffset — это XrVector4f , который смещает интерпретацию вектора движения в motionVectorSubImage .
  • appSpaceDeltaPose — это инкрементальное преобразование, применяемое приложением (если таковое имеется), которое влияет на отображение с предыдущего кадра. В сценариях искусственного перемещения (запрограммированное движение, телепортация и т. д.) приложение преобразует всё пространство XrCompositionLayerProjection :: space из одной позы в пространстве приложения в другую позу между кадрами, влияя на отображение сильнее, чем отслеживаемое движение между кадрами. Значение appSpaceDeltaPose должно быть тождественным, если в приложении нет преобразования space XrCompositionLayerProjection ::space. Позиция XrPosef :: position в appSpaceDeltaPose должна быть относительно текущего пространства XrCompositionLayerProjection :: space приложения.
  • depthSubImage определяет изображение глубины XrSwapchainSubImage , используемое для синтеза кадров.
  • minDepth и maxDepth — это диапазон значений глубины в depthSubImage , и они должны находиться в диапазоне [0.0, 1.0]. Это аналогично минимальным и максимальным значениям glDepthRange в OpenGL, но с требованием, чтобы maxDepth ≥ minDepth.
  • nearZ — это положительное расстояние в метрах от значения minDepth в цепочке обмена глубинами. Приложения могут использовать nearZ , большее, чем farZ чтобы указать на обратное расположение значений глубины. nearZ может быть бесконечным.
  • farZ — это положительное расстояние в метрах от значения maxDepth в цепочке обмена глубинами. farZ может быть бесконечным. Если nearZ == farZ , среда выполнения должна вернуть ошибку XR_ERROR_VALIDATION_FAILURE

При отправке изображений векторов движения и изображений глубины вместе со слоями проекции добавьте структуру XrFrameSynthesisInfoEXT в цепочку XrCompositionLayerProjectionView :: next для каждой структуры XrCompositionLayerProjectionView в заданном слое.

Среда выполнения должна интерпретировать данные вектора движения в каналах RGB объекта motionVectorSubImage , модифицированные параметрами motionVectorScale и motionVectorOffset , следующим образом: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz. Компоненты motionVectorSubImage a, motionVectorScale w и motionVectorOffset w игнорируются.

Вектор движения представляет собой перемещение пикселя с момента XrFrameEndInfo ::displayTime предыдущего кадра до момента XrFrameEndInfo ::displayTime текущего кадра. Среда выполнения может использовать эту информацию для экстраполяции отрисованного кадра на будущий кадр.

Вектор движения должен быть получен из нормализованного пространства координат устройства (NDC), которое в данном контексте использует соглашения в стиле Vulkan: диапазон NDC определяется как [-1, -1, 0] до [1, 1, 1], что отличается от диапазона NDC в OpenGL. Однако сам вектор движения не ограничен этим диапазоном; его значения зависят от перемещения пикселя и могут выходить за границы пространства NDC. Например, если NDC пикселя в предыдущем кадре равно PrevNDC, а в текущем кадре — CurrNDC, и масштаб или смещение отсутствуют, то значение вектора движения будет равно " (CurrNDC - PrevNDC) xyz ".

Допустимое использование (неявное)

Примечание

Существует множество различных способов генерации motionVectorSubImage и depthSubImage . Например, приложение может отрисовывать их в отдельном проходе векторного отображения движения с более низким разрешением (рекомендуемое разрешение см. в XrFrameSynthesisConfigViewEXT ) или в основном проходе отображения с использованием MRT (Multiple Render Targets). Выбор конкретного подхода остается за приложением. Для motionVectorSubImage рекомендуется использовать 16-битные каналы с плавающей запятой для каждого пикселя.

Флаги синтеза кадров

typedef XrFlags64 XrFrameSynthesisInfoFlagsEXT;

// Flag bits for XrFrameSynthesisInfoFlagsEXT
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT = 0x00000001;
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT = 0x00000002;

Описание флагов

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT указывает на использование данных 2D-векторов движения.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT указывает среде выполнения, что приложение предпочитает дополнительное время для рендеринга каждого кадра, в обмен на то, что среда выполнения синтезирует больше кадров. Это может быть полезно для приложений, которые предпочитают экономить ресурсы ЦП и ГП (например, для увеличения времени автономной работы) или увеличивать вычислительный бюджет каждого кадра. Среда выполнения может запрашивать кадры с любым интервалом, независимо от значения этого флага.

По умолчанию среда выполнения ожидает данные 3D-векторов движения, поэтому используются параметры motionVectorSubImage rgb, motionVectorScale xyz и motionVectorOffset xyz, как описано в XrFrameSynthesisInfoEXT .

Если XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT включен в параметре XrFrameSynthesisInfoEXT layerFlags , среда выполнения интерпретирует предоставленное изображение вектора движения как двумерные данные вектора движения, представляющие собой двумерное перемещение пикселей от предыдущего кадра к текущему. Значения пикселей интерпретируются следующим образом для двумерных данных вектора движения: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy. Компоненты motionVectorSubImage ba, motionVectorScale zw и motionVectorOffset zw игнорируются. Использование двумерных данных вектора движения вместо трехмерных может снизить качество синтезированных кадров.

Структура XrFrameSynthesisConfigViewEXT определяется следующим образом:

typedef struct XrFrameSynthesisConfigViewEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           recommendedMotionVectorImageRectWidth;
    uint32_t           recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;

Описание участников

  • type — это XrStructureType данной структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур.
  • recommendedMotionVectorImageRectWidth : рекомендуемая ширина изображения вектора движения и глубины.
  • recommendedMotionVectorImageRectHeight : рекомендуемая высота векторного изображения движения и изображения глубины.

При включении этого расширения приложение может передавать структуру XrFrameSynthesisConfigViewEXT в цепочке XrViewConfigurationView :: next при вызове xrEnumerateViewConfigurationViews для получения информации о рекомендуемом разрешении изображения вектора движения.

Допустимое использование (неявное)

Новые сооружения

Новые константы перечислений

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • Расширение XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

Проблемы

История версий

  • Редакция 1, 31.01.2022 (Цзянь Чжан)

    • Первоначальное описание расширения, преобразованное из fb_space_warp
    • Сотрудничество с разработчиками для усовершенствования интерфейсов расширений.