XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

Type d'extension

Extension d'instance

Numéro d'extension enregistré

212

Révision

1

État de la 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 de frames sur les applications en fonction des données supplémentaires fournies par l'application. Les images de vecteurs 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'images 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 l'objectif de FPS.

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. 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 vectorielles 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 est le 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émentielle 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'intégralité de XrCompositionLayerProjection :: space d'une pose d'espace d'application à une autre pose entre les images, ce qui affecte la vue plus que le mouvement suivi entre les images. La valeur de appSpaceDeltaPose doit être "identity" lorsqu'il n'y a pas de transformation XrCompositionLayerProjection :: space dans l'application. La valeur XrPosef :: position dans appSpaceDeltaPose doit être relative à la valeur XrCompositionLayerProjection :: space de l'application actuelle.
  • depthSubImage identifie l'image de profondeur XrSwapchainSubImage à utiliser pour la synthèse d'images.
  • minDepth et maxDepth sont la plage de valeurs de profondeur dans depthSubImage et doivent être comprises entre [0,0,1,0] . Cela s'apparente aux valeurs minimale et maximale de glDepthRange d'OpenGL, mais avec l'exigence que maxDepth ≥ minDepth .
  • nearZ est la distance positive en mètres de la valeur minDepth dans la chaîne d'échange de profondeur. Les applications peuvent utiliser une valeur nearZ supérieure à farZ pour indiquer que les valeurs de profondeur sont inversées. nearZ peut être infini.
  • farZ est 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 vectorielles 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 du calque donné.

L'environnement d'exécution doit interpréter les données du vecteur de mouvement dans les canaux RVB de motionVectorSubImage, modifiées 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 affichée dans une image future.

Le vecteur de mouvement doit être dérivé de l'espace de coordonnées normalisées de l'appareil (NDC), qui utilise dans ce contexte des conventions de style Vulkan : la plage NDC est définie de [-1, -1, 0] à [1, 1, 1], ce qui est différent 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 une passe de vecteur de mouvement dédiée de résolution inférieure (voir XrFrameSynthesisConfigViewEXT pour la résolution recommandée) ou les afficher dans la passe de vue principale avec MRT (Multiple Render Targets). C'est à l'application de décider de l'approche spécifique. Les formats de canaux à virgule flottante 16 bits signés par pixel sont recommandés pour motionVectorSubImage .

Options de synthèse de frames

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 flags

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT indique que des 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 pour contrepartie que davantage d'images seront synthétisées par l'environnement d'exécution. Cela peut être utile pour les applications qui préfèrent limiter 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 frame. 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 déplacement 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 l'image du vecteur de mouvement envoyée comme des données de vecteur de mouvement 2D, représentant le mouvement des pixels 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 déplacement 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 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 est le 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 lors de l'appel de 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/01/2022 (Jian Zhang)

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