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
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
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette.layerFlagsist eine Bitmaske von XrFrameSynthesisInfoFlagsEXT .motionVectorSubImagegibt das Bild mit Bewegungsvektoren XrSwapchainSubImage an, das für die Frame-Synthese verwendet werden soll.motionVectorScaleist ein XrVector4f, mit dem die Interpretation des Bewegungsvektors inmotionVectorSubImageskaliert wird .motionVectorOffsetist ein XrVector4f, mit dem die Interpretation des Bewegungsvektors inmotionVectorSubImageverschoben wird .appSpaceDeltaPoseist 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 ::spacevon einer Anwendungspose zu einer anderen Pose zwischen den Frames. Dadurch wird die Ansicht stärker beeinflusst als durch die erfasste Bewegung zwischen den Frames. TheappSpaceDeltaPosemuss die Identität sein, wenn in der Anwendung keine XrCompositionLayerProjection ::spaceTransformation vorhanden ist. Die XrPosef ::positioninappSpaceDeltaPosemuss relativ zum aktuellen XrCompositionLayerProjection ::spaceder Anwendung sein .depthSubImagegibt das Tiefenbild XrSwapchainSubImage an, das für die Frame-Synthese verwendet werden soll.minDepthundmaxDepthsind der Bereich der Tiefenwerte indepthSubImageund müssen im Bereich [0,0, 1,0] liegen. Dies ähnelt den Mindest- und Höchstwerten vonglDepthRangein OpenGL, wobei hier jedoch gilt, dass „maxDepth“ ≥ „minDepth“ sein muss .nearZist der positive Abstand in Metern desminDepth-Werts in der Tiefen-Swapchain. Anwendungen können einennearZ-Wert verwenden, der größer alsfarZist, um anzugeben, dass die Tiefenwerte umgekehrt sind.nearZkann unendlich sein.farZist der positive Abstand in Metern desmaxDepth-Werts in der Tiefen-Swapchain.farZkann unendlich sein. Die Laufzeit muss den FehlerXR_ERROR_VALIDATION_FAILUREzurückgeben, wennnearZ==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)
- Die
XR_EXT_frame_synthesisErweiterung muss aktiviert sein, bevor XrFrameSynthesisInfoEXT verwendet wird. -
typemuss seinXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein. -
layerFlagsmuss0oder eine gültige Kombination von XrFrameSynthesisInfoFlagBitsEXT-Werten sein -
motionVectorSubImagemuss eine gültige XrSwapchainSubImage-Struktur sein. -
depthSubImagemuss eine gültige XrSwapchainSubImage-Struktur sein.
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_EXTgibt an, dass 2D-Daten für Bewegungsvektoren verwendet werden.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTgibt 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.
Empfohlene Auflösung abrufen
Die Struktur XrFrameSynthesisConfigViewEXT ist so definiert:
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
Mitgliederbeschreibungen
typeist der XrStructureType dieser Struktur.nextistNULLoder 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)
- Die Erweiterung
XR_EXT_frame_synthesismuss aktiviert sein, bevor XrFrameSynthesisConfigViewEXT verwendet wird. -
typemuss seinXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.
Neue Strukturen
Erweiterung von XrCompositionLayerProjectionView :
Erweiterung von XrViewConfigurationView :
Neue Enum-Konstanten
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONErweiterung von XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_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