Aracılığıyla paylaş


Hologram dengeleme — MRTK2

Performans

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

Ortam izleme

Kararlı holografik işleme büyük ölçüde platform & 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, kullanıcıların sanal hologramları gerçek dünyayla ilişkilendirebildiği HoloLens gibi AR cihazları için özellikle açıktır ve önemlidir. Güvenilir kafa 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 Mixed Reality platformu, platformdaki hologramları dengelemek için bazı başvuru malzemeleri sağlar. Geliştiricilerin kullanıcılar için hologram görsel deneyimini geliştirmek için kullanabileceği birkaç temel araç vardır.

Derinlik arabelleği paylaşımı

Unity geliştiricileri, uygulamanın derinlik arabelleğinin platformla paylaşılması seçeneğine sahiptir. Bu, platformun Late-Stage Reprojection olarak bilinen donanım destekli bir işlem aracılığıyla hologramları dengelemek için kullanabileceği, geçerli bir çerçeve için hologramların bulunduğu bilgileri sağlar.

Geç aşama yeniden oluşturma

Bir çerçeveyi işlemenin sonunda, Windows Mixed Reality platformu uygulama tarafından üretilen renk & derinlik işleme hedeflerini alır ve son baş pozu tahmininden bu yana herhangi bir hafif baş hareketini hesaba eklemek 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 bir çerçeveyi işlemek için yaklaşık 16,667ms sürdüğü anlamına gelir. Bu çok kısa bir süre gibi görünse de, kullanıcının kafasının konumu ve yönü değişir ve sonuç olarak işlemede kamera için yeni projeksiyon matrisleri oluşturulur. Geç aşama yeniden oluşturma, bu yeni perspektifi dikkate almak için son görüntüdeki pikselleri dönüştürür.

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

Windows Mixed Reality bir cihazda çalışan cihaz uç noktasına ve işletim sistemi sürümüne bağlı olarak, Late-Stage Reprojection 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ı reprojeksiyon, piksel başına görüntü çıkışını değiştirmek ve böylece hologramları çeşitli uzaklıklarda dengelemek için derinlik arabelleğinin kullanmayı içerir. Örneğin, 1m uzaktaki bir küre, 10m uzaktaki 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 mesafe 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, LSR'nin başka bir 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 dengelemesini alır. Düzlem için nokta ve normal, Unity tarafından sağlananHolographicSettings.SetFocusPointForFrame API'sini kullanarak platforma sağlanabilir.

Derinlik arabellek biçimi

HoloLens geliştirme için hedefleniyorsa, 24 bit ile karşılaştırıldığında 16 bit derinlik arabellek biçiminin kullanılması kesinlikle önerilir. Derinlik değerleri daha az duyarlıklı olsa da bu durum performans açısından önemli ölçüde tasarruf sağlayabilir. Daha düşük duyarlığı telafi etmek ve z ile mücadeleyi önlemek için uzak klips 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ği gerekli etkileri çalışmaz. 24 bit derinlik biçiminin tersinin seçilmesi genellikle uç nokta grafik platformunda varsa 8 bitlik bir kalıp arabelleği oluşturur.

Unity'de derinlik arabelleği paylaşımı

Derinlik tabanlı LSR 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çimini de seçmeniz önerilir.
  2. Ekranda renk işlerken, derinliği de işleme

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

Not

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 İşleme Derinliği Arabelleği yardımcı programını kullanabilirsiniz.

Saydam MRTK Standart gölgelendirici

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 (Z-Write On gibi) dönüştürmek için Şimdi Düzelt düğmesine 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, MRTK TextMeshPro gölgelendiricisini kullanmak için atanan malzemenin gölgelendiricisini değiştirin.

Text 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
            ...
        }
    }
}
Donuk 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 Metninin 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 panel & her iki metin de platform tarafından dengelenir.

WorldAnchors (HoloLens)

Görsel kararlılığı sağlamak için doğru yapılandırmaların karşılandığından emin olmakla birlikte 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, tek bir yerde kalması gereken GameObjects'te WorldAnchors'ı kullanabilir. WorldAnchor, bir GameObject'e eklenen ve bu nesnenin dönüşümü üzerinde mutlak denetime sahip olan bir bileşendir.

HoloLens gibi cihazlar sürekli olarak ortamı tarar ve bu ortam hakkında bilgi ediner. Böylece HoloLens uzaydaki hareketi & konumunu takip ettikçe tahminleri güncelleştirilecek ve Unity koordinat sistemi ayarlanacaktır. Örneğin, HoloLens ortamı izlediğinden, bir GameObject başlangıçta kameradan 1m uzağa yerleştirilirse, GameObject'in bulunduğu fiziksel noktanın aslında 1,1m uzakta olduğunu fark edebilir. Bu, hologramın kaymasıyla sonuçlanır. Bir GameObject'e WorldAnchor uygulamak, tutturucunun nesnenin dönüşümünü denetlemesine olanak tanır, böylece nesne doğru fiziksel konumda kalır (örneğin çalışma zamanında 1m yerine 1,1m uzakta güncelleştirilir). Geliştiriciler WorldAnchor'ları uygulama oturumlarında kalıcı hale getirmek için WorldAnchor'ları kaydetmek ve yüklemek için WorldAnchorStore'yu kullanabilir.

Not

Bir GameObject'e bir WorldAnchor bileşeni eklendikten sonra, bu GameObject'in dönüşümünü (transform.position = x) değiştirmek mümkün değildir. 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 bir seçenek istiyorsanız Microsoft World Locking Tools'a göz atın.

Ayrıca bkz.