XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Uzantı Türü
Örnek uzantısı
Kayıtlı Uzantı Numarası
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ı, ek uygulama verilerine dayalı uygulamalarda kare sentezinin etkinleştirilmesini destekler. Uygulama tarafından oluşturulan hareket vektörü görüntüleri ve derinlik görüntüleri, yeni bir kare sentezlemek için yüksek kaliteli kare ekstrapolasyonu ve yeniden projeksiyon yapmak üzere çalışma zamanı tarafından kullanılabilir. Bu sayede, uygulama FPS hedefinin altında çalışırken bile sorunsuz bir deneyim sağlanır.
Bu uzantı, XR_KHR_composition_layer_depth bağımsız olacak şekilde tasarlanmıştır ve her ikisi de farklı amaçlarla aynı anda etkinleştirilip kullanılabilir. XrFrameSynthesisInfoEXT :: depthSubImage, kare sentezi için ayrılmış derinlik verilerini kullanabilir ve çözünürlüğü XrCompositionLayerDepthInfoKHR :: subImage çözünürlüğünden düşük olabilir . depthSubImage için önerilen çözünürlük hakkında bilgi edinmek üzere XrFrameSynthesisConfigViewEXT'yi inceleyin .
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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.layerFlags, XrFrameSynthesisInfoFlagsEXT bit maskesidir .motionVectorSubImage, kare sentezi için kullanılacak hareket vektörel görüntüsü XrSwapchainSubImage'ı tanımlar.motionVectorScale,motionVectorSubImageiçindeki hareket vektörünün yorumunu ölçeklendiren bir XrVector4f değeridir .motionVectorOffset,motionVectorSubImageiçindeki hareket vektörünün yorumlanmasını dengeleyen bir XrVector4f değeridir .appSpaceDeltaPose, önceki karede görünümü etkileyen artımlı uygulama dönüşümüdür (varsa). Yapay hareket deneyimlerinde (senaryolu hareket, ışınlanma vb.) uygulama, kareler arasında XrCompositionLayerProjection ::spaceöğesinin tamamını bir uygulama alanı pozundan başka bir poza dönüştürür. Bu durum, kareler arasındaki izlenen hareketten daha fazla etkileyerek görünümü değiştirir. Uygulamada XrCompositionLayerProjection ::spacedönüşümü olmadığındaappSpaceDeltaPosekimlik olmalıdır.appSpaceDeltaPoseiçindeki XrPosef ::position, mevcut uygulama XrCompositionLayerProjection ::spaceile göreli olmalıdır .depthSubImage, çerçeve 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ğerlerinin minimum ve maksimum değerlerine benzer ancak burada maksimum derinliğin minimum derinliğe eşit veya daha büyük olması gerekir .nearZ, derinlik değişim zincirindekiminDepthdeğerinin metre cinsinden pozitif mesafesidir. Uygulamalar, derinlik değerlerinin tersine çevrildiğini belirtmek içinfarZdeğerinden büyük birnearZkullanabilir.nearZsonsuz olabilir.farZ, derinlik değişim zincirindekimaxDepthdeğerinin metre cinsinden pozitif mesafesidir.farZsonsuz olabilir. Çalışma zamanı,nearZ==farZise mutlakaXR_ERROR_VALIDATION_FAILUREhatasını döndürmelidir.
Hareket vektörü görüntülerini ve derinlik görüntülerini projeksiyon katmanlarıyla birlikte gönderirken, verilen katmandaki her XrCompositionLayerProjectionView yapısı için XrCompositionLayerProjectionView :: next zincirine bir XrFrameSynthesisInfoEXT yapısı ekleyin.
Çalışma zamanı, motionVectorSubImage öğesinin motionVectorScale ve motionVectorOffset tarafından değiştirilen RGB kanallarındaki hareket vektörü verilerini ş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 mevcut karenin XrFrameEndInfo ::displayTime değerine kadar olan sürede bir pikselin hareketini gösterir. Çalışma zamanı, oluşturulan kareyi gelecekteki bir kareye ekstrapole etmek için bu bilgileri kullanabilir.
Hareket vektörü, normalleştirilmiş cihaz koordinatı (NDC) alanından elde edilmelidir. 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 dışına çıkabilir. Örneğin, önceki karede bir pikselin NDC'sinin PrevNDC, mevcut karede ise CurrNDC olduğu ve ölçek veya ofset olmadığı göz önüne alındığında 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. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
layerFlags0veya XrFrameSynthesisInfoFlagBitsEXT değerlerinin geçerli bir kombinasyonu olmalıdır. -
motionVectorSubImagegeçerli bir XrSwapchainSubImage yapısı olmalıdır. -
depthSubImagegeç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 hareket vektörü geçişinde (önerilen çözünürlük için XrFrameSynthesisConfigViewEXT'ye bakın) veya MRT (Multiple Render Targets) ile ana görünüm geçişinde oluşturabilir. Hangi yaklaşımın kullanılacağına uygulama karar verir. motionVectorSubImage için piksel kanalı başına imzalı 16 bit kayan nokta 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ği ipucunu verir. Bunun karşılığında çalışma zamanı tarafından daha fazla kare sentezlenir. Bu, CPU ve GPU kullanımını korumayı (ö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 isteyebilir.
Varsayılan olarak, çalışma zamanı 3D hareket vektörü verilerini bekler. Bu nedenle, XrFrameSynthesisInfoEXT'de açıklandığı gibi motionVectorSubImage rgb, motionVectorScale xyz ve motionVectorOffset xyz kullanılır.
XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT , XrFrameSynthesisInfoEXT layerFlags üzerinde etkinleştirildiğinde çalışma zamanı, gönderilen hareket vektörü resmini önceki karedeki mevcut 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 hareket vektörü verileri 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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.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, önerilen hareket vektörü görüntü çözünürlüğü hakkında bilgi edinmek için xrEnumerateViewConfigurationViews çağrılırken bir uygulama, XrViewConfigurationView :: next zincirinde bir XrFrameSynthesisConfigViewEXT yapısı geçirebilir.
Geçerli Kullanım (Dolaylı)
-
XR_EXT_frame_synthesisuzantısı, XrFrameSynthesisConfigViewEXT kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır.
Yeni Yapılar
XrCompositionLayerProjectionView'ı genişletme :
XrViewConfigurationView öğesini genişletme :
Yeni Enum Sabitleri
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONXrStructureType uzatma :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
Sorunlar
Sürüm Geçmişi
1. düzeltme, 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 işbirliği yapma