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

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 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 è 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 rispetto al frame precedente. Le esperienze di locomozione artificiale (movimento programmato, teletrasporto e così via) prevedono che l'applicazione trasformi l'intero XrCompositionLayerProjection :: space da 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. appSpaceDeltaPose deve essere l'identità quando non è presente alcuna trasformazione XrCompositionLayerProjection :: space nell'applicazione. XrPosef :: position in appSpaceDeltaPose deve essere relativo all'applicazione corrente XrCompositionLayerProjection :: space .
  • 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] . Questo è 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 valore 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 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)

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

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

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 gennaio 2022 (Jian Zhang)

    • Descrizione iniziale dell'estensione, convertita da fb_space_warp
    • Collaborare con i collaboratori per perfezionare le interfacce delle estensioni.