XR_EXT_frame_synthesis
Nombre de cadena
XR_EXT_frame_synthesis
Tipo de extensión
Extensión de instancia
Número de extensión registrada
212
Revisión
1
Estado de ratificación
No ratificado
Dependencias de extensión y versión
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 aplicaciones basadas en datos adicionales proporcionados por la aplicación. El tiempo de ejecución puede usar imágenes de vectores de movimiento y de profundidad generadas por la aplicación para realizar una extrapolación y una reproyección de fotogramas de alta calidad para 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. El XrFrameSynthesisInfoEXT :: depthSubImage puede usar datos de profundidad dedicados a 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 existe, que afecta la vista desde el fotograma anterior. Las experiencias de locomoción artificial (movimiento con secuencias de comandos, teletransportación, etc.) implican que la aplicación transforma todo el XrCompositionLayerProjection ::spacede una postura de espacio de aplicación a otra entre fotogramas, lo que afecta la vista más que el movimiento rastreado entre fotogramas. ElappSpaceDeltaPosedebe ser identidad cuando no hay 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 unnearZque sea mayor quefarZpara indicar que los valores de profundidad se invierten.nearZpuede ser infinito.farZes la distancia positiva en metros del valormaxDepthen la cadena de intercambio de profundidad.farZpuede ser infinito. El tiempo de ejecución debe mostrar 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 tiempo 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 tiempo 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 NDC. Por ejemplo, dado que el NDC de un píxel en el fotograma anterior es PrevNDC y CurrNDC en el fotograma actual, y que no hay escala ni compensación, el valor del vector de movimiento es " (CurrNDC - PrevNDC) xyz ".
Uso válido (implícito)
- La extensión
XR_EXT_frame_synthesisdebe habilitarse 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 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 paso de vector de movimiento dedicado de menor resolución (consulta XrFrameSynthesisConfigViewEXT para obtener la resolución recomendada) o renderizarlos en el paso de vista principal con MRT (varios objetivos de renderización). La aplicación decide el enfoque específico. Se recomiendan formatos de punto flotante de 16 bits firmados por canal de píxeles 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 marcas
XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXTindica que se usan datos de vectores de movimiento 2D.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTproporciona una sugerencia al tiempo de ejecución de que la aplicación prefiere tiempo adicional para renderizar cada fotograma, con la compensación de que el tiempo 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 aumentar el presupuesto de procesamiento de cada fotograma. El tiempo de ejecución puede solicitar fotogramas en cualquier intervalo, independientemente del valor de esta marca.
De forma predeterminada, el tiempo de ejecución espera datos de vectores de movimiento 3D, por lo que se usan motionVectorSubImage rgb , motionVectorScale xyz y motionVectorOffset xyz, como se describe en XrFrameSynthesisInfoEXT .
Cuando XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT está habilitado en XrFrameSynthesisInfoEXT layerFlags , el tiempo de ejecución interpreta la imagen de vector de movimiento enviada como datos de vectores de movimiento 2D, que representan el movimiento de píxeles 2D del fotograma anterior al fotograma actual. Los valores de píxeles se interpretan de la siguiente manera para los datos de vectores de movimiento 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 2D en lugar de 3D puede disminuir la calidad de los fotogramas sintetizados.
Obtén la 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: Ancho recomendado de la imagen de vector de movimiento y de profundidad.recommendedMotionVectorImageRectHeight: Altura recomendada de la imagen de vector de movimiento y de profundidad.
Cuando se habilita esta extensión, una aplicación puede pasar una estructura XrFrameSynthesisConfigViewEXT en la cadena XrViewConfigurationView :: next cuando llama a xrEnumerateViewConfigurationViews para obtener información sobre la resolución recomendada de la imagen de vector de movimiento.
Uso válido (implícito)
- La extensión
XR_EXT_frame_synthesisdebe habilitarse 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
Nuevas estructuras
Extensión de XrCompositionLayerProjectionView :
Extensión de XrViewConfigurationView :
Nuevas constantes de enum
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONExtensión de XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
Problemas
Historial de versiones
Revisión 1, 31/01/2022 (Jian Zhang)
- Descripción inicial de la extensión, convertida de fb_space_warp
- Colaboración con colaboradores para perfeccionar las interfaces de extensión