XR_EXT_frame_synthesis
Stringa del nome
XR_EXT_frame_synthesis
Tipo di estensione
Estensione dell'istanza
Numero di estensione registrato
212
Revisione
1
Stato di ratifica
Non ratificato
Dipendenze di estensione e versione
Collaboratori
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
Panoramica
Questa estensione fornisce il supporto per abilitare la sintesi dei frame nelle applicazioni basate su dati aggiuntivi forniti dall'applicazione. Le immagini dei vettori di movimento e le immagini di profondità generate dall'applicazione possono essere utilizzate dal runtime per eseguire l'estrapolazione e la riproiezione dei frame di alta qualità per sintetizzare un nuovo frame, offrendo un'esperienza fluida anche quando l'applicazione viene eseguita al di sotto dell'FPS target.
Questa estensione è progettata per essere indipendente da XR_KHR_composition_layer_depth ed entrambe possono essere abilitate e utilizzate contemporaneamente per scopi diversi. Il XrFrameSynthesisInfoEXT :: depthSubImage può utilizzare i dati di profondità dedicati alla sintesi dei frame e la sua risoluzione può essere inferiore a XrCompositionLayerDepthInfoKHR :: subImage . Per la risoluzione suggerita di depthSubImage , consulta XrFrameSynthesisConfigViewEXT .
Inviare immagini dei vettori di movimento e immagini di profondità
La struttura XrFrameSynthesisInfoEXT è definita come segue:
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;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.layerFlagsè una maschera di bit di XrFrameSynthesisInfoFlagsEXT .motionVectorSubImageidentifica l'immagine vettoriale di movimento XrSwapchainSubImage da utilizzare per la sintesi dei frame.motionVectorScaleè un XrVector4f che scala l'interpretazione del vettore di movimento inmotionVectorSubImage.motionVectorOffsetè un XrVector4f che compensa l'interpretazione del vettore di movimento inmotionVectorSubImage.appSpaceDeltaPoseè la trasformazione incrementale applicata dall'applicazione, se presente, che influisce sulla visualizzazione dall'ultimo frame. Le esperienze di locomozione artificiale (movimento con script, teletrasporto e così via) comportano la trasformazione da parte dell'applicazione dell'intero XrCompositionLayerProjection ::spaceda una posa dello spazio dell'applicazione a un'altra posa tra i frame, influenzando la visualizzazione più del movimento tracciato tra i frame. TheappSpaceDeltaPosedeve essere un'identità quando non è presente alcuna trasformazione XrCompositionLayerProjection ::spacenell'applicazione. Il XrPosef ::positioninappSpaceDeltaPosedeve essere relativo all'XrCompositionLayerProjection ::spacedell'applicazione corrente .depthSubImageidentifica l'immagine di profondità XrSwapchainSubImage da utilizzare per la sintesi dei frame.minDepthemaxDepthsono l'intervallo di valori di profondità indepthSubImagee devono essere compresi nell'intervallo [0.0,1.0] . È simile ai valori minimo e massimo diglDepthRangedi OpenGL , ma con il requisito che maxDepth ≥ minDepth .nearZè la distanza positiva in metri del valoreminDepthnella swapchain di profondità. Le applicazioni possono utilizzare unnearZmaggiore difarZper indicare che i valori di profondità sono invertiti.nearZpuò essere infinito.farZè la distanza positiva in metri del valoremaxDepthnella swapchain di profondità.farZpuò essere infinito. Il runtime deve restituire l'erroreXR_ERROR_VALIDATION_FAILUREsenearZ==farZ
Quando invii immagini dei vettori di movimento e immagini di profondità insieme ai livelli di proiezione, aggiungi una struttura XrFrameSynthesisInfoEXT alla catena XrCompositionLayerProjectionView :: next per ogni struttura XrCompositionLayerProjectionView nel livello specificato.
Il runtime deve interpretare i dati dei vettori di movimento nei canali RGB di motionVectorSubImage, modificati da motionVectorScale e motionVectorOffset come segue: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . I componenti motionVectorSubImage a , motionVectorScale w e motionVectorOffset w vengono ignorati.
Il vettore di movimento rappresenta il movimento di un pixel dal XrFrameEndInfo ::displayTime del frame precedente al XrFrameEndInfo ::displayTime del frame corrente. Il runtime può utilizzare queste informazioni per estrapolare il frame sottoposto a rendering in un frame futuro.
Il vettore di movimento deve essere derivato dallo spazio delle coordinate del dispositivo normalizzate (NDC), che in questo contesto utilizza le convenzioni in stile Vulkan: l'intervallo NDC è definito come [-1, -1, 0] a [1, 1, 1], diverso dall'intervallo NDC di OpenGL. Tuttavia, il vettore di movimento stesso non è vincolato a questo intervallo; i suoi valori dipendono dal movimento del pixel e possono estendersi oltre i limiti dello spazio NDC. Ad esempio, dato che l'NDC di un pixel nel frame precedente è PrevNDC e CurrNDC nel frame corrente e che non sono presenti scale o offset, il valore del vettore di movimento è " (CurrNDC - PrevNDC) xyz ".
Utilizzo valido (implicito)
- L'estensione
XR_EXT_frame_synthesisdeve essere abilitata prima di utilizzare XrFrameSynthesisInfoEXT -
typedeve essereXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
layerFlagsdeve essere0o una combinazione valida di valori XrFrameSynthesisInfoFlagBitsEXT -
motionVectorSubImagedeve essere una struttura XrSwapchainSubImage valida -
depthSubImagedeve essere una struttura XrSwapchainSubImage valida
Nota
Esistono molti modi diversi per generare motionVectorSubImage e depthSubImage . Ad esempio, l'applicazione può eseguirne il rendering in una risoluzione inferiore dedicata al passaggio del vettore di movimento (vedi XrFrameSynthesisConfigViewEXT per la risoluzione consigliata) oppure eseguirne il rendering nel passaggio della visualizzazione principale con MRT (Multiple Render Targets). La decisione sull'approccio specifico spetta all'applicazione. Per motionVectorSubImage sono consigliati i formati di canale per pixel con virgola mobile a 16 bit con segno .
Flag di sintesi dei frame
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;
Descrizioni dei flag
XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXTindica che vengono utilizzati i dati dei vettori di movimento 2D.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTfornisce al runtime un suggerimento che indica che l'applicazione preferisce un tempo aggiuntivo per il rendering di ogni frame, con il compromesso che il runtime sintetizzerebbe più frame. Questo può essere utile per le applicazioni che preferiscono conservare l'utilizzo di CPU e GPU (ad es. per aumentare la durata della batteria) o per aumentare il budget di calcolo di ogni frame. Il runtime può richiedere i frame a qualsiasi intervallo, indipendentemente dal valore di questo flag.
Per impostazione predefinita, il runtime prevede i dati dei vettori di movimento 3D, quindi vengono utilizzati motionVectorSubImage rgb , motionVectorScale xyz e motionVectorOffset xyz, come descritto in XrFrameSynthesisInfoEXT .
Quando XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT è abilitato in XrFrameSynthesisInfoEXT layerFlags , il runtime interpreta invece l'immagine del vettore di movimento inviata come dati dei vettori di movimento 2D, che rappresentano il movimento dei pixel 2D dal frame precedente al frame corrente. I valori dei pixel vengono interpretati come segue per i dati dei vettori di movimento 2D: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . I componenti motionVectorSubImage ba , motionVectorScale zw e motionVectorOffset zw vengono ignorati. L'utilizzo di dati dei vettori di movimento 2D anziché 3D può ridurre la qualità dei frame sintetizzati.
Ottenere la risoluzione consigliata
La struttura XrFrameSynthesisConfigViewEXT è definita come segue:
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.recommendedMotionVectorImageRectWidth: larghezza consigliata dell'immagine del vettore di movimento e di profondità.recommendedMotionVectorImageRectHeight: altezza consigliata dell'immagine del vettore di movimento e di profondità.
Quando questa estensione è abilitata, un'applicazione può passare una struttura XrFrameSynthesisConfigViewEXT nella catena XrViewConfigurationView :: next quando chiama xrEnumerateViewConfigurationViews per acquisire informazioni sulla risoluzione consigliata dell'immagine del vettore di movimento.
Utilizzo valido (implicito)
- L'estensione
XR_EXT_frame_synthesisdeve essere abilitata prima di utilizzare XrFrameSynthesisConfigViewEXT -
typedeve essereXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture
Nuove strutture
Estensione di XrCompositionLayerProjectionView :
Estensione di XrViewConfigurationView :
Nuove costanti enum
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONEstensione di XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
Problemi
Cronologia delle versioni
Revisione 1, 31/01/2022 (Jian Zhang)
- Descrizione iniziale dell'estensione, convertita da fb_space_warp
- Collaborazione con i contributori per perfezionare le interfacce delle estensioni.