XR_EXT_frame_synthesis
Строка имени
XR_EXT_frame_synthesis
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
212
Пересмотр
1
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
Авторы
Цзянь Чжан, 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должно быть тождественным, если в приложении нет преобразованияspaceXrCompositionLayerProjection ::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 ".
Допустимое использование (неявное)
- Расширение
XR_EXT_frame_synthesisнеобходимо включить перед использованием XrFrameSynthesisInfoEXT. -
typeдолжен бытьXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. layerFlagsдолжен быть0или представлять собой допустимую комбинацию значений XrFrameSynthesisInfoFlagBitsEXT.-
motionVectorSubImageдолжен быть допустимой структурой XrSwapchainSubImage. -
depthSubImageдолжен быть допустимой структурой XrSwapchainSubImage.
Примечание
Существует множество различных способов генерации 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необходимо включить перед использованием XrFrameSynthesisConfigViewEXT. -
typeдолжен бытьXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур.
Новые сооружения
Расширение XrCompositionLayerProjectionView :
Расширение XrViewConfigurationView :
Новые константы перечислений
-
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
- Сотрудничество с разработчиками для усовершенствования интерфейсов расширений.