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
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
typecorrespond au XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures.layerFlagsest un masque de bits de XrFrameSynthesisInfoFlagsEXT .motionVectorSubImageidentifie l'image vectorielle de mouvement XrSwapchainSubImage à utiliser pour la synthèse d'images.motionVectorScaleest un XrVector4f qui met à l'échelle l'interprétation du vecteur de mouvement dansmotionVectorSubImage.motionVectorOffsetest un XrVector4f qui décale l'interprétation du vecteur de mouvement dansmotionVectorSubImage.appSpaceDeltaPoseest 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 ::spaced'une pose d'espace d'application à une autre entre les images, ce qui affecte la vue plus que le mouvement suivi entre les images. TheappSpaceDeltaPosedoit être une identité lorsqu'il n'y a pas de transformation XrCompositionLayerProjection ::spacedans l'application. Le XrPosef ::positiondansappSpaceDeltaPosedoit être relatif à l'application actuelle XrCompositionLayerProjection ::space.depthSubImageidentifie l'image de profondeur XrSwapchainSubImage à utiliser pour la synthèse d'images.minDepthetmaxDepthcorrespondent à la plage de valeurs de profondeur dansdepthSubImage, et doivent être comprises entre [0,0 et 1,0] . Cela s'apparente aux valeurs minimales et maximales deglDepthRanged'OpenGL , mais avec l'exigence que maxDepth ≥ minDepth .nearZcorrespond à la distance positive en mètres de la valeurminDepthdans la chaîne d'échange de profondeur. Les applications peuvent utiliser unnearZsupérieur àfarZpour indiquer que les valeurs de profondeur sont inversées.nearZpeut être infini.farZcorrespond à la distance positive en mètres de la valeurmaxDepthdans la chaîne d'échange de profondeur.farZpeut être infini. L'environnement d'exécution doit renvoyer l'erreurXR_ERROR_VALIDATION_FAILUREsinearZ==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)
- L'extension
XR_EXT_frame_synthesisdoit être activée avant d'utiliser XrFrameSynthesisInfoEXT. -
typedoit êtreXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures -
layerFlagsdoit être0ou une combinaison valide de valeurs XrFrameSynthesisInfoFlagBitsEXT. -
motionVectorSubImagedoit être une structure XrSwapchainSubImage valide. -
depthSubImagedoit être une structure XrSwapchainSubImage valide.
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_EXTindique que les données de vecteur de mouvement 2D sont utilisées.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTindique à 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.
Obtenir la résolution recommandée
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
typecorrespond au XrStructureType de cette structure.nextestNULLou 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)
- L'extension
XR_EXT_frame_synthesisdoit être activée avant d'utiliser XrFrameSynthesisConfigViewEXT -
typedoit êtreXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Nouvelles structures
Extension de XrCompositionLayerProjectionView :
Extension de XrViewConfigurationView :
Nouvelles constantes d'énumération
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONExtension de XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_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.