XR_EXT_frame_synthesis

String Nama

XR_EXT_frame_synthesis

Jenis Ekstensi

Ekstensi instance

Nomor Ekstensi Terdaftar

212

Revisi

1

Status Ratifikasi

Tidak 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 reproyeksi frame berkualitas tinggi guna mensintesis frame baru, sehingga memberikan pengalaman yang lancar meskipun aplikasi berjalan di bawah target FPS.

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

Mengirimkan 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 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 dibuat dengan skrip, teleportasi, dll.) melibatkan aplikasi yang mengubah seluruh XrCompositionLayerProjection :: space dari satu pose ruang aplikasi ke pose lain antar-frame, sehingga memengaruhi tampilan lebih dari gerakan yang dilacak antar-frame. The 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 dalam depthSubImage , dan harus berada dalam rentang [0.0,1.0] . Hal ini mirip dengan nilai minimum dan maksimum glDepthRange OpenGL , tetapi dengan persyaratan bahwa maxDepth ≥ minDepth .
  • nearZ adalah jarak positif dalam meter dari nilai minDepth dalam swapchain kedalaman. Aplikasi dapat menggunakan nearZ yang lebih besar dari farZ untuk menunjukkan bahwa nilai kedalaman dibalik. nearZ dapat berupa nilai tak terbatas.
  • farZ adalah jarak positif dalam meter dari nilai maxDepth dalam swapchain kedalaman. farZ dapat berupa nilai tak 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 gerakan piksel sejak XrFrameEndInfo ::displayTime frame sebelumnya hingga XrFrameEndInfo ::displayTime frame saat ini. Runtime dapat menggunakan informasi ini untuk mengekstrapolasi frame yang dirender ke dalam frame mendatang.

Vektor gerakan harus berasal dari ruang koordinat perangkat yang dinormalisasi (NDC), yang dalam konteks ini menggunakan konvensi gaya Vulkan: rentang NDC ditentukan 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, dengan asumsi NDC piksel dalam frame sebelumnya adalah PrevNDC, dan CurrNDC dalam frame saat ini, serta tidak ada skala atau offset, maka nilai vektor gerakan adalah " (CurrNDC - PrevNDC) xyz ".

Penggunaan yang Valid (Implisit)

Catatan

Ada banyak cara berbeda untuk membuat motionVectorSubImage dan depthSubImage . Misalnya, aplikasi dapat merendernya dalam jalur vektor gerakan khusus beresolusi lebih rendah (lihat XrFrameSynthesisConfigViewEXT untuk mengetahui resolusi yang direkomendasikan), atau merendernya dalam jalur tampilan utama dengan MRT (Multiple Render Targets). Aplikasi berhak memutuskan pendekatan tertentu. Format saluran float 16 bit bertanda per piksel direkomendasikan untuk motionVectorSubImage .

Tanda 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 Tanda

  • 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 kepada runtime bahwa aplikasi lebih memilih waktu tambahan untuk merender setiap frame, dengan pertimbangan 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 tanda 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 pada 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 vektor gerakan dan kedalaman yang direkomendasikan.
  • recommendedMotionVectorImageRectHeight : tinggi gambar vektor gerakan dan kedalaman yang direkomendasikan.

Jika ekstensi ini diaktifkan, aplikasi dapat meneruskan struktur XrFrameSynthesisConfigViewEXT dalam rantai XrViewConfigurationView :: next saat memanggil xrEnumerateViewConfigurationViews untuk mendapatkan 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

Issues

Histori Versi

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

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