XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Tipo de extensión
Extensión de instancia
Número de extensión registrado
212
Revisión
1
Estado de ratificación
No ratificado
Dependencias de extensiones y versiones
Colaboradores
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
Descripción general
Esta extensión proporciona compatibilidad para habilitar la síntesis de fotogramas en las aplicaciones según los datos adicionales que estas proporcionan. El entorno de ejecución puede usar las imágenes de vectores de movimiento y de profundidad que genera la aplicación para realizar una extrapolación y una reproyección de fotogramas de alta calidad con el objetivo de sintetizar un fotograma nuevo, lo que proporciona una experiencia fluida incluso cuando la aplicación se ejecuta por debajo del objetivo de FPS.
Esta extensión está diseñada para ser independiente de XR_KHR_composition_layer_depth, y ambas pueden habilitarse y usarse al mismo tiempo para diferentes propósitos. XrFrameSynthesisInfoEXT :: depthSubImage puede usar datos de profundidad dedicados para la síntesis de fotogramas, y su resolución puede ser inferior a XrCompositionLayerDepthInfoKHR :: subImage . Consulta XrFrameSynthesisConfigViewEXT para conocer la resolución sugerida de depthSubImage .
Envía imágenes de vectores de movimiento y de profundidad
La estructura XrFrameSynthesisInfoEXT se define de la siguiente manera:
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;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.layerFlagses una máscara de bits de XrFrameSynthesisInfoFlagsEXT .motionVectorSubImageidentifica la imagen vectorial de movimiento XrSwapchainSubImage que se usará para la síntesis de fotogramas.motionVectorScalees un XrVector4f que escala la interpretación del vector de movimiento enmotionVectorSubImage.motionVectorOffsetes un XrVector4f que compensa la interpretación del vector de movimiento enmotionVectorSubImage.appSpaceDeltaPosees la transformación incremental aplicada por la aplicación, si la hubiera, que afecta a la vista desde el fotograma anterior. Las experiencias de locomoción artificial (movimiento programado, teletransportación, etc.) implican que la aplicación transforme todo el XrCompositionLayerProjection ::spacede una pose de espacio de aplicación a otra entre fotogramas, lo que afecta la vista en más que el movimiento registrado entre fotogramas. LaappSpaceDeltaPosedebe ser una identidad cuando no haya una transformación XrCompositionLayerProjection ::spaceen la aplicación. El XrPosef ::positionenappSpaceDeltaPosedebe ser relativo al XrCompositionLayerProjection ::spacede la aplicación actual.depthSubImageidentifica la imagen de profundidad XrSwapchainSubImage que se usará para la síntesis de fotogramas.minDepthymaxDepthson el rango de valores de profundidad endepthSubImagey deben estar en el rango de [0.0,1.0] . Esto es similar a los valores mínimo y máximo deglDepthRangede OpenGL, pero con el requisito de que maxDepth ≥ minDepth .nearZes la distancia positiva en metros del valorminDepthen la cadena de intercambio de profundidad. Las aplicaciones pueden usar unnearZmayor quefarZpara indicar que los valores de profundidad están invertidos.nearZpuede ser infinito.farZes la distancia positiva en metros del valormaxDepthen la cadena de intercambio de profundidad.farZpuede ser infinito. El entorno de ejecución debe devolver el errorXR_ERROR_VALIDATION_FAILUREsinearZ==farZ
Cuando envíes imágenes de vectores de movimiento y de profundidad junto con capas de proyección, agrega una estructura XrFrameSynthesisInfoEXT a la cadena XrCompositionLayerProjectionView :: next para cada estructura XrCompositionLayerProjectionView en la capa determinada.
El entorno de ejecución debe interpretar los datos del vector de movimiento en los canales RGB de motionVectorSubImage, modificados por motionVectorScale y motionVectorOffset de la siguiente manera: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . Se ignoran los componentes motionVectorSubImage a , motionVectorScale w y motionVectorOffset w.
El vector de movimiento representa el movimiento de un píxel desde el XrFrameEndInfo ::displayTime del fotograma anterior hasta el XrFrameEndInfo ::displayTime del fotograma actual. El entorno de ejecución puede usar esta información para extrapolar el fotograma renderizado a un fotograma futuro.
El vector de movimiento debe derivarse del espacio de coordenadas normalizadas del dispositivo (NDC), que en este contexto usa convenciones de estilo Vulkan: el rango de NDC se define como [-1, -1, 0] a [1, 1, 1], diferente del rango de NDC de OpenGL. Sin embargo, el vector de movimiento en sí no está restringido a este rango; sus valores dependen del movimiento del píxel y pueden extenderse más allá de los límites del espacio de NDC. Por ejemplo, dado que las NDC de un píxel en el fotograma anterior son PrevNDC y CurrNDC en el fotograma actual, y que no hay escala ni desplazamiento, el valor del vector de movimiento es " (CurrNDC - PrevNDC) xyz ".
Uso válido (implícito)
- La extensión
XR_EXT_frame_synthesisdebe estar habilitada antes de usar XrFrameSynthesisInfoEXT. -
typedebe serXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
layerFlagsdebe ser0o una combinación válida de valores de XrFrameSynthesisInfoFlagBitsEXT -
motionVectorSubImagedebe ser una estructura XrSwapchainSubImage válida. -
depthSubImagedebe ser una estructura XrSwapchainSubImage válida.
Nota
Existen muchas formas diferentes de generar motionVectorSubImage y depthSubImage . Por ejemplo, la aplicación puede renderizarlos en un pase de vector de movimiento dedicado de menor resolución (consulta XrFrameSynthesisConfigViewEXT para conocer la resolución recomendada) o en el pase de vista principal con MRT (varios destinos de renderización). La aplicación debe decidir el enfoque específico. Se recomiendan los formatos de canal de píxeles de punto flotante de 16 bits con signo para motionVectorSubImage .
Marcas de síntesis de fotogramas
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;
Descripciones de las marcas
XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXTindica que se usan datos de vectores de movimiento en 2D.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTproporciona una sugerencia al entorno de ejecución de que la aplicación prefiere tiempo adicional para renderizar cada fotograma, con la desventaja de que el entorno de ejecución sintetizaría más fotogramas. Esto puede ser útil para las aplicaciones que prefieren conservar el uso de CPU y GPU (p.ej., para aumentar la duración de la batería) o para aumentar el presupuesto de procesamiento de cada fotograma. El entorno de ejecución puede solicitar fotogramas en cualquier intervalo, independientemente del valor de este parámetro.
De forma predeterminada, el entorno de ejecución espera datos de vectores de movimiento en 3D, por lo que se usan motionVectorSubImage rgb , motionVectorScale xyz y motionVectorOffset xyz, como se describe en XrFrameSynthesisInfoEXT .
Cuando se habilita XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT en XrFrameSynthesisInfoEXT layerFlags , el entorno de ejecución interpreta la imagen de vector de movimiento enviada como datos de vector de movimiento 2D, que representan el movimiento de píxeles 2D del fotograma anterior al actual. Los valores de píxeles se interpretan de la siguiente manera para los datos de vectores de movimiento en 2D: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . Se ignoran los componentes motionVectorSubImage ba , motionVectorScale zw y motionVectorOffset zw. El uso de datos de vectores de movimiento en 2D en lugar de 3D puede disminuir la calidad de los fotogramas sintetizados.
Obtener resolución recomendada
La estructura XrFrameSynthesisConfigViewEXT se define de la siguiente manera:
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.recommendedMotionVectorImageRectWidth: Es el ancho recomendado para el vector de movimiento y la imagen de profundidad.recommendedMotionVectorImageRectHeight: Es la altura recomendada para el vector de movimiento y la imagen de profundidad.
Cuando se habilita esta extensión, una aplicación puede pasar una estructura XrFrameSynthesisConfigViewEXT en la cadena XrViewConfigurationView :: next cuando se llama a xrEnumerateViewConfigurationViews para adquirir información sobre la resolución de imagen de vector de movimiento recomendada.
Uso válido (implícito)
- La extensión
XR_EXT_frame_synthesisdebe estar habilitada antes de usar XrFrameSynthesisConfigViewEXT -
typedebe serXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras
Estructuras nuevas
Extensión de XrCompositionLayerProjectionView :
Extiende XrViewConfigurationView :
Nuevas constantes de enum
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONExtiende XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
Problemas
Historial de versiones
Revisión 1, 31 de enero de 2022 (Jian Zhang)
- Descripción inicial de la extensión, convertida de fb_space_warp
- Colaborar con los colaboradores para definir mejor las interfaces de las extensiones