XR_EXT_frame_synthesis

String Nama

XR_EXT_frame_synthesis

Jenis Ekstensi

Ekstensi instance

Nomor Ekstensi Terdaftar

212

Revisi

1

Status Ratifikasi

Belum diratifikasi

Dependensi Ekstensi dan Versi

OpenXR 1.0

Kontributor

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

Ringkasan

Ekstensi ini memberikan dukungan untuk mengaktifkan sintesis frame pada aplikasi berdasarkan data tambahan yang disediakan aplikasi. Gambar vektor gerakan dan gambar kedalaman yang dihasilkan aplikasi dapat digunakan oleh runtime untuk melakukan ekstrapolasi dan proyeksi ulang frame berkualitas tinggi guna menyintesis frame baru, sehingga memberikan pengalaman yang lancar meskipun aplikasi berjalan di bawah target FPS.

Ekstensi ini dirancang agar tidak bergantung pada XR_KHR_composition_layer_depth , dan keduanya dapat diaktifkan dan digunakan secara bersamaan, untuk tujuan yang berbeda. XrFrameSynthesisInfoEXT :: depthSubImage dapat menggunakan data kedalaman yang dikhususkan untuk sintesis frame, dan resolusinya mungkin lebih rendah daripada XrCompositionLayerDepthInfoKHR :: subImage . Lihat XrFrameSynthesisConfigViewEXT untuk mengetahui resolusi depthSubImage yang disarankan.

Mengirim gambar vektor gerakan dan gambar kedalaman

Struktur XrFrameSynthesisInfoEXT didefinisikan sebagai:

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;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur.
  • layerFlags adalah bitmask dari XrFrameSynthesisInfoFlagsEXT .
  • motionVectorSubImage mengidentifikasi gambar vektor gerakan XrSwapchainSubImage yang akan digunakan untuk sintesis frame.
  • motionVectorScale adalah XrVector4f yang menskalakan interpretasi vektor gerakan di motionVectorSubImage .
  • motionVectorOffset adalah XrVector4f yang mengimbangi interpretasi vektor gerakan di motionVectorSubImage .
  • appSpaceDeltaPose adalah transformasi inkremental yang diterapkan aplikasi, jika ada, yang memengaruhi tampilan sejak frame sebelumnya. Pengalaman lokomosi buatan (gerakan yang di-skrip, teleportasi, dll.) melibatkan aplikasi yang mengubah seluruh XrCompositionLayerProjection :: space dari satu pose ruang aplikasi ke pose lain di antara frame, yang memengaruhi tampilan lebih dari gerakan yang dilacak di antara frame. appSpaceDeltaPose harus berupa identitas jika tidak ada transformasi XrCompositionLayerProjection :: space dalam aplikasi. XrPosef :: position di appSpaceDeltaPose harus relatif terhadap XrCompositionLayerProjection :: space aplikasi saat ini.
  • depthSubImage mengidentifikasi gambar kedalaman XrSwapchainSubImage yang akan digunakan untuk sintesis frame.
  • minDepth dan maxDepth adalah rentang nilai kedalaman di depthSubImage , dan harus berada dalam rentang [0.0,1.0] . Hal ini mirip dengan nilai minimum dan maksimum glDepthRange OpenGL, tetapi dengan persyaratan di sini bahwa maxDepth ≥ minDepth .
  • nearZ adalah jarak positif dalam meter dari nilai minDepth di swapchain kedalaman. Aplikasi dapat menggunakan nearZ yang lebih besar dari farZ untuk menunjukkan bahwa nilai kedalaman dibalik. nearZ mungkin tidak terbatas.
  • farZ adalah jarak positif dalam meter dari nilai maxDepth di swapchain kedalaman. farZ mungkin tidak terbatas. Runtime harus menampilkan error XR_ERROR_VALIDATION_FAILURE jika nearZ == farZ

Saat mengirimkan gambar vektor gerakan dan gambar kedalaman bersama dengan lapisan proyeksi, tambahkan struktur XrFrameSynthesisInfoEXT ke rantai XrCompositionLayerProjectionView :: next, untuk setiap struktur XrCompositionLayerProjectionView di lapisan yang diberikan.

Runtime harus menafsirkan data vektor gerakan di saluran RGB motionVectorSubImage, yang diubah oleh motionVectorScale dan motionVectorOffset sebagai berikut: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . Komponen motionVectorSubImage a , motionVectorScale w , dan motionVectorOffset w diabaikan.

