XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Uzantı Türü
Örnek uzantısı
Kayıtlı Dahili Numara
212)
Düzeltme
1
Onay Durumu
Onaylanmadı
Uzantı ve Sürüm Bağımlılıkları
Katkıda bulunanlar
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
Genel Bakış
Bu uzantı, uygulamalar tarafından sağlanan ek verilere dayalı olarak uygulamalarda kare sentezini etkinleştirmek için destek sağlar. Uygulama tarafından oluşturulan hareket vektörü görüntüleri ve derinlik görüntüleri, çalışma zamanı tarafından yüksek kaliteli kare ekstrapolasyonu ve yeniden projeksiyonu yapmak için kullanılabilir. Bu sayede, uygulama FPS hedefinin altında çalışırken bile sorunsuz bir deneyim sunan yeni bir kare sentezlenebilir.
Bu uzantı, XR_KHR_composition_layer_depth uygulamasından bağımsız olarak tasarlanmıştır ve her ikisi de aynı anda farklı amaçlar için etkinleştirilip kullanılabilir. XrFrameSynthesisInfoEXT :: depthSubImage, kare sentezi için ayrılmış derinlik verilerini kullanabilir ve çözünürlüğü XrCompositionLayerDepthInfoKHR :: subImage değerinden düşük olabilir. depthSubImage için önerilen çözünürlük için XrFrameSynthesisConfigViewEXT sayfasına bakın.
Hareket vektörü görüntüleri ve derinlik görüntüleri gönderme
XrFrameSynthesisInfoEXT yapısı şu şekilde tanımlanır:
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;
Üye Açıklamaları
type, bu yapının XrStructureType değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.layerFlags, XrFrameSynthesisInfoFlagsEXT'nin bit maskesidir.motionVectorSubImage, kare sentezi için kullanılacak hareket vektörü görüntüsünü XrSwapchainSubImage tanımlar.motionVectorScale,motionVectorSubImageiçindeki hareket vektörünün yorumunu ölçeklendiren bir XrVector4f'dir.motionVectorOffset,motionVectorSubImageiçindeki hareket vektörünün yorumunu dengeleyen bir XrVector4f'dir.appSpaceDeltaPose, önceki kareden bu yana görünümü etkileyen, uygulama tarafından uygulanan artımlı dönüşümdür (varsa). Yapay hareket deneyimleri (komut dosyasıyla oluşturulmuş hareket, hızlı geçiş vb.), uygulamanın tüm XrCompositionLayerProjection ::spaceöğesini kareler arasında bir uygulama alanı pozundan başka bir poza dönüştürmesini içerir. Bu durum, görünümü kareler arasındaki izlenen hareketten daha fazla etkiler. Uygulamada XrCompositionLayerProjection ::spacedönüşümü yoksaappSpaceDeltaPose, kimlik olmalıdır.appSpaceDeltaPoseiçindeki XrPosef ::position, mevcut uygulama XrCompositionLayerProjection ::spaceile ilişkili olmalıdır.depthSubImage, kare sentezi için kullanılacak derinlik görüntüsü XrSwapchainSubImage'ı tanımlar.minDepthvemaxDepth,depthSubImageiçindeki derinlik değerlerinin aralığıdır ve [0,0,1,0] aralığında olmalıdır. Bu, OpenGL'ninglDepthRangedeğerinin minimum ve maksimum değerlerine benzer ancak burada maxDepth ≥ minDepth koşulu geçerlidir .nearZ, derinlik swapchain'indekiminDepthdeğerinin metre cinsinden pozitif mesafesidir. Uygulamalar, derinlik değerlerinin tersine çevrildiğini belirtmek içinfarZdeğerinden büyük birnearZkullanabilir.nearZsonsuz olabilir.farZ, derinlik swapchain'indekimaxDepthdeğerinin metre cinsinden pozitif mesafesidir.farZsonsuz olabilir.nearZ==farZise çalışma zamanıXR_ERROR_VALIDATION_FAILUREhatasını döndürmelidir (must).
Yansıtma katmanlarıyla birlikte hareket vektörü görüntüleri ve derinlik görüntüleri gönderirken, belirli katmandaki her XrCompositionLayerProjectionView yapısı için XrCompositionLayerProjectionView :: next zincirine bir XrFrameSynthesisInfoEXT yapısı ekleyin.
Çalışma zamanı, motionVectorSubImage'nin RGB kanallarındaki hareket vektörü verilerini motionVectorScale ve motionVectorOffset tarafından değiştirilmiş şekilde şu şekilde yorumlamalıdır: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . motionVectorSubImage a , motionVectorScale w ve motionVectorOffset w bileşenleri yoksayılır.
Hareket vektörü, önceki karenin XrFrameEndInfo ::displayTime değerinden geçerli karenin XrFrameEndInfo ::displayTime değerine kadar bir pikselin hareketini temsil eder. Çalışma zamanı, oluşturulan kareyi gelecekteki bir kareye tahmin etmek için bu bilgileri kullanabilir.
Hareket vektörü, normalleştirilmiş cihaz koordinatı (NDC) alanından türetilmelidir. Bu bağlamda, Vulkan tarzı kurallar kullanılır: NDC aralığı, OpenGL'nin NDC aralığından farklı olarak [-1, -1, 0] ile [1, 1, 1] arasında tanımlanır. Ancak hareket vektörünün kendisi bu aralıkla sınırlı değildir. Değerleri pikselin hareketine bağlıdır ve NDC alanının sınırlarının ötesine geçebilir. Örneğin, bir pikselin önceki karedeki NDC'si PrevNDC ve geçerli karedeki NDC'si CurrNDC ise ve ölçek veya ofset yoksa hareket vektörü değeri " (CurrNDC - PrevNDC) xyz" olur.
Geçerli Kullanım (Dolaylı)
- XrFrameSynthesisInfoEXT kullanılmadan önce
XR_EXT_frame_synthesisuzantısı etkinleştirilmelidir -
typeXR_TYPE_FRAME_SYNTHESIS_INFO_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
layerFlagsmust be0or a valid combination of XrFrameSynthesisInfoFlagBitsEXT values -
motionVectorSubImage, geçerli bir XrSwapchainSubImage yapısı olmalıdır. -
depthSubImage, geçerli bir XrSwapchainSubImage yapısı olmalıdır.
Not
motionVectorSubImage ve depthSubImage oluşturmanın birçok farklı yolu vardır. Örneğin, uygulama bunları daha düşük çözünürlüklü özel bir hareket vektörü geçişinde (önerilen çözünürlük için XrFrameSynthesisConfigViewEXT sayfasına bakın) veya MRT (Birden Fazla Oluşturma Hedefi) ile ana görünüm geçişinde oluşturabilir. Belirli bir yaklaşım seçmek uygulamaya bağlıdır. motionVectorSubImage için işaretli 16 bit kayan nokta piksel kanalı biçimleri önerilir.
Kare sentezi işaretleri
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;
İşaret Açıklamaları
XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT, 2D hareket vektörü verilerinin kullanıldığını gösterir.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT, çalışma zamanına uygulamanın her kareyi oluşturmak için ek süre tercih ettiğine dair bir ipucu verir. Bu durumda, çalışma zamanı tarafından daha fazla kare sentezlenir. Bu, CPU ve GPU kullanımını azaltmayı (ör. pil ömrünü uzatmak için) veya her karenin işlem bütçesini artırmayı tercih eden uygulamalar için yararlı olabilir. Çalışma zamanı, bu işaretin değerinden bağımsız olarak herhangi bir aralıkta kare isteğinde bulunabilir.
Varsayılan olarak, çalışma zamanı 3D hareket vektörü verilerini bekler. Bu nedenle, XrFrameSynthesisInfoEXT bölümünde açıklandığı gibi motionVectorSubImage rgb, motionVectorScale xyz ve motionVectorOffset xyz kullanılır.
XrFrameSynthesisInfoEXT layerFlags üzerinde XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT etkinleştirildiğinde çalışma zamanı, gönderilen hareket vektörü görüntüsünü önceki kareden geçerli kareye 2D piksel hareketini temsil eden 2D hareket vektörü verileri olarak yorumlar. Piksel değerleri, 2D hareket vektörü verileri için şu şekilde yorumlanır: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . motionVectorSubImage ba , motionVectorScale zw ve motionVectorOffset zw bileşenleri yoksayılır. 3D yerine 2D hareket vektörü verilerinin kullanılması, sentezlenen karelerin kalitesini düşürebilir.
Önerilen çözümü alma
XrFrameSynthesisConfigViewEXT yapısı şu şekilde tanımlanır:
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
Üye Açıklamaları
type, bu yapının XrStructureType değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.recommendedMotionVectorImageRectWidth: Önerilen hareket vektörü ve derinlik görüntüsü genişliği.recommendedMotionVectorImageRectHeight: Önerilen hareket vektörü ve derinlik görüntüsü yüksekliği.
Bu uzantı etkinleştirildiğinde, bir uygulama, önerilen hareket vektörü görüntü çözünürlüğü hakkında bilgi edinmek için xrEnumerateViewConfigurationViews'u çağırırken XrViewConfigurationView :: next zincirinde bir XrFrameSynthesisConfigViewEXT yapısı geçirebilir.
Geçerli Kullanım (Dolaylı)
- XrFrameSynthesisConfigViewEXT kullanılmadan önce
XR_EXT_frame_synthesisuzantısı etkinleştirilmelidir. -
typeXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır.
Yeni Yapılar
XrCompositionLayerProjectionView'u genişletme:
XrViewConfigurationView'u genişletme:
Yeni Enum Sabitleri
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONXrStructureType'ı genişletme:
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
Sorunlar
Sürüm Geçmişi
Düzeltme 1, 31.01.2022 (Jian Zhang)
- fb_space_warp'tan dönüştürülen ilk uzantı açıklaması
- Uzantı arayüzlerini iyileştirmek için katkıda bulunanlarla ortak çalışma