XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

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

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

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

212

Revision

1

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

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

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

OpenXR 1.0

Авторы

Цзянь Чжан (Jian Zhang), Meta Platforms
Нил Бедекар (Neel Bedekar), Meta Platforms
Сян Вэй (Xiang Wei), Meta Platforms
Годун Жун (Guodong Rong), Meta Platforms
Тревор Даш (Trevor Dasch), Meta Platforms
Реми Арно (Rémi Arnaud), Varjo
Паулу Гомеш (Paulo Gomes), Samsung Electronics
Брайс Хатчингс (Bryce Hutchings), Microsoft
Райли Павлик (Rylie Pavlik), Collabora
Шуай Лю (Shuai Liu), 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 из одной позы пространства приложения в другую между кадрами, что влияет на вид больше, чем отслеживаемое движение между кадрами. Если в приложении нет преобразования XrCompositionLayerProjection :: space, то appSpaceDeltaPose должно быть тождественным. 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 может быть бесконечным. Среда выполнения должна возвращать ошибку XR_ERROR_VALIDATION_FAILURE, если nearZ == farZ.

При отправке изображений с векторами движения и глубины вместе со слоями проекции добавьте структуру 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 указывает на то, что используются данные двумерного вектора движения.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT сообщает среде выполнения, что приложению требуется дополнительное время на рендеринг каждого кадра, а среда выполнения синтезирует больше кадров. Это может быть полезно для приложений, в которых нужно снизить нагрузку на ЦП и графический процессор (например, чтобы продлить время работы от батареи) или увеличить вычислительный бюджет каждого кадра. Среда выполнения может запрашивать кадры с любым интервалом, независимо от значения этого флага.

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

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

Структура 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 января 2022 г. (Цзянь Чжан)

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