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
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
typeest le 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é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 ::spaced'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 deappSpaceDeltaPosedoit être "identity" lorsqu'il n'y a pas de transformation XrCompositionLayerProjection ::spacedans l'application. La valeur XrPosef ::positiondansappSpaceDeltaPosedoit être relative à la valeur XrCompositionLayerProjection ::spacede l'application actuelle.depthSubImageidentifie l'image de profondeur XrSwapchainSubImage à utiliser pour la synthèse d'images.minDepthetmaxDepthsont la plage de valeurs de profondeur dansdepthSubImageet doivent être comprises entre [0,0,1,0] . Cela s'apparente aux valeurs minimale et maximale deglDepthRanged'OpenGL, mais avec l'exigence que maxDepth ≥ minDepth .nearZest la distance positive en mètres de la valeurminDepthdans la chaîne d'échange de profondeur. Les applications peuvent utiliser une valeurnearZsupérieure àfarZpour indiquer que les valeurs de profondeur sont inversées.nearZpeut être infini.farZest 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 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)
- 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 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_EXTindique que des 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 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.
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
typeest le 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 lors de l'appel de 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/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.