XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Extension Type
Instance extension
Registered Extension Number
212
Revision
1
Ratification Status
Not ratified
Extension and Version Dependencies
Contributors
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
Przegląd
To rozszerzenie umożliwia włączenie syntezy klatek w aplikacjach na podstawie dodatkowych danych dostarczonych przez aplikację. Obrazy wektorów ruchu i obrazy głębi wygenerowane przez aplikację mogą być używane przez środowisko wykonawcze do ekstrapolacji i reprojekcji klatek wysokiej jakości w celu zsyntetyzowania nowej klatki, co zapewnia płynne działanie nawet wtedy, gdy aplikacja działa poniżej docelowej liczby klatek na sekundę.
To rozszerzenie jest zaprojektowane tak , aby było niezależne od XR_KHR_composition_layer_depth, a oba mogą być włączone i używane jednocześnie do różnych celów. XrFrameSynthesisInfoEXT :: depthSubImage może używać danych głębi przeznaczonych do syntezy klatek, a jego rozdzielczość może być niższa niż XrCompositionLayerDepthInfoKHR :: subImage . Sugerowaną rozdzielczość depthSubImage znajdziesz w XrFrameSynthesisConfigViewEXT .
Przesyłanie obrazów wektorów ruchu i obrazów głębi
Struktura XrFrameSynthesisInfoEXT jest zdefiniowana w ten sposób:
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;
Opisy elementów
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur.layerFlagsto maska bitowa XrFrameSynthesisInfoFlagsEXT .motionVectorSubImageidentyfikuje obraz wektora ruchu XrSwapchainSubImage, który ma być używany do syntezy klatek.motionVectorScaleto XrVector4f, który skaluje interpretację wektora ruchu wmotionVectorSubImage.motionVectorOffsetto XrVector4f, który przesuwa interpretację wektora ruchu wmotionVectorSubImage.appSpaceDeltaPoseto przyrostowa transformacja zastosowana przez aplikację, która wpływa na widok od poprzedniej klatki. W przypadku sztucznego poruszania się (skryptowanego ruchu, teleportacji itp.) aplikacja przekształca całą XrCompositionLayerProjection ::spacez jednej pozycji w przestrzeni aplikacji na inną pozycję między klatkami, co wpływa na widok bardziej niż śledzony ruch między klatkami. Gdy w aplikacji nie ma transformacji XrCompositionLayerProjection ::space,appSpaceDeltaPosemusi być identycznością. XrPosef ::positionwappSpaceDeltaPosemusi być względna w stosunku do bieżącej przestrzeni aplikacji XrCompositionLayerProjection ::space.depthSubImageidentyfikuje obraz głębi XrSwapchainSubImage, który ma być używany do syntezy klatek.minDepthimaxDepthto zakres wartości głębi wdepthSubImage, który musi mieścić się w zakresie [0,0, 1,0] . Jest to podobne do wartości minimalnej i maksymalnejglDepthRangeOpenGL, ale z wymaganiem, aby maxDepth ≥ minDepth .nearZto dodatnia odległość w metrach wartościminDepthw łańcuchu wymiany głębi. Aplikacje mogą używaćnearZwiększego niżfarZ, aby wskazać, że wartości głębi są odwrócone.nearZmoże być nieskończona.farZto dodatnia odległość w metrach wartościmaxDepthw łańcuchu wymiany głębi.farZmoże być nieskończona. JeślinearZ==farZ, środowisko wykonawcze musi zwrócić błądXR_ERROR_VALIDATION_FAILURE.
Podczas przesyłania obrazów wektorów ruchu i obrazów głębi wraz z warstwami projekcji dodaj strukturę XrFrameSynthesisInfoEXT do łańcucha XrCompositionLayerProjectionView :: next dla każdej struktury XrCompositionLayerProjectionView w danej warstwie.
Środowisko wykonawcze musi interpretować dane wektorów ruchu w kanałach RGB motionVectorSubImage, zmodyfikowane przez motionVectorScale i motionVectorOffset w ten sposób: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . Komponenty motionVectorSubImage a , motionVectorScale w i motionVectorOffset w są ignorowane.
Wektor ruchu reprezentuje ruch piksela od XrFrameEndInfo ::displayTime poprzedniej klatki do XrFrameEndInfo ::displayTime bieżącej klatki. Środowisko wykonawcze może używać tych informacji do ekstrapolacji renderowanej klatki do przyszłej klatki.
Wektor ruchu musi pochodzić z przestrzeni znormalizowanych współrzędnych urządzenia (NDC), która w tym kontekście używa konwencji w stylu Vulkan: zakres NDC jest zdefiniowany jako [-1, -1, 0] do [1, 1, 1], co różni się od zakresu NDC OpenGL. Sam wektor ruchu nie jest jednak ograniczony do tego zakresu. Jego wartości zależą od ruchu piksela i mogą wykraczać poza granice przestrzeni NDC. Jeśli na przykład NDC piksela w poprzedniej klatce to PrevNDC, a w bieżącej klatce to CurrNDC, i nie ma skali ani przesunięcia, wartość wektora ruchu to „(CurrNDC – PrevNDC) xyz”.
Prawidłowe użycie (pośrednie)
- Przed użyciem XrFrameSynthesisInfoEXT musi być włączone rozszerzenie
XR_EXT_frame_synthesis. -
typemusi mieć wartośćXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur. -
layerFlagsmusi mieć wartość0lub prawidłową kombinację wartości XrFrameSynthesisInfoFlagBitsEXT. -
motionVectorSubImagemusi być prawidłową strukturą XrSwapchainSubImage. -
depthSubImagemusi być prawidłową strukturą XrSwapchainSubImage.
Notatka
Istnieje wiele różnych sposobów generowania motionVectorSubImage i depthSubImage . Aplikacja może na przykład renderować je w niższej rozdzielczości w dedykowanym przebiegu wektorów ruchu (zalecaną rozdzielczość znajdziesz w XrFrameSynthesisConfigViewEXT) lub renderować je w głównym przebiegu widoku za pomocą MRT (Multiple Render Targets). To aplikacja decyduje o konkretnym podejściu. W przypadku motionVectorSubImage zalecane są formaty kanałów z 16-bitową liczbą zmiennoprzecinkową ze znakiem na piksel .
Flagi syntezy klatek
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;
Opisy flag
XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXTwskazuje, że używane są dane wektorów ruchu 2D.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTpodpowiada środowisku wykonawczemu, że aplikacja woli mieć więcej czasu na renderowanie każdej klatki, ale w zamian środowisko wykonawcze będzie syntetyzować więcej klatek. Może to być przydatne w przypadku aplikacji, które wolą oszczędzać wykorzystanie procesora i GPU (np. aby wydłużyć czas pracy baterii) lub zwiększyć budżet obliczeniowy każdej klatki. Środowisko wykonawcze może żądać klatek w dowolnym odstępie czasu, niezależnie od wartości tej flagi.
Domyślnie środowisko wykonawcze oczekuje danych wektorów ruchu 3D, dlatego używane są motionVectorSubImage rgb , motionVectorScale xyz i motionVectorOffset xyz , jak opisano w XrFrameSynthesisInfoEXT .
Gdy XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT jest włączona w XrFrameSynthesisInfoEXT layerFlags , środowisko wykonawcze interpretuje przesłany obraz wektora ruchu jako dane wektora ruchu 2D, które reprezentują ruch piksela 2D z poprzedniej klatki do bieżącej. Wartości pikseli są interpretowane w ten sposób w przypadku danych wektorów ruchu 2D: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . Komponenty motionVectorSubImage ba , motionVectorScale zw i motionVectorOffset zw są ignorowane. Używanie danych wektorów ruchu 2D zamiast 3D może obniżyć jakość syntetyzowanych klatek.
Pobieranie zalecanej rozdzielczości
Struktura XrFrameSynthesisConfigViewEXT jest zdefiniowana w ten sposób:
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
Opisy elementów
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur.recommendedMotionVectorImageRectWidth: zalecana szerokość obrazu wektora ruchu i obrazu głębi.recommendedMotionVectorImageRectHeight: zalecana wysokość obrazu wektora ruchu i obrazu głębi.
Gdy to rozszerzenie jest włączone, aplikacja może przekazać strukturę XrFrameSynthesisConfigViewEXT w łańcuchu XrViewConfigurationView :: next podczas wywoływania xrEnumerateViewConfigurationViews, aby uzyskać informacje o zalecanej rozdzielczości obrazu wektora ruchu.
Prawidłowe użycie (pośrednie)
- Przed użyciem XrFrameSynthesisConfigViewEXT musi być włączone rozszerzenie
XR_EXT_frame_synthesis. -
typemusi mieć wartośćXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.
Nowe struktury
Rozszerzanie XrCompositionLayerProjectionView :
Rozszerzanie XrViewConfigurationView :
Nowe stałe enum
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONRozszerzanie XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
Problemy
Historia wersji
Wersja 1, 31 stycznia 2022 r. (Jian Zhang)
- Początkowy opis rozszerzenia przekonwertowany z fb_space_warp.
- Współpraca z twórcami w celu udoskonalenia interfejsów rozszerzeń.