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ı

OpenXR 1.0

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, NULL veya 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, motionVectorSubImage içindeki hareket vektörünün yorumunu ölçeklendiren bir XrVector4f'dir.
  • motionVectorOffset, motionVectorSubImage iç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 :: space dönüşümü yoksa appSpaceDeltaPose, kimlik olmalıdır. appSpaceDeltaPose içindeki XrPosef :: position, mevcut uygulama XrCompositionLayerProjection :: space ile ilişkili olmalıdır.
  • depthSubImage, kare sentezi için kullanılacak derinlik görüntüsü XrSwapchainSubImage'ı tanımlar.
  • minDepth ve maxDepth, depthSubImage içindeki derinlik değerlerinin aralığıdır ve [0,0,1,0] aralığında olmalıdır. Bu, OpenGL'nin glDepthRange değerinin minimum ve maksimum değerlerine benzer ancak burada maxDepth ≥ minDepth koşulu geçerlidir .
  • nearZ, derinlik swapchain'indeki minDepth değerinin metre cinsinden pozitif mesafesidir. Uygulamalar, derinlik değerlerinin tersine çevrildiğini belirtmek için farZ değerinden büyük bir nearZ kullanabilir. nearZ sonsuz olabilir.
  • farZ, derinlik swapchain'indeki maxDepth değerinin metre cinsinden pozitif mesafesidir. farZ sonsuz olabilir. nearZ == farZ ise çalışma zamanı XR_ERROR_VALIDATION_FAILURE hatası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ı)

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.

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, NULL veya 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ı)

Yeni Yapılar

Yeni Enum Sabitleri

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • XrStructureType'ı genişletme:

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_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