XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Erweiterungstyp
Instanzerweiterung
Registrierte Durchwahl
212
Revision
1
Ratification Status
Nicht ratifiziert
Erweiterungs- und Versionsabhängigkeiten
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 Aktivierung der Frame-Synthese in Anwendungen basierend auf zusätzlichen von der Anwendung bereitgestellten Daten. Von der Anwendung generierte Bewegungsvektor- und Tiefenbilder können von der Laufzeitumgebung verwendet werden, um eine hochwertige Frame-Extrapolation und ‑Reprojektion durchzuführen und einen neuen Frame zu synthetisieren. So wird auch dann eine flüssige Darstellung ermöglicht, 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 unterschiedliche Zwecke aktiviert und verwendet werden. XrFrameSynthesisInfoEXT :: depthSubImage kann Tiefendaten verwenden, die für die Frame-Synthese vorgesehen sind, und die Auflösung kann niedriger sein als XrCompositionLayerDepthInfoKHR :: subImage . Die empfohlene Auflösung von depthSubImage findest du unter XrFrameSynthesisConfigViewEXT.
Bewegungsvektor- 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 Bewegungsvektor-Image XrSwapchainSubImage an, das für die Frame-Synthese verwendet werden soll.motionVectorScaleist ein XrVector4f, der die Interpretation des Bewegungsvektors inmotionVectorSubImageskaliert.motionVectorOffsetist ein XrVector4f, der die Interpretation des Bewegungsvektors inmotionVectorSubImageverschiebt.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 die gesamte XrCompositionLayerProjection ::spacevon einer Pose im Anwendungsbereich zu einer anderen Pose zwischen Frames. Dadurch wird die Ansicht stärker beeinflusst als durch die getrackte Bewegung zwischen Frames. DieappSpaceDeltaPosemuss „identity“ sein, wenn in der Anwendung keine XrCompositionLayerProjection ::space-Transformation vorhanden ist. Die XrPosef ::positioninappSpaceDeltaPosemuss relativ zur aktuellen Anwendung XrCompositionLayerProjection ::spacesein.depthSubImagegibt das Tiefenbild XrSwapchainSubImage an, das für die Frame-Synthese verwendet werden soll.minDepthundmaxDepthsind der Bereich der Tiefenwerte in derdepthSubImageund müssen im Bereich [0,0, 1,0] liegen. Dies ähnelt den Mindest- und Höchstwerten vonglDepthRangein OpenGL, wobei hier die Bedingung gilt, dass maxDepth ≥ minDepth sein muss .nearZist die positive Entfernung 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 die positive Entfernung in Metern desmaxDepth-Werts in der Tiefen-Swapchain.farZkann unendlich sein. Die Laufzeit muss den FehlerXR_ERROR_VALIDATION_FAILUREzurückgeben, wennnearZ==farZ.
Wenn du Bewegungsvektor- und Tiefenbilder zusammen mit Projektionsebenen einreichst, füge der XrCompositionLayerProjectionView :: next-Kette für jede XrCompositionLayerProjectionView-Struktur in der angegebenen Ebene eine XrFrameSynthesisInfoEXT-Struktur hinzu.
Die Laufzeit muss die Bewegungsvektordaten in den RGB-Kanälen des motionVectorSubImage interpretieren, die durch motionVectorScale und motionVectorOffset so 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 NDC-Bereich (Normalized Device Coordinate) 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-Bereichs hinausgehen. Wenn beispielsweise die NDC eines Pixels im vorherigen Frame „PrevNDC“ und im aktuellen Frame „CurrNDC“ ist und es keine Skalierung oder Verschiebung gibt, ist der Wert des Bewegungsvektors „(CurrNDC – PrevNDC) xyz“.
Gültige Verwendung (implizit)
- Die Erweiterung
XR_EXT_frame_synthesismuss aktiviert sein, bevor XrFrameSynthesisInfoEXT verwendet werden kann. -
typemussXR_TYPE_FRAME_SYNTHESIS_INFO_EXTsein -
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
Hinweis
Es gibt viele verschiedene Möglichkeiten, motionVectorSubImage und depthSubImage zu generieren. Die Anwendung kann sie beispielsweise in einem dedizierten Bewegungsvektor-Durchlauf mit niedrigerer Auflösung rendern (empfohlene Auflösung siehe XrFrameSynthesisConfigViewEXT) oder im Hauptansichtsdurchlauf mit MRT (Multiple Render Targets) rendern. Es liegt an der Anwendung, den spezifischen Ansatz zu bestimmen. Für motionVectorSubImage werden signierte 16-Bit-Gleitkommaformate 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-Bewegungsvektordaten verwendet werden.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTgibt der Laufzeit einen Hinweis, dass die Anwendung mehr Zeit zum Rendern jedes Frames bevorzugt. Der Nachteil ist, dass mehr Frames von der Laufzeit synthetisiert werden. Dies kann für Anwendungen nützlich sein, bei denen die CPU- und GPU-Auslastung möglichst gering gehalten werden soll (z.B. für eine längere Akkulaufzeit) oder bei denen das Rechenbudget jedes Frames erhöht werden soll. Die Laufzeit kann Frames in beliebigen Intervallen anfordern, unabhängig vom Wert dieses Flags.
Standardmäßig erwartet die Laufzeit 3D-Bewegungsvektordaten. Daher werden motionVectorSubImage rgb, motionVectorScale xyz und motionVectorOffset xyz verwendet, wie in XrFrameSynthesisInfoEXT beschrieben.
Wenn XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT für XrFrameSynthesisInfoEXT layerFlags aktiviert ist, interpretiert die Laufzeit das eingereichte Bewegungsvektorbild stattdessen als 2D-Bewegungsvektordaten, die die 2D-Pixelbewegung vom vorherigen Frame zum aktuellen Frame darstellen. Pixelwerte werden für 2D-Bewegungsvektordaten 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-Bewegungsvektordaten kann die Qualität der synthetisierten Frames beeinträchtigen.
Empfohlene Lösung erhalten
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 Bewegungsvektors und des Tiefenbilds.recommendedMotionVectorImageRectHeight: Empfohlene Höhe des Bewegungsvektors und des Tiefenbilds.
Wenn diese Erweiterung aktiviert ist, kann eine Anwendung beim Aufrufen von xrEnumerateViewConfigurationViews eine XrFrameSynthesisConfigViewEXT-Struktur in der XrViewConfigurationView :: next-Kette übergeben, um Informationen zur empfohlenen Auflösung des Bewegungsvektor-Images zu erhalten.
Gültige Verwendung (implizit)
- Die Erweiterung
XR_EXT_frame_synthesismuss aktiviert sein, bevor XrFrameSynthesisConfigViewEXT verwendet werden kann. -
typemussXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTsein -
nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.
Neue Gebäude
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
Version 1, 31.01.2022 (Jian Zhang)
- Ursprüngliche Erweiterungsbeschreibung, konvertiert aus fb_space_warp
- Zusammenarbeit mit Mitwirkenden, um die Erweiterungsschnittstellen zu optimieren.