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

OpenXR 1.0

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

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras.
  • layerFlags es una máscara de bits de XrFrameSynthesisInfoFlagsEXT .
  • motionVectorSubImage identifica la imagen vectorial de movimiento XrSwapchainSubImage que se usará para la síntesis de fotogramas.
  • motionVectorScale es un XrVector4f que escala la interpretación del vector de movimiento en motionVectorSubImage .
  • motionVectorOffset es un XrVector4f que compensa la interpretación del vector de movimiento en motionVectorSubImage .
  • appSpaceDeltaPose es 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 :: space de una postura de espacio de aplicación a otra entre fotogramas, lo que afecta la vista más que el movimiento rastreado entre fotogramas. El appSpaceDeltaPose debe ser identidad cuando no hay transformación XrCompositionLayerProjection :: space en la aplicación. El XrPosef :: position en appSpaceDeltaPose debe ser relativo al XrCompositionLayerProjection :: space de la aplicación actual .
  • depthSubImage identifica la imagen de profundidad XrSwapchainSubImage que se usará para la síntesis de fotogramas.
  • minDepth y maxDepth son el rango de valores de profundidad en depthSubImage y deben estar en el rango de [0.0,1.0] . Esto es similar a los valores mínimo y máximo de glDepthRange de OpenGL , pero con el requisito de que maxDepth ≥ minDepth .
  • nearZ es la distancia positiva en metros del valor minDepth en la cadena de intercambio de profundidad. Las aplicaciones pueden usar un nearZ que sea mayor que farZ para indicar que los valores de profundidad se invierten. nearZ puede ser infinito.
  • farZ es la distancia positiva en metros del valor maxDepth en la cadena de intercambio de profundidad. farZ puede ser infinito. El tiempo de ejecución debe mostrar el error XR_ERROR_VALIDATION_FAILURE si nearZ == 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)

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_EXT indica que se usan datos de vectores de movimiento 2D.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT proporciona 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.

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

  • type es el XrStructureType de esta estructura.
  • next es NULL o 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)

Nuevas estructuras

Nuevas constantes de enum

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • Extensión de XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_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