Vektor gerakan mewakili pergerakan piksel sejak XrFrameEndInfo ::displayTime frame sebelumnya hingga XrFrameEndInfo ::displayTime frame saat ini. Runtime dapat menggunakan informasi ini untuk mengekstrapolasi frame yang dirender ke frame mendatang.

Vektor gerakan harus berasal dari ruang koordinat perangkat yang dinormalisasi (NDC), yang dalam konteks ini menggunakan konvensi gaya Vulkan: rentang NDC didefinisikan sebagai [-1, -1, 0] hingga [1, 1, 1], berbeda dengan rentang NDC OpenGL. Namun, vektor gerakan itu sendiri tidak dibatasi pada rentang ini; nilainya bergantung pada gerakan piksel dan dapat melampaui batas ruang NDC. Misalnya, jika NDC piksel dalam frame sebelumnya adalah PrevNDC, dan CurrNDC dalam frame saat ini, dan tidak ada skala atau offset, maka nilai vektor gerakan adalah " (CurrNDC - PrevNDC) xyz ".

Penggunaan yang Valid (Implisit)

Catatan

Ada banyak cara untuk membuat motionVectorSubImage dan depthSubImage . Misalnya, aplikasi dapat merendernya dalam penerusan vektor gerakan khusus beresolusi lebih rendah (lihat XrFrameSynthesisConfigViewEXT untuk mengetahui resolusi yang direkomendasikan), atau merendernya dalam penerusan tampilan utama dengan MRT (Beberapa Target Render). Aplikasi dapat menentukan pendekatan spesifiknya sendiri. Format saluran float 16 bit bertanda per piksel direkomendasikan untuk motionVectorSubImage .

Flag sintesis frame

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;

Deskripsi Flag

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT menunjukkan bahwa data vektor gerakan 2D digunakan.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT memberikan petunjuk ke runtime bahwa aplikasi lebih memilih waktu tambahan untuk merender setiap frame, dengan konsekuensi bahwa lebih banyak frame akan disintesis oleh runtime. Hal ini mungkin berguna untuk aplikasi yang lebih memilih untuk menghemat penggunaan CPU dan GPU (misalnya untuk meningkatkan masa pakai baterai) atau untuk meningkatkan anggaran komputasi setiap frame. Runtime dapat meminta frame pada interval apa pun, terlepas dari nilai flag ini.

Secara default, data vektor gerakan 3D diharapkan oleh runtime, sehingga motionVectorSubImage rgb , motionVectorScale xyz, dan motionVectorOffset xyz digunakan, seperti yang dijelaskan dalam XrFrameSynthesisInfoEXT .

Jika XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT diaktifkan di XrFrameSynthesisInfoEXT layerFlags , runtime akan menafsirkan gambar vektor gerakan yang dikirimkan sebagai data vektor gerakan 2D, yang mewakili gerakan piksel 2D dari frame sebelumnya ke frame saat ini. Nilai piksel ditafsirkan sebagai berikut untuk data vektor gerakan 2D: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . Komponen motionVectorSubImage ba , motionVectorScale zw, dan motionVectorOffset zw diabaikan. Menggunakan data vektor gerakan 2D, bukan 3D, dapat menurunkan kualitas frame yang disintesis.

Struktur XrFrameSynthesisConfigViewEXT didefinisikan sebagai:

typedef struct XrFrameSynthesisConfigViewEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           recommendedMotionVectorImageRectWidth;
    uint32_t           recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur.
  • recommendedMotionVectorImageRectWidth : lebar gambar kedalaman dan vektor gerakan yang direkomendasikan.
  • recommendedMotionVectorImageRectHeight : tinggi gambar kedalaman dan vektor gerakan yang direkomendasikan.

Jika ekstensi ini diaktifkan, aplikasi dapat meneruskan struktur XrFrameSynthesisConfigViewEXT dalam rantai XrViewConfigurationView :: next saat memanggil xrEnumerateViewConfigurationViews untuk memperoleh informasi tentang resolusi gambar vektor gerakan yang direkomendasikan.

Penggunaan yang Valid (Implisit)

Struktur Baru

Konstanta Enum Baru

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • Memperluas XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

Masalah

Histori Versi

  • Revisi 1, 31-01-2022 (Jian Zhang)

    • Deskripsi ekstensi awal, dikonversi dari fb_space_warp
    • Berkolaborasi dengan kontributor untuk menyempurnakan antarmuka ekstensi.