XR_EXT_frame_synthesis

Chaîne de nom

XR_EXT_frame_synthesis

Type d'extension

Extension d'instance

Numéro d'extension enregistré

212

Révision

1

État de ratification

Non ratifié

Dépendances d'extension et de version

OpenXR 1.0

Participants

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

Présentation

Cette extension permet d'activer la synthèse d'images sur les applications en fonction des données fournies par l'application. Les images de vecteur de mouvement et les images de profondeur générées par l'application peuvent être utilisées par l'environnement d'exécution pour effectuer une extrapolation et une reprojection d'image de haute qualité afin de synthétiser une nouvelle image, offrant ainsi une expérience fluide même lorsque l'application s'exécute en dessous de la fréquence d'images cible.

Cette extension est conçue pour être indépendante de XR_KHR_composition_layer_depth. Les deux peuvent être activées et utilisées en même temps, à des fins différentes. Le XrFrameSynthesisInfoEXT :: depthSubImage peut utiliser des données de profondeur dédiées à la synthèse d’images, et sa résolution peut être inférieure à XrCompositionLayerDepthInfoKHR :: subImage . Consultez XrFrameSynthesisConfigViewEXT pour connaître la résolution suggérée de depthSubImage .

Envoyer des images de vecteur de mouvement et des images de profondeur

La structure XrFrameSynthesisInfoEXT est définie comme suit :

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;

Descriptions des membres

  • type correspond au XrStructureType de cette structure.
  • next est NULL ou un pointeur vers la structure suivante dans une chaîne de structures.
  • layerFlags est un masque de bits de XrFrameSynthesisInfoFlagsEXT .
  • motionVectorSubImage identifie l'image vectorielle de mouvement XrSwapchainSubImage à utiliser pour la synthèse d'images.
  • motionVectorScale est un XrVector4f qui met à l'échelle l'interprétation du vecteur de mouvement dans motionVectorSubImage .
  • motionVectorOffset est un XrVector4f qui décale l'interprétation du vecteur de mouvement dans motionVectorSubImage .
  • appSpaceDeltaPose est la transformation incrémentale appliquée par l'application, le cas échéant, qui affecte la vue depuis l'image précédente. Les expériences de locomotion artificielle (mouvement scripté, téléportation, etc.) impliquent que l'application transforme l'ensemble XrCompositionLayerProjection :: space d'une pose d'espace d'application à une autre entre les images, ce qui affecte la vue plus que le mouvement suivi entre les images. The appSpaceDeltaPose doit être une identité lorsqu'il n'y a pas de transformation XrCompositionLayerProjection :: space dans l'application. Le XrPosef :: position dans appSpaceDeltaPose doit être relatif à l'application actuelle XrCompositionLayerProjection :: space .
  • depthSubImage identifie l'image de profondeur XrSwapchainSubImage à utiliser pour la synthèse d'images.
  • minDepth et maxDepth correspondent à la plage de valeurs de profondeur dans depthSubImage, et doivent être comprises entre [0,0 et 1,0] . Cela s'apparente aux valeurs minimales et maximales de glDepthRange d'OpenGL , mais avec l'exigence que maxDepth ≥ minDepth .
  • nearZ correspond à la distance positive en mètres de la valeur minDepth dans la chaîne d'échange de profondeur. Les applications peuvent utiliser un nearZ supérieur à farZ pour indiquer que les valeurs de profondeur sont inversées. nearZ peut être infini.
  • farZ correspond à la distance positive en mètres de la valeur maxDepth dans la chaîne d'échange de profondeur. farZ peut être infini. L'environnement d'exécution doit renvoyer l'erreur XR_ERROR_VALIDATION_FAILURE si nearZ == farZ.

Lorsque vous envoyez des images de vecteur de mouvement et des images de profondeur avec des calques de projection, ajoutez une structure XrFrameSynthesisInfoEXT à la chaîne XrCompositionLayerProjectionView :: next, pour chaque structure XrCompositionLayerProjectionView dans le calque donné.

L'environnement d'exécution doit interpréter les données de vecteur de mouvement dans les canaux RVB de motionVectorSubImage, modifiés par motionVectorScale et motionVectorOffset comme suit : motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . Les composants motionVectorSubImage a , motionVectorScale w et motionVectorOffset w sont ignorés.

