Aracılığıyla paylaş


Hologram sabitleme — MRTK2

Performans

Temel alınan karma gerçeklik platformu ve cihazının en iyi sonuçları elde edebilmesi için kare hızlarını gerçekleştirmek önemlidir. Hedef kare hızı (ör. 60 FPS veya 90 FPS) platformlar ve cihazlar arasında farklılık gösterir. Ancak karma gerçeklik uygulamaları kare hızına sahip olacak kararlı hologramların yanı sıra verimli baş izleme, el izleme ve daha fazlasına sahip olacaktır.

Ortam izleme

Kararlı holografik işleme, platform ve cihaz tarafından baş pozu izlemeye dayanır. Unity, kameradaki her karenin tahmin edilen ve temel alınan platform tarafından sağlanan pozunu işler. Bu izleme gerçek baş hareketini doğru şekilde izlemezse hologramlar görsel olarak yanlış görünür. Bu özellikle HoloLens gibi kullanıcıların sanal hologramları gerçek dünyayla ilişkilendirebildiği AR cihazları için açıktır ve önemlidir. Güvenilir baş izleme için performans önemlidir, ancak başka önemli özellikler de olabilir. Kullanıcı deneyimini etkileyen ortam öğesi türleri hedeflenen platform özelliklerine bağlıdır.

Windows Mixed Reality

Windows Karma Gerçeklik platformu, platformdaki hologramları sabitlemek için bazı başvuru malzemeleri sağlar. Ancak geliştiricilerin kullanıcılar için hologram görsel deneyimini geliştirmek için kullanabileceği birkaç temel araç vardır.

Derinlik arabellek paylaşımı

Unity geliştiricileri, uygulamanın derinlik arabelleğinin platformla paylaşılması seçeneğine sahiptir. Bu, hologramların geçerli bir çerçeve için mevcut olduğu, platformun Son Aşama Yeniden Oluşturma olarak bilinen donanım destekli bir işlem aracılığıyla hologramları dengelemek için kullanabileceği bilgileri sağlar.

Geç aşama yeniden oluşturma

Windows Karma Gerçeklik platformu, bir çerçeveyi işlemenin sonunda, uygulama tarafından üretilen renk ve derinlik işleme hedeflerini alır ve son baş pozu tahmininden bu yana herhangi bir hafif baş hareketini hesaba katmak için son ekran çıkışını dönüştürür. Bir uygulamanın oyun döngüsünün yürütülmesi zaman alır. Örneğin, 60 FPS'de bu, uygulamanın çerçeveyi işlemek için yaklaşık 16,667ms sürdüğü anlamına gelir. Bu küçük bir süre gibi görünse de, kullanıcının kafasının konumu ve yönlendirmesi değişir ve bu da işlemede kamera için yeni projeksiyon matrislerine neden olur. Geç aşama yeniden oluşturma, bu yeni perspektifi hesaba katın diye son görüntüdeki pikselleri dönüştürür.

Piksel başına ve sabitleme düzlemi LSR karşılaştırması

Windows Karma Gerçeklik cihazında çalışan cihaz uç noktasına ve işletim sistemi sürümüne bağlı olarak, Geç Aşama Yeniden Üretme algoritması piksel başına veya bir sabitleme düzlemi aracılığıyla gerçekleştirilir.

Piksel başına derinlik tabanlı

Piksel başına derinlik tabanlı yeniden oluşturma işlemi, piksel başına görüntü çıkışını değiştirmek ve böylece hologramları çeşitli mesafelerde dengelemek için derinlik arabelleğinin kullanmayı içerir. Örneğin, 1 metre uzaktaki bir küre, 10 metre uzaklıktaki bir sütunun önünde olabilir. Küreyi temsil eden pikseller, kullanıcı başını hafifçe eğdiyse sütunu temsil eden uzak piksellerden farklı bir dönüşüme sahip olur. Piksel başına yeniden oluşturma, daha doğru bir yeniden oluşturma için her pikseldeki bu uzaklık farkını dikkate alır.

Sabitleme düzlemi

Platformla paylaşmak için doğru bir derinlik arabelleği oluşturmak mümkün değilse, başka bir LSR biçimi bir sabitleme düzlemi kullanır. Bir sahnedeki tüm hologramlar bazı sabitlemeler alır, ancak istenen düzlemde yatan hologramlar maksimum donanım sabitlemesini alır. Düzlem için nokta ve normal, Unity tarafından sağlanan HolographicSettings.SetFocusPointForFrame API'sini kullanarak platforma sağlanabilir.

Derinlik arabellek biçimi

Geliştirme için HoloLens hedefleniyorsa, 24 bit ile karşılaştırıldığında 16 bit derinlik arabellek biçiminin kullanılması kesinlikle önerilir. Derinlik değerlerinin duyarlığı daha az olsa da bu durum performans açısından önemli ölçüde tasarruf sağlayabilir. Düşük duyarlığı telafi etmek ve z ile mücadeleyi önlemek için, uzak klip düzleminin Unity tarafından ayarlanan 1000m varsayılan değerden azaltılması önerilir.

Not

16 bit derinlik biçimi kullanılıyorsa, Unity bu ayarda kalıp arabelleği oluşturmadığından kalıp arabelleğinin gerekli etkileri çalışmaz. 24 bit derinlik biçiminin tersine seçilmesi genellikle uç nokta grafik platformunda varsa 8 bitlik bir kalıp arabelleği oluşturur.

Unity'de derinlik arabellek paylaşımı

Derinlik tabanlı LSR'yi kullanmak için geliştiricilerin atması gereken iki önemli adım vardır.

  1. Proje Ayarlarını>Düzenle'nin>altında Player>XR Ayarları>Sanal Gerçeklik SDK'ları> Derinlik Arabelleği Paylaşımını Etkinleştir
    1. HoloLens hedefleniyorsa, 16 bit derinlik biçiminin de seçilmesi önerilir.
  2. Ekranda renk işlenirken, işleme derinliği de

Unity'deki Opak GameObjects genellikle otomatik olarak derinliğe yazar. Ancak saydam & metin nesneleri genellikle varsayılan olarak derinliğe yazılmaz. MRTK Standart Gölgelendirici veya Text Mesh Pro kullanıyorsanız, bu kolayca düzeltilebilir.

Not

Bir sahnedeki hangi nesnelerin derinlik arabelleğine görsel olarak yazı yazmadığını hızla belirlemek için, MRTK Yapılandırma profilindeki Düzenleyici Ayarları altındaki derinlik arabelleği oluşturma yardımcı programını kullanabilirsiniz.

Saydam MRTK Standart gölgelendiricisi

MRTK Standart gölgelendiricisini kullanan saydam malzemeler için, denetçi penceresinde görüntülemek üzere malzemeyi seçin. Ardından, malzemeyi derinliğe dönüştürmek için Şimdi Düzelt düğmesine (Z-Yazma Açık) tıklayın.

Önce

MRTK Standart Gölgelendiricisi Düzeltilmeden Önce Derinlik Arabelleği

Sonra

Derinlik Arabelleği Sabit MRTK Standart Gölgelendiricisi

Text Mesh Pro

Text Mesh Pro nesneleri için TMP GameObject'i seçerek denetçide görüntüleyin. Malzeme bileşeni altında, atanan malzemenin gölgelendiricisini MRTK TextMeshPro gölgelendiricisini kullanacak şekilde değiştirin.

Metin Mesh Pro Derinlik Arabellek Düzeltmesi

Özel gölgelendirici

Özel bir gölgelendirici yazıyorsanız, gölgelendiriciyi derinlik arabelleğine yazacak şekilde yapılandırmak için Geçiş bloğu tanımının en üstüne ZWrite bayrağını ekleyin.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Opak yedeklemeler

Yukarıdaki yöntemler belirli bir senaryo için işe yaramazsa (unity kullanıcı arabirimini kullanmak gibi), derinlik arabelleğine başka bir nesnenin yazması mümkündür. Bir sahnedeki kayan panelde Unity UI Metni kullanılması yaygın bir örnektir. Paneli donuk hale getirerek veya en azından derine yazarak, z değerleri birbirine çok yakın olduğundan hem metin hem de panel platform tarafından dengelenir.

WorldAnchors (HoloLens)

Görsel kararlılığı sağlamak için doğru yapılandırmaların karşılanmasını sağlamanın yanı sıra hologramların doğru fiziksel konumlarında kararlı kalmasını sağlamak da önemlidir. Geliştiriciler, platformu fiziksel alanda önemli konumlar hakkında bilgilendirmek için GameObjects üzerinde tek bir yerde kalması gereken WorldAnchors'ı kullanabilir. WorldAnchor, bir GameObject'e eklenen ve bu nesnenin dönüşümü üzerinde mutlak denetim sahibi olan bir bileşendir.

HoloLens gibi cihazlar sürekli olarak ortamda tarama ve öğrenme işlemleri gerçekleştirir. Böylece HoloLens uzaydaki hareketi ve konumu takip ettikçe tahminleri güncelleştirilir ve Unity koordinat sistemi ayarlanır. Örneğin, Bir GameObject başlangıçta kameradan 1m yerleştirilirse, HoloLens ortamı izlediğinden, GameObject'in bulunduğu fiziksel noktanın aslında 1,1m uzakta olduğunu fark edebilir. Bu hologram kaymasıyla sonuçlanır. Bir GameObject'e WorldAnchor uygulamak, tutturucunun nesnenin dönüşümünü denetlemesini sağlar, böylece nesne doğru fiziksel konumda kalır (örneğin, çalışma zamanında 1m yerine 1,1 m uzakta güncelleştirilir). Uygulama oturumlarında WorldAnchor'ları kalıcı hale getirmek için geliştiriciler WorldAnchors'u kaydetmek ve yüklemek için WorldAnchorStore'yu kullanabilir.

Not

Bir WorldAnchor bileşeni bir GameObject'e eklendikten sonra, bu GameObject'in dönüşümünü değiştirmek mümkün değildir (yani transform.position = x). Bir geliştiricinin dönüşümü düzenlemek için WorldAnchor'u kaldırması gerekir.

WorldAnchor m_anchor;

public void AddAnchor()
{
    this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}

public void RemoveAnchor()
{
    DestroyImmediate(m_anchor);
}

Anchors ile el ile çalışmaya alternatif olarak Microsoft World Locking Tools'a göz atın.

Ayrıca bkz.