Aracılığıyla paylaş


Geç aşama yeniden projeksiyonu

Geç Aşama Yeniden Oluşturma (LSR), kullanıcı hareket ettiğinde hologramları dengelemeye yardımcı olan bir donanım özelliğidir.

Statik modellerin, gezinirken konumlarını görsel olarak koruması beklenir. Kararsız görünüyorlarsa, bu davranış LSR sorunlarına işaret edebilir. Animasyonlar veya patlama görünümleri gibi fazladan dinamik dönüşümlerin bu davranışı maskeleyebileceğinden emin olun.

Planar LSR veya Depth LSR gibi iki farklı LSR modu arasından seçim yapabilirsiniz. Her iki LSR modu da farklı sınırlamaları olsa da hologram kararlılığını artırır. Çoğu durumda muhtemelen daha iyi sonuçlar verdiği için Depth LSR'yi deneyerek başlayın.

LSR modunu ayarlama

LSR modlarından hangisinin kullanıldığı, istemci uygulamasının derinlik arabelleği gönderip göndermediği tarafından belirlenir. Derinlik arabelleği gönderilirse Derinlik LSR ve Planar LSR kullanır.

Aşağıdaki paragraflarda, derinlik arabelleği gönderme işleminin sırasıyla Unity ve yerel uygulamalarda nasıl gerçekleştirilir açıklanmaktadır.

Unity

Unity düzenleyicisinde adresine File > Build Settingsgidin. Sol altta öğesini seçin Player Settings ve ardından işaretli olup olmadığını Enable Depth Buffer Sharing denetleyinPlayer > XR Settings > Virtual Reality SDKs > Windows Mixed Reality:

Derinlik Arabellek Paylaşımı Etkin bayrağı

Bu durumda uygulamanız Derinlik LSR'sini kullanır, aksi takdirde Planar LSR kullanır.

OpenXR kullanılırken derinlik arabelleği her zaman gönderilmelidir. Bu ayar içinde XR Plug-in Management > OpenXRbulunabilir. Yeniden oluşturma modu daha sonra OpenXR eklentisindeki bir uzantı aracılığıyla değiştirilebilir:

using Microsoft.MixedReality.OpenXR;

public class OverrideReprojection : MonoBehaviour
{
    void OnEnable()
    {
        RenderPipelineManager.endCameraRendering += RenderPipelineManager_endCameraRendering;
    }
    void OnDisable()
    {
        RenderPipelineManager.endCameraRendering -= RenderPipelineManager_endCameraRendering;
    }

    // When using the Universal Render Pipeline, OnPostRender has to be called manually.
    private void RenderPipelineManager_endCameraRendering(ScriptableRenderContext context, Camera camera)
    {
        OnPostRender();
    }

    // Called directly when using Unity's legacy renderer.
    private void OnPostRender()
    {
        ReprojectionSettings reprojectionSettings = default;
        reprojectionSettings.ReprojectionMode = ReprojectionMode.PlanarManual; // Or your favorite reprojection mode.
        
        // In case of PlanarManual you also need to provide a focus point here.
        reprojectionSettings.ReprojectionPlaneOverridePosition = ...;
        reprojectionSettings.ReprojectionPlaneOverrideNormal = ...;
        reprojectionSettings.ReprojectionPlaneOverrideVelocity = ...;

        foreach (ViewConfiguration viewConfiguration in ViewConfiguration.EnabledViewConfigurations)
        {
            if (viewConfiguration.IsActive && viewConfiguration.SupportedReprojectionModes.Contains(reprojectionSettings.ReprojectionMode))
            {
                viewConfiguration.SetReprojectionSettings(reprojectionSettings);
            }
        }
    }
}

Yerel C++ uygulamaları

Derinlik arabelleğinin gönderilmesi, WMR veya OpenXR sürümünden bağımsız olarak yerel C++ bağlama kodunun tam denetimi altındadır. Karşılanması gereken tek koşul, çağrılan zamanda GraphicsBinding::BlitRemoteFrame derinlik arabelleğinin grafik API'sine bağlanması gerektiğidir.

