XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
212
Revision
1
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
Авторы
Цзянь Чжан (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 ".
Допустимое использование (неявное)
- Расширение
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указывает на то, что используются данные двумерного вектора движения.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должно быть включено до использования XrFrameSynthesisConfigViewEXT. -
typeдолжно бытьXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур.
Новые структуры
Расширение XrCompositionLayerProjectionView :
Расширение XrViewConfigurationView :
Новые константы перечисления
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONРасширение XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
Проблемы
История версий
Версия 1, 31 января 2022 г. (Цзянь Чжан)
- Начальное описание расширения, преобразованное из fb_space_warp
- Сотрудничество с участниками проекта по улучшению интерфейсов расширений.