XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Tipo di estensione
Estensione dell'istanza
Numero di interno registrato
212
Revisione
1
Stato della ratifica
Non ratificato
Dipendenze di estensioni e versioni
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 attivare la sintesi dei frame nelle applicazioni in base ai dati aggiuntivi forniti dall'applicazione. Le immagini vettoriali 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 è in esecuzione al di sotto del target di FPS.
Questa estensione è progettata per essere indipendente da XR_KHR_composition_layer_depth ed entrambe possono essere attivate e utilizzate contemporaneamente per scopi diversi. XrFrameSynthesisInfoEXT :: depthSubImage può utilizzare i dati di profondità dedicati alla sintesi dei frame e la sua risoluzione può essere inferiore a XrCompositionLayerDepthInfoKHR :: subImage . Consulta XrFrameSynthesisConfigViewEXT per la risoluzione suggerita di depthSubImage .
Invia immagini vettoriali di movimento e immagini di profondità
La struttura XrFrameSynthesisInfoEXT è definita come:
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 rispetto al frame precedente. Le esperienze di locomozione artificiale (movimento programmato, teletrasporto e così via) prevedono che l'applicazione trasformi l'intero XrCompositionLayerProjection ::spaceda una posizione dello spazio dell'applicazione a un'altra tra i frame, influenzando la visualizzazione di un valore superiore al movimento monitorato tra i frame.appSpaceDeltaPosedeve essere l'identità quando non è presente alcuna trasformazione XrCompositionLayerProjection ::spacenell'applicazione. XrPosef ::positioninappSpaceDeltaPosedeve essere relativo all'applicazione corrente XrCompositionLayerProjection ::space.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] . Questo è 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 un valorenearZmaggiore 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 vettoriali 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 del vettore 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 visualizzato in un frame futuro.
Il vettore di movimento deve essere derivato dallo spazio delle coordinate normalizzate del dispositivo (NDC), che in questo contesto utilizza convenzioni in stile Vulkan: l'intervallo NDC è definito da [-1, -1, 0] a [1, 1, 1], diverso dall'intervallo NDC di OpenGL. Tuttavia, il vettore di movimento stesso non è limitato a questo intervallo; i suoi valori dipendono dal movimento del pixel e possono estendersi oltre i confini dello spazio NDC. Ad esempio, dato che l'NDC di un pixel nel frame precedente è PrevNDC e CurrNDC nel frame corrente e che non esiste alcuna scala o offset, il valore del vettore di movimento è " (CurrNDC - PrevNDC) xyz".
Utilizzo valido (implicito)
- L'estensione
XR_EXT_frame_synthesisdeve essere attivata 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 potrebbe eseguirne il rendering in un passaggio di vettori di movimento dedicato a risoluzione inferiore (consulta XrFrameSynthesisConfigViewEXT per la risoluzione consigliata) o eseguirne il rendering nel passaggio di visualizzazione principale con MRT (Multiple Render Targets). Spetta all'applicazione decidere l'approccio specifico. Per motionVectorSubImage sono consigliati i formati di canale con virgola mobile a 16 bit con segno per pixel.
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 un suggerimento al runtime che l'applicazione preferisce un tempo aggiuntivo per eseguire il rendering di ogni frame, con il compromesso che più frame verrebbero sintetizzati dal runtime. Questo può essere utile per le applicazioni che preferiscono ridurre l'utilizzo di CPU e GPU (ad esempio per aumentare la durata della batteria) o per aumentare il budget di calcolo di ogni frame. Il runtime può richiedere frame a qualsiasi intervallo, indipendentemente dal valore di questo flag.
Per impostazione predefinita, il runtime prevede 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 su XrFrameSynthesisInfoEXT layerFlags , il runtime interpreta l'immagine vettoriale di movimento inviata come dati vettoriali di movimento 2D, che rappresentano il movimento dei pixel 2D dal frame precedente a quello 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 di vettori di movimento 2D anziché 3D potrebbe ridurre la qualità dei frame sintetizzati.
Ricevi la risoluzione consigliata
La struttura XrFrameSynthesisConfigViewEXT è definita come:
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 di profondità e del vettore di movimento.recommendedMotionVectorImageRectHeight: altezza consigliata dell'immagine di profondità e del vettore di movimento.
Quando questa estensione è abilitata, un'applicazione può passare una struttura XrFrameSynthesisConfigViewEXT nella catena XrViewConfigurationView :: next quando chiama xrEnumerateViewConfigurationViews per acquisire informazioni sulla risoluzione dell'immagine vettoriale di movimento consigliata.
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 gennaio 2022 (Jian Zhang)
- Descrizione iniziale dell'estensione, convertita da fb_space_warp
- Collaborare con i collaboratori per perfezionare le interfacce delle estensioni.