Derinlik LSR

Derinlik LSR'sinin çalışması için istemci uygulamasının LSR sırasında dikkate alınması gereken tüm ilgili geometriyi içeren geçerli bir derinlik arabelleği sağlaması gerekir.

Derinlik LSR, sağlanan derinlik arabelleğinin içeriğine göre video çerçevesini dengelemeye çalışır. Sonuç olarak, saydam nesneler gibi ona işlenmemiş içerik LSR tarafından ayarlanamaz ve kararsızlık ve yeniden üretme yapıtları gösterebilir.

Saydam nesnelerde yeniden oluşturma kararlılığını azaltmak için derinlik arabelleği yazmaya zorlayabilirsiniz. Renk ve PBR malzemeleri için TransparencyWritesDepth malzeme bayrağına bakın. Ancak, bu bayrağı etkinleştirirken saydam/opak nesne etkileşiminin görsel kalitesinin olumsuz etkilendiğini unutmayın.

Planar LSR

Derinlik LSR'sinde olduğu gibi Planar LSR'de piksel başına derinlik bilgisi yoktur. Bunun yerine, her çerçeveyi sağlamanız gereken bir düzleme göre tüm içeriği yeniden oluşturur.

Planar LSR, sağlanan düzleme yakın olan nesneleri en iyi şekilde yeniden oluşturur. Nesne ne kadar uzakta olursa, o kadar kararsız görünür. Derinlik LSR, nesneleri farklı derinliklerde yeniden oluşturmada daha iyi olsa da, Planar LSR içeriğin düzlemle iyi hizalanması için daha iyi çalışabilir.

Unity'de Planar LSR'yi yapılandırma

Düzlem parametreleri odak noktası olarak adlandırılan bir noktadan türetilir. WMR kullanılırken odak noktasının üzerinden UnityEngine.XR.WSA.HolographicSettings.SetFocusPointForFrameher karenin ayarlanması gerekir. Ayrıntılar için Unity Odak Noktası API'sine bakın. OpenXR için odak noktasının önceki bölümde gösterilen aracılığıyla ReprojectionSettings ayarlanması gerekir. Odak noktası ayarlamazsanız, sizin için bir geri dönüş seçilir. Ancak bu otomatik geri dönüş genellikle yetersiz sonuçlara yol açar.

Odak noktasını kendiniz hesaplayabilirsiniz, ancak bunu Uzaktan İşleme konağı tarafından hesaplanana dayandırmak mantıklı olabilir. Bunu almak için arayın RemoteManagerUnity.CurrentSession.GraphicsBinding.GetRemoteFocusPoint .

Genellikle hem istemci hem de konak, istemcideki kullanıcı arabirimi öğeleri gibi diğer tarafın farkında olmadığı içeriği işler. Bu nedenle, uzak odak noktasını yerel olarak hesaplanmış bir odak noktasıyla birleştirmek mantıklı olabilir.

Birbirini izleyen iki karede hesaplanan odak noktaları çok farklılık gösterebilir. Bunları olduğu gibi kullanmak hologramların etrafta zıplamasına neden olabilir. Bu davranışı önlemek için, önceki ve geçerli odak noktaları arasında ilişkilendirme yapılması önerilir.

Yeniden oluşturma poz modları

Karma işlemeyle ilgili genel sorun kapsamı şu şekilde belirtilebilir: Uzak ve yerel içerik, uzak poz sunucu tarafından tahmin edilirken yerel poz geçerli olan poz olduğu için ayrı pozlar (koordinat alanları) içindedir. Ancak, bir işleme çerçevesinin sonunda hem uzak hem de yerel içeriğin hizalanması ve ekrana getirilmesi gerekir. Aşağıdaki çizimde, yerel ve uzak pozların görüntü görünüm penceresine göre çevrildiği bir örnek gösterilmektedir:

Hedef görünüm penceresine göre uzak ve yerel pozu gösteren diyagram.

Kullanılana GraphicsBinding bağlı olarak, ARR yukarıda açıklanan LSR moduna ortogon olarak çalışan en fazla üç yeniden oluşturma modu sağlar. Bu modlar , Local pose modeve Passthrough pose modeolarak Remote pose modeadlandırılır. LSR modundan farklı olarak, poz modları uzak ve yerel içeriğin nasıl birleştirildiği tanımlar. Modun seçimi, yerel içeriğin görsel kalitesini çalışma zamanı performansına göre dengeler, bu nedenle uygulamalar hangi seçeneğin uygun olduğunu dikkatli bir şekilde dikkate almalıdır. Aşağıdaki önemli noktalara bakın.

Remote pose mode

Remote pose mode ARR'de varsayılan moddur. Bu modda yerel içerik, uzak çerçeveden uzak poz kullanılarak gelen uzak görüntü akışının üzerinde işlenir. Ardından, birleştirilmiş sonuç son yeniden oluşturma için işletim sistemine iletilir. Bu yaklaşımda yalnızca bir yeniden oluşturma kullanılırken, son düzeltme gidiş dönüş aralığını temel alır, bu nedenle tam yeniden oluşturma hatası yerel içeriğe de uygulanır. Sonuç olarak, büyük düzeltme deltası ui öğeleri de dahil olmak üzere yerel geometride önemli bozulmalara neden olabilir.

Yukarıdaki çizim kullanılarak, içinde aşağıdaki dönüşüm uygulanır Remote pose mode:

Uzak poz modunda yeniden oluşturma adımları.

Local pose mode

Bu modda, yeniden oluşturma iki ayrı adıma ayrılır: İlk adımda, uzak içerik yerel poz alanına, yani varsayılan olarak VR/AR cihazlarında yerel içeriğin işlendiği alana yeniden oluşturulur. Bundan sonra, yerel içerik bu önceden dönüştürülmüş görüntünün üzerinde her zamanki yerel poz kullanılarak işlenir. İkinci adımda, birleştirilmiş sonuç son yeniden oluşturma için işletim sistemine iletilir. Bu ikinci yeniden oluşturma işlemi yalnızca küçük bir deltaya (aslında ARR mevcut değilse kullanılacak olan delta) neden olduğundan, yerel içerikteki bozulma yapıtları önemli ölçüde azaltılır.

Buna göre, çizim şöyle görünür:

Yerel poz modunda yeniden oluşturma adımları.

Passthrough pose mode

Bu poz modu temelde ile Remote pose modeaynı şekilde davranır, yani yerel ve uzak içerik uzak alanda birleştirilir. Ancak, içerik birleşimden sonra yeniden üretilmeyecek ancak uzak poz alanında kalacaktır. Bu modun temel avantajı, sonuçta elde edilen görüntünün yeniden oluşturma yapıtlarından etkilenmemesidir.

Kavramsal olarak, bu mod geleneksel bulut akış uygulamalarıyla karşılaştırılabilir. Yüksek gecikme süresi nedeniyle baş üstü senaryolar için uygun değildir, ancak daha yüksek görüntü kalitesinin istendiği Masaüstü ve diğer düz ekran uygulamaları için uygun bir alternatiftir. Bu nedenle yalnızca şu an için üzerinde GraphicsBindingSimD3D11 kullanılabilir.

Performans ve kaliteyle ilgili dikkat edilmesi gerekenler

Poz modu seçiminin görsel kalite ve performans üzerindeki etkileri vardır. HoloLens 2 cihazında Local pose mode fazladan yeniden oluşturma işlemi yapmak için istemci tarafında ek çalışma zamanı maliyeti, GPU süresi karesi başına yaklaşık 1 milisaniyeye kadar tutar. İstemci uygulaması zaten 16 milisaniyelik çerçeve bütçesine yakınsa bu ek maliyetin dikkate alınması gerekir. Öte yandan, yerel içeriği olmayan veya bozulma yapıtlarına eğilimli olmayan yerel içeriğe sahip uygulama türleri vardır. Bu gibi durumlarda Local pose mode , uzak içerik yeniden oluşturmanın kalitesi etkilenmediğinden görsel bir fayda sağlamaz.

Bu nedenle genel öneri, modları kullanım örneği temelinde test etmek ve görsel kalitedeki kazancın ek performans ek yükünü haklı çıkarıp sağlamadığını görmektir. Modu dinamik olarak değiştirmek de mümkündür; örneğin, yerel modu yalnızca önemli URI'ler gösterildiğinde etkinleştirin.

Çalışma zamanında değiştirme Pose mode

Çalışma zamanında modu değiştirmek için aşağıdaki istemci API'sini kullanabilirsiniz:

RenderingSession session = ...;
session.GraphicsBinding.SetPoseMode(PoseMode.Local); // set local pose mode
ApiHandle<RenderingSession> session = ...;
session->GetGraphicsBinding()->SetPoseMode(PoseMode::Local); // set local pose mode

Genel olarak, grafik bağlama nesnesi kullanılabilir olduğunda mod değiştirilebilir. için GraphicsBindingSimD3D11önemli bir ayrım vardır: poz modu yalnızca ara sunucu dokularıyla başlatıldıysa olarak değiştirilebilir PoseMode.Remote. Böyle bir durum söz konusu değilse, poz modu yalnızca grafik bağlaması yeniden başlatılana kadar ve PoseMode.Passthrough arasında PoseMode.Local geçiş yapılabilir. ID3D11Texture2D nesnelerine (proxy yolu) veya width height istenen kullanıcı görünüm penceresine (ara sunucu olmayan yol) yerel işaretçiler alan iki aşırı yüklemesine GraphicsBindingSimD3d11.InitSimulation bakın.

Desktop Unity çalışma zamanıyla ilgili dikkat edilmesi gerekenler

Unity'de ekran dışı işlemenin teknik arka planı GraphicsBindingSimD3D11 ve ekran dışı işlemenin nasıl çalıştığı gerçeği nedeniyle, ARR Unity çalışma zamanı kullanıcının şu şekilde başlatma sırasında istenen poz modunu belirtmesini RemoteManagerUnity gerektirir:

public static void InitRemoteManager(Camera camera)
{
    RemoteUnityClientInit clientInit = new RemoteUnityClientInit(camera, PoseMode.Remote);
    RemoteManagerUnity.InitializeManager(clientInit);
}

Belirtilirse PoseMode.Remote , grafik bağlaması ekran dışı ara sunucu dokularıyla başlatılır ve tüm işlemeler Unity sahnesinin ana kamerasından ara sunucu kamerasına yönlendirilir. Bu kod yolu yalnızca çalışma zamanı poz modu değişiklikleri PoseMode.Remote gerekiyorsa kullanım için önerilir. Poz modu belirtilmezse, ARR Unity çalışma zamanı geçerli platforma bağlı olarak uygun bir varsayılan değer seçer.

Uyarı

Proxy kamera yeniden yönlendirmesi, sahne işlemenin ana kamerayla gerçekleşmesini bekleyen diğer Unity uzantılarıyla uyumsuz olabilir. Proxy kamera sorgulanması veya başka bir yere kaydedilmesi gerekiyorsa özelliği aracılığıyla RemoteManagerUnity.ProxyCamera alınabilir. Eklenti için Cinemachine özellikle şu sorun giderme girdisine bakın: Unity Cinemachine eklentisi Uzak poz modunda çalışmıyor.

Bunun yerine veya PoseMode.Passthrough kullanılırsaPoseMode.Local, grafik bağlaması ekran dışı ara sunucu dokularıyla başlatılmaz ve Unity sahnesinin işlemek için ana kamerasını kullanan hızlı bir yol kullanılır. İlgili kullanım örneği çalışma zamanında uzak poz modunu gerektiriyorsa, PoseMode.Remote başlatma sırasında RemoteManagerUnity belirtilmelidir. Unity'nin ana kamerasıyla doğrudan işleme daha verimlidir ve diğer Unity uzantılarıyla ilgili sorunları önleyebilir. Bu nedenle, ara sunucu olmayan işleme yolunun kullanılması önerilir.

Sonraki adımlar