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

OpenXR 1.0

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

  • 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 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 :: space z 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 , appSpaceDeltaPose musi być identycznością. XrPosef :: position w appSpaceDeltaPose musi być względna w stosunku do bieżącej przestrzeni aplikacji XrCompositionLayerProjection :: space .
  • depthSubImage identyfikuje obraz głębi XrSwapchainSubImage, który ma być używany do syntezy klatek.
  • minDepth i maxDepth to zakres wartości głębi w depthSubImage , który musi mieścić się w zakresie [0,0, 1,0] . Jest to podobne do wartości minimalnej i maksymalnej glDepthRange OpenGL, ale z wymaganiem, aby maxDepth ≥ minDepth .
  • nearZ to dodatnia odległość w metrach wartości minDepth w łańcuchu wymiany głębi. Aplikacje mogą używać nearZ większego niż farZ , aby wskazać, że wartości głębi są odwrócone. nearZ może być nieskończona.
  • farZ to dodatnia odległość w metrach wartości maxDepth w łańcuchu wymiany głębi. farZ może być nieskończona. Jeśli nearZ == farZ , środowisko wykonawcze musi zwrócić błąd XR_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)

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

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

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

Nowe struktury

Nowe stałe enum

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