XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
212
Wersja
1
Stan ratyfikacji
Nie ratyfikowano
Zależności rozszerzeń i wersji
Twórcy
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 syntezę klatek w aplikacjach na podstawie dodatkowych danych dostarczanych przez aplikację. Wygenerowane przez aplikację obrazy wektorów ruchu i obrazy głębi mogą być używane przez środowisko wykonawcze do wysokiej jakości ekstrapolacji i reprojekcji klatek w celu syntezy nowej klatki, co zapewnia płynne działanie, nawet gdy aplikacja działa poniżej docelowej liczby klatek na sekundę.
To rozszerzenie jest niezależne od XR_KHR_composition_layer_depth i można włączyć i używać obu jednocześnie do różnych celów. XrFrameSynthesisInfoEXT :: depthSubImage może używać danych o 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 członkó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 przyrostowe przekształcenie zastosowane przez aplikację, które wpływa na widok od poprzedniej klatki. Sztuczne przemieszczanie się (ruch skryptowy, teleportacja itp.) polega na tym, że aplikacja przekształca całą warstwę XrCompositionLayerProjection ::spacez jednej pozycji przestrzeni aplikacji w inną pozycję między klatkami, co wpływa na widok w większym stopniu niż śledzony ruch między klatkami. Jeśli w aplikacji nie ma przekształcenia XrCompositionLayerProjection ::space,appSpaceDeltaPosemusi być tożsamością. XrPosef ::positionwappSpaceDeltaPosemusi być względny do bieżącej aplikacji XrCompositionLayerProjection ::space.depthSubImageokreśla obraz głębi XrSwapchainSubImage, który ma być używany do syntezy klatek.minDepthimaxDepthto zakres wartości głębokości wdepthSubImage, który musi mieścić się w zakresie [0,0; 1,0] . Jest to podobne do wartości minimalnych i maksymalnychglDepthRangeOpenGL, ale z wymaganiem, że maxDepth ≥ minDepth .nearZto dodatnia odległość w metrach wartościminDepthw łańcuchu wymiany głębi. Aplikacje mogą używać wartościnearZwiększej niżfarZ, aby wskazać, że wartości głębi są odwrócone.nearZmoże być nieskończony.farZto dodatnia odległość w metrach wartościmaxDepthw łańcuchu wymiany głębi.farZmoże być nieskończony. Środowisko wykonawcze musi zwrócić błądXR_ERROR_VALIDATION_FAILURE, jeślinearZ==farZ
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 wektora ruchu w kanałach RGB elementu motionVectorSubImage, zmodyfikowane przez elementy motionVectorScale i motionVectorOffset w następujący 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żyć tych informacji do ekstrapolacji wyrenderowanej klatki na przyszłą klatkę.
Wektor ruchu musi pochodzić ze znormalizowanej przestrzeni 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 w 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 CurrNDC w bieżącej klatce, i nie ma skali ani przesunięcia, wartość wektora ruchu to „(CurrNDC - PrevNDC) xyz”.
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_EXT_frame_synthesismusi być włączone przed użyciem XrFrameSynthesisInfoEXT. -
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
Uwaga
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 wektora ruchu (zalecaną rozdzielczość znajdziesz w XrFrameSynthesisConfigViewEXT) lub w głównym przebiegu widoku z MRT (Multiple Render Targets). To, jakie podejście zostanie zastosowane, zależy od aplikacji. W przypadku motionVectorSubImage zalecane są formaty 16-bitowych kanałów zmiennoprzecinkowych 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 wektora ruchu 2D.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTpodpowiada środowisku wykonawczemu, że aplikacja preferuje dodatkowy czas na renderowanie każdej klatki, co oznacza, że środowisko wykonawcze będzie syntetyzować więcej klatek. Może to być przydatne w przypadku aplikacji, które mają oszczędzać wykorzystanie procesora i GPU (np. w celu wydłużenia czasu pracy na baterii) lub zwiększyć budżet obliczeniowy każdej klatki. Środowisko wykonawcze może żądać klatek w dowolnych odstępach czasu, niezależnie od wartości tej flagi.
Domyślnie środowisko wykonawcze oczekuje danych wektora ruchu 3D, więc używane są motionVectorSubImage rgb, motionVectorScale xyz i motionVectorOffset xyz, jak opisano w XrFrameSynthesisInfoEXT .
Gdy w XrFrameSynthesisInfoEXT layerFlags jest włączona opcja XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT, środowisko wykonawcze interpretuje przesłany obraz wektora ruchu jako dane wektora ruchu 2D, które reprezentują ruch pikseli 2D z poprzedniej klatki do bieżącej klatki. Wartości pikseli są interpretowane w następujący sposób w przypadku danych wektora ruchu 2D: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . Komponenty motionVectorSubImage ba , motionVectorScale zw i motionVectorOffset zw są ignorowane. Użycie danych wektora ruchu 2D zamiast 3D może obniżyć jakość syntetyzowanych klatek.
Pobierz zalecaną rozdzielczość
Struktura XrFrameSynthesisConfigViewEXT jest zdefiniowana w ten sposób:
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur.recommendedMotionVectorImageRectWidth: zalecana szerokość wektora ruchu i obrazu głębi.recommendedMotionVectorImageRectHeight: zalecana wysokość obrazu wektora ruchu i głębi.
Gdy to rozszerzenie jest włączone, aplikacja może przekazać strukturę XrFrameSynthesisConfigViewEXT w łańcuchu XrViewConfigurationView :: next podczas wywoływania funkcji xrEnumerateViewConfigurationViews, aby uzyskać informacje o zalecanej rozdzielczości obrazu wektora ruchu.
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_EXT_frame_synthesismusi być włączone przed użyciem XrFrameSynthesisConfigViewEXT. -
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 domy
Rozszerzenie XrCompositionLayerProjectionView :
Rozszerzanie XrViewConfigurationView :
Nowe stałe typu wyliczeniowego
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 zmian
Wersja 1, 31 stycznia 2022 r. (Jian Zhang)
- Początkowy opis rozszerzenia, przekonwertowany z fb_space_warp
- Współpraca z osobami współtworzącymi nad ulepszaniem interfejsów rozszerzeń.