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

OpenXR 1.0

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

  • type to XrStructureType tej struktury.
  • next to NULL lub wskaźnik do następnej struktury w łańcuchu struktur.
  • layerFlags to maska bitowa XrFrameSynthesisInfoFlagsEXT .
  • motionVectorSubImage identyfikuje obraz wektora ruchu XrSwapchainSubImage, który ma być używany do syntezy klatek.
  • motionVectorScale to XrVector4f, który skaluje interpretację wektora ruchu w motionVectorSubImage .
  • motionVectorOffset to XrVector4f, który przesuwa interpretację wektora ruchu w motionVectorSubImage .
  • appSpaceDeltaPose to 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 :: space z 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, appSpaceDeltaPose musi być tożsamością. XrPosef :: position w appSpaceDeltaPose musi być względny do bieżącej aplikacji XrCompositionLayerProjection :: space .
  • depthSubImage określa obraz głębi XrSwapchainSubImage, który ma być używany do syntezy klatek.
  • minDepth i maxDepth to zakres wartości głębokości w depthSubImage, który musi mieścić się w zakresie [0,0; 1,0] . Jest to podobne do wartości minimalnych i maksymalnych glDepthRange OpenGL, ale z wymaganiem, że maxDepth ≥ minDepth .
  • nearZ to dodatnia odległość w metrach wartości minDepth w łańcuchu wymiany głębi. Aplikacje mogą używać wartości nearZ większej niż farZ, aby wskazać, że wartości głębi są odwrócone. nearZ może być nieskończony.
  • farZ to dodatnia odległość w metrach wartości maxDepth w łańcuchu wymiany głębi. farZ może być nieskończony. Środowisko wykonawcze musi zwrócić błąd XR_ERROR_VALIDATION_FAILURE, jeśli nearZ == 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)

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_EXT wskazuje, że używane są dane wektora ruchu 2D.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT podpowiada ś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.

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

  • type to XrStructureType tej struktury.
  • next to NULL lub 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)

Nowe domy

Nowe stałe typu wyliczeniowego

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • Rozszerzanie XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_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ń.