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
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
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.layerFlagsadalah bitmask dari 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 di-skrip, teleportasi, dll.) melibatkan aplikasi yang mengubah seluruh XrCompositionLayerProjection ::spacedari satu pose ruang aplikasi ke pose lain di antara frame, yang memengaruhi tampilan lebih dari gerakan yang dilacak di antara frame.appSpaceDeltaPoseharus 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 didepthSubImage, dan harus berada dalam rentang [0.0,1.0] . Hal ini mirip dengan nilai minimum dan maksimumglDepthRangeOpenGL, tetapi dengan persyaratan di sini bahwa maxDepth ≥ minDepth .nearZadalah jarak positif dalam meter dari nilaiminDepthdi swapchain kedalaman. Aplikasi dapat menggunakannearZyang lebih besar darifarZuntuk menunjukkan bahwa nilai kedalaman dibalik.nearZmungkin tidak terbatas.farZadalah jarak positif dalam meter dari nilaimaxDepthdi swapchain kedalaman.farZmungkin tidak 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 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)
- 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 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_EXTmenunjukkan bahwa data vektor gerakan 2D digunakan.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTmemberikan 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.
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 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)
- 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
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.