Le vecteur de mouvement représente le mouvement d'un pixel depuis le XrFrameEndInfo ::displayTime de l'image précédente jusqu'au XrFrameEndInfo ::displayTime de l'image actuelle. L'environnement d'exécution peut utiliser ces informations pour extrapoler l'image rendue dans une image future.

Le vecteur de mouvement doit être dérivé de l'espace de coordonnées normalisé de l'appareil (NDC), qui utilise dans ce contexte des conventions de style Vulkan : la plage NDC est définie comme [-1, -1, 0] à [1, 1, 1], différente de la plage NDC d'OpenGL. Toutefois, le vecteur de mouvement lui-même n'est pas limité à cette plage. Ses valeurs dépendent du mouvement du pixel et peuvent s'étendre au-delà des limites de l'espace NDC. Par exemple, étant donné que le NDC d'un pixel dans l'image précédente est PrevNDC et CurrNDC dans l'image actuelle, et qu'il n'y a pas d'échelle ni de décalage, la valeur du vecteur de mouvement est " (CurrNDC - PrevNDC) xyz ".

Utilisation valide (implicite)

Remarque

Il existe de nombreuses façons de générer motionVectorSubImage et depthSubImage . Par exemple, l'application peut les afficher dans un passage de vecteur de mouvement dédié à une résolution inférieure (voir XrFrameSynthesisConfigViewEXT pour la résolution recommandée) ou dans le passage de vue principal avec MRT (Multiple Render Targets). C'est à l'application de décider de l'approche spécifique. Les formats de virgule flottante 16 bits signés par canal de pixel sont recommandés pour motionVectorSubImage .

Options de synthèse d'images

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;

Descriptions des options

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT indique que les données de vecteur de mouvement 2D sont utilisées.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT indique à l'environnement d'exécution que l'application préfère disposer de plus de temps pour afficher chaque image, avec le compromis que davantage d'images seraient synthétisées par l'environnement d'exécution. Cela peut être utile pour les applications qui préfèrent préserver l'utilisation du processeur et du GPU (par exemple, pour augmenter l'autonomie de la batterie) ou pour augmenter le budget de calcul de chaque image. L'environnement d'exécution peut demander des images à n'importe quel intervalle, quelle que soit la valeur de cette option.

Par défaut, l'environnement d'exécution attend des données de vecteur de mouvement 3D. Par conséquent, motionVectorSubImage rgb , motionVectorScale xyz et motionVectorOffset xyz sont utilisés, comme décrit dans XrFrameSynthesisInfoEXT.

Lorsque XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT est activé sur XrFrameSynthesisInfoEXT layerFlags , l'environnement d'exécution interprète plutôt l'image de vecteur de mouvement envoyée comme des données de vecteur de mouvement 2D, représentant le mouvement de pixel 2D de l'image précédente à l'image actuelle. Les valeurs de pixels sont interprétées comme suit pour les données de vecteur de mouvement 2D : motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . Les composants motionVectorSubImage ba , motionVectorScale zw et motionVectorOffset zw sont ignorés. L'utilisation de données de vecteur de mouvement 2D au lieu de données 3D peut réduire la qualité des images synthétisées.

La structure XrFrameSynthesisConfigViewEXT est définie comme suit :

typedef struct XrFrameSynthesisConfigViewEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           recommendedMotionVectorImageRectWidth;
    uint32_t           recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;

Descriptions des membres

  • type correspond au XrStructureType de cette structure.
  • next est NULL ou un pointeur vers la structure suivante dans une chaîne de structures.
  • recommendedMotionVectorImageRectWidth : largeur recommandée pour le vecteur de mouvement et l'image de profondeur.
  • recommendedMotionVectorImageRectHeight : hauteur recommandée pour le vecteur de mouvement et l'image de profondeur.

Lorsque cette extension est activée, une application peut transmettre une structure XrFrameSynthesisConfigViewEXT dans la chaîne XrViewConfigurationView :: next lorsqu'elle appelle xrEnumerateViewConfigurationViews pour obtenir des informations sur la résolution d'image vectorielle de mouvement recommandée.

Utilisation valide (implicite)

Nouvelles structures

Nouvelles constantes d'énumération

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • Extension de XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

Problèmes

L'historique des versions

  • Révision 1, 31 janvier 2022 (Jian Zhang)

    • Description initiale de l'extension, convertie à partir de fb_space_warp
    • Collaboration avec les contributeurs pour affiner les interfaces d'extension.