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

OpenXR 1.0

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 è NULL o un puntatore alla struttura successiva in una catena di strutture.
  • layerFlags è una maschera di bit di XrFrameSynthesisInfoFlagsEXT .
  • motionVectorSubImage identifica l'immagine vettoriale di movimento XrSwapchainSubImage da utilizzare per la sintesi dei frame.
  • motionVectorScale è un XrVector4f che scala l'interpretazione del vettore di movimento in motionVectorSubImage .
  • motionVectorOffset è un XrVector4f che compensa l'interpretazione del vettore di movimento in motionVectorSubImage .
  • 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 :: space da una posa dello spazio dell'applicazione a un'altra posa tra i frame, influenzando la visualizzazione più del movimento tracciato tra i frame. The appSpaceDeltaPose deve essere un'identità quando non è presente alcuna trasformazione XrCompositionLayerProjection :: space nell'applicazione. Il XrPosef :: position in appSpaceDeltaPose deve essere relativo all'XrCompositionLayerProjection :: space dell'applicazione corrente .
  • depthSubImage identifica l'immagine di profondità XrSwapchainSubImage da utilizzare per la sintesi dei frame.
  • minDepth e maxDepth sono l'intervallo di valori di profondità in depthSubImage e devono essere compresi nell'intervallo [0.0,1.0] . È simile ai valori minimo e massimo di glDepthRange di OpenGL , ma con il requisito che maxDepth ≥ minDepth .
  • nearZ è la distanza positiva in metri del valore minDepth nella swapchain di profondità. Le applicazioni possono utilizzare un nearZ maggiore di farZ per indicare che i valori di profondità sono invertiti. nearZ può essere infinito.
  • farZ è la distanza positiva in metri del valore maxDepth nella swapchain di profondità. farZ può essere infinito. Il runtime deve restituire l'errore XR_ERROR_VALIDATION_FAILURE se nearZ == 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)

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_EXT indica che vengono utilizzati i dati dei vettori di movimento 2D.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT fornisce 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.

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 è NULL o 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)

Nuove strutture

Nuove costanti enum

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • Estensione di XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_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.