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
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
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.layerFlagsadalah bitmask XrFrameSynthesisInfoFlagsEXT .motionVectorSubImagemengidentifikasi gambar vektor gerakan XrSwapchainSubImage yang akan digunakan untuk sintesis frame.motionVectorScaleadalah XrVector4f yang menskalakan interpretasi vektor gerakan dimotionVectorSubImage.motionVectorOffsetadalah XrVector4f yang mengimbangi interpretasi vektor gerakan dimotionVectorSubImage.appSpaceDeltaPoseadalah 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 ::spacedari satu pose ruang aplikasi ke pose lain antar-frame, sehingga memengaruhi tampilan lebih dari gerakan yang dilacak antar-frame. TheappSpaceDeltaPoseharus berupa identitas jika tidak ada transformasi XrCompositionLayerProjection ::spacedalam aplikasi. XrPosef ::positiondiappSpaceDeltaPoseharus relatif terhadap XrCompositionLayerProjection ::spaceaplikasi saat ini .depthSubImagemengidentifikasi gambar kedalaman XrSwapchainSubImage yang akan digunakan untuk sintesis frame.minDepthdanmaxDepthadalah rentang nilai kedalaman dalamdepthSubImage, dan harus berada dalam rentang [0.0,1.0] . Hal ini mirip dengan nilai minimum dan maksimumglDepthRangeOpenGL , tetapi dengan persyaratan bahwa maxDepth ≥ minDepth .nearZadalah jarak positif dalam meter dari nilaiminDepthdalam swapchain kedalaman. Aplikasi dapat menggunakannearZyang lebih besar darifarZuntuk menunjukkan bahwa nilai kedalaman dibalik.nearZdapat berupa nilai tak terbatas.farZadalah jarak positif dalam meter dari nilaimaxDepthdalam swapchain kedalaman.farZdapat berupa nilai tak terbatas. Runtime harus menampilkan errorXR_ERROR_VALIDATION_FAILUREjikanearZ==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)
- Ekstensi
XR_EXT_frame_synthesisharus diaktifkan sebelum menggunakan XrFrameSynthesisInfoEXT -
typeharus berupaXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
layerFlagsharus berupa0atau kombinasi nilai XrFrameSynthesisInfoFlagBitsEXT yang valid -
motionVectorSubImageharus berupa struktur XrSwapchainSubImage yang valid -
depthSubImageharus berupa struktur XrSwapchainSubImage yang valid
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_EXTmenunjukkan bahwa data vektor gerakan 2D digunakan.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTmemberikan 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.
Mendapatkan resolusi yang direkomendasikan
Struktur XrFrameSynthesisConfigViewEXT didefinisikan sebagai:
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau 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)
- Ekstensi
XR_EXT_frame_synthesisharus diaktifkan sebelum menggunakan XrFrameSynthesisConfigViewEXT -
typeharus berupaXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur
Struktur Baru
Memperluas XrCompositionLayerProjectionView :
Memperluas XrViewConfigurationView :
Konstanta Enum Baru
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONMemperluas XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_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.