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ı

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ı, 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, NULL veya 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, motionVectorSubImage içindeki hareket vektörünün yorumunu ölçeklendiren bir XrVector4f değeridir .
  • motionVectorOffset, motionVectorSubImage iç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 :: space dönüşümü olmadığında appSpaceDeltaPose kimlik olmalıdır. appSpaceDeltaPose içindeki XrPosef :: position, mevcut uygulama XrCompositionLayerProjection :: space ile göreli olmalıdır .
  • depthSubImage, çerçeve 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ğ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 zincirindeki 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 değişim zincirindeki maxDepth değerinin metre cinsinden pozitif mesafesidir. farZ sonsuz olabilir. Çalışma zamanı, nearZ == farZ ise mutlaka XR_ERROR_VALIDATION_FAILURE hatası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ı)

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.

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

Yeni Yapılar

Yeni Enum Sabitleri

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • XrStructureType uzatma :

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