XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

Erweiterungstyp

Instanzerweiterung

Registrierte Erweiterungsnummer

212

Revision

1

Ratifizierungsstatus

Nicht ratifiziert

Abhängigkeiten von Erweiterungen und Versionen

OpenXR 1.0

Mitwirkende

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

Übersicht

Diese Erweiterung bietet Unterstützung für die Frame-Synthese in Anwendungen auf Grundlage zusätzlicher von der Anwendung bereitgestellter Daten. Von der Anwendung generierte Bilder mit Bewegungsvektoren und Tiefenbilder können von der Laufzeit verwendet werden, um eine hochwertige Frame-Extrapolation und -Reprojektion durchzuführen und so einen neuen Frame zu synthetisieren. Dadurch wird eine reibungslose Nutzung ermöglicht, auch wenn die Anwendung unter dem FPS-Zielwert ausgeführt wird.

Diese Erweiterung ist unabhängig von XR_KHR_composition_layer_depth und beide können gleichzeitig für verschiedene Zwecke aktiviert und verwendet werden. In XrFrameSynthesisInfoEXT :: depthSubImage können Tiefendaten verwendet werden, die speziell für die Frame-Synthese bestimmt sind. Die Auflösung kann niedriger sein als bei XrCompositionLayerDepthInfoKHR :: subImage. Die empfohlene Auflösung für depthSubImage finden Sie unter XrFrameSynthesisConfigViewEXT .

Bilder mit Bewegungsvektoren und Tiefenbilder einreichen

Die Struktur XrFrameSynthesisInfoEXT ist so definiert:

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;

Mitgliederbeschreibungen

  • type ist der XrStructureType dieser Struktur.
  • next ist NULL oder ein Zeiger auf die nächste Struktur in einer Strukturkette.
  • layerFlags ist eine Bitmaske von XrFrameSynthesisInfoFlagsEXT .
  • motionVectorSubImage gibt das Bild mit Bewegungsvektoren XrSwapchainSubImage an, das für die Frame-Synthese verwendet werden soll.
  • motionVectorScale ist ein XrVector4f, mit dem die Interpretation des Bewegungsvektors in motionVectorSubImage skaliert wird .
  • motionVectorOffset ist ein XrVector4f, mit dem die Interpretation des Bewegungsvektors in motionVectorSubImage verschoben wird .
  • appSpaceDeltaPose ist die inkrementelle von der Anwendung angewendete Transformation, die sich seit dem vorherigen Frame auf die Ansicht auswirkt. Bei künstlicher Fortbewegung (geskriptete Bewegung, Teleportation usw.) transformiert die Anwendung den gesamten XrCompositionLayerProjection :: space von einer Anwendungspose zu einer anderen Pose zwischen den Frames. Dadurch wird die Ansicht stärker beeinflusst als durch die erfasste Bewegung zwischen den Frames. The appSpaceDeltaPose muss die Identität sein, wenn in der Anwendung keine XrCompositionLayerProjection :: space Transformation vorhanden ist. Die XrPosef :: position in appSpaceDeltaPose muss relativ zum aktuellen XrCompositionLayerProjection :: space der Anwendung sein .
  • depthSubImage gibt das Tiefenbild XrSwapchainSubImage an, das für die Frame-Synthese verwendet werden soll.
  • minDepth und maxDepth sind der Bereich der Tiefenwerte in depthSubImage und müssen im Bereich [0,0, 1,0] liegen. Dies ähnelt den Mindest- und Höchstwerten von glDepthRange in OpenGL, wobei hier jedoch gilt, dass „maxDepth“ ≥ „minDepth“ sein muss .
  • nearZ ist der positive Abstand in Metern des minDepth-Werts in der Tiefen-Swapchain. Anwendungen können einen nearZ-Wert verwenden, der größer als farZ ist, um anzugeben, dass die Tiefenwerte umgekehrt sind. nearZ kann unendlich sein.
  • farZ ist der positive Abstand in Metern des maxDepth-Werts in der Tiefen-Swapchain. farZ kann unendlich sein. Die Laufzeit muss den Fehler XR_ERROR_VALIDATION_FAILURE zurückgeben, wenn nearZ == farZ.

Wenn Sie Bilder mit Bewegungsvektoren und Tiefenbilder zusammen mit Projektionsebenen einreichen, fügen Sie der Kette XrCompositionLayerProjectionView :: next für jede XrCompositionLayerProjectionView-Struktur in der angegebenen Ebene eine XrFrameSynthesisInfoEXT-Struktur hinzu.

Die Laufzeit muss die Daten der Bewegungsvektoren in den RGB-Kanälen von motionVectorSubImage interpretieren, die durch motionVectorScale und motionVectorOffset wie folgt geändert wurden: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . Die Komponenten motionVectorSubImage a , motionVectorScale w und motionVectorOffset w werden ignoriert.

Der Bewegungsvektor stellt die Bewegung eines Pixels seit der XrFrameEndInfo ::displayTime des vorherigen Frames bis zur XrFrameEndInfo ::displayTime des aktuellen Frames dar. Die Laufzeit kann diese Informationen verwenden, um den gerenderten Frame in einen zukünftigen Frame zu extrapolieren.

Der Bewegungsvektor muss aus dem normalisierten Gerätekoordinatenraum (Normalized Device Coordinate, NDC) abgeleitet werden, der in diesem Kontext Vulkan-Konventionen verwendet: Der NDC-Bereich ist als [-1, -1, 0] bis [1, 1, 1] definiert und unterscheidet sich vom NDC-Bereich von OpenGL. Der Bewegungsvektor selbst ist jedoch nicht auf diesen Bereich beschränkt. Seine Werte hängen von der Bewegung des Pixels ab und können über die Grenzen des NDC-Raums hinausgehen. Wenn beispielsweise der NDC eines Pixels im vorherigen Frame PrevNDC und im aktuellen Frame CurrNDC ist und keine Skalierung oder Verschiebung erfolgt, ist der Wert des Bewegungsvektors „(CurrNDC – PrevNDC) xyz“.

Gültige Verwendung (implizit)

Community-Anmerkung

Es gibt viele verschiedene Möglichkeiten, motionVectorSubImage und depthSubImage zu generieren . Die Anwendung kann sie beispielsweise in einem separaten Durchlauf mit niedrigerer Auflösung für Bewegungsvektoren rendern (empfohlene Auflösung siehe XrFrameSynthesisConfigViewEXT) oder sie im Hauptansichtsdurchlauf mit MRT (Multiple Render Targets) rendern. Die Anwendung entscheidet über den konkreten Ansatz. Für motionVectorSubImage werden Formate mit 16-Bit-Gleitkommazahlen mit Vorzeichen pro Pixelkanal empfohlen .

Flags für die Frame-Synthese

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;

Flag-Beschreibungen

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT gibt an, dass 2D-Daten für Bewegungsvektoren verwendet werden.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT gibt der Laufzeit einen Hinweis, dass die Anwendung mehr Zeit für das Rendern jedes Frames benötigt. Im Gegenzug werden mehr Frames von der Laufzeit synthetisiert. Dies kann für Anwendungen nützlich sein, die die CPU- und GPU-Auslastung reduzieren möchten (z.B. um die Akkulaufzeit zu verlängern) oder das Rechenbudget für jeden Frame erhöhen möchten. Die Laufzeit kann Frames in beliebigen Intervallen anfordern, unabhängig vom Wert dieses Flags.

Standardmäßig erwartet die Laufzeit 3D-Daten für Bewegungsvektoren. Daher werden motionVectorSubImage rgb, motionVectorScale xyz und motionVectorOffset xyz verwendet, wie unter XrFrameSynthesisInfoEXT beschrieben.

Wenn XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT für XrFrameSynthesisInfoEXT layerFlags aktiviert ist , interpretiert die Laufzeit das eingereichte Bild mit Bewegungsvektoren stattdessen als 2D-Daten für Bewegungsvektoren, die die 2D-Pixelbewegung vom vorherigen zum aktuellen Frame darstellen. Die Pixelwerte werden für 2D-Daten für Bewegungsvektoren so interpretiert: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . Die Komponenten motionVectorSubImage ba , motionVectorScale zw und motionVectorOffset zw werden ignoriert. Die Verwendung von 2D- statt 3D-Daten für Bewegungsvektoren kann die Qualität der synthetisierten Frames verringern.

Die Struktur XrFrameSynthesisConfigViewEXT ist so definiert:

typedef struct XrFrameSynthesisConfigViewEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           recommendedMotionVectorImageRectWidth;
    uint32_t           recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;

Mitgliederbeschreibungen

  • type ist der XrStructureType dieser Struktur.
  • next ist NULL oder ein Zeiger auf die nächste Struktur in einer Strukturkette.
  • recommendedMotionVectorImageRectWidth : empfohlene Breite des Bildes mit Bewegungsvektoren und des Tiefenbildes.
  • recommendedMotionVectorImageRectHeight : empfohlene Höhe des Bildes mit Bewegungsvektoren und des Tiefenbildes.

Wenn diese Erweiterung aktiviert ist, kann eine Anwendung beim Aufrufen von xrEnumerateViewConfigurationViews eine XrFrameSynthesisConfigViewEXT-Struktur in der Kette XrViewConfigurationView :: next übergeben, um Informationen zur empfohlenen Auflösung des Bildes mit Bewegungsvektoren zu erhalten.

Gültige Verwendung (implizit)

Neue Strukturen

Neue Enum-Konstanten

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • Erweiterung von XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

Probleme

Versionsverlauf

  • Revision 1, 31.01.2022 (Jian Zhang)

    • Erste Beschreibung der Erweiterung, konvertiert aus fb_space_warp
    • Zusammenarbeit mit Mitwirkenden zur Optimierung der Erweiterungsschnittstellen