Stabilizzazione dell'ologramma - MRTK2
Prestazioni
Affinché la piattaforma di realtà mista sottostante e il dispositivo producano i risultati migliori, è importante ottenere prestazioni ottimali. La frequenza dei fotogrammi di destinazione (ad esempio 60 FPS o 90 FPS) varia tra piattaforme e dispositivi. Tuttavia, le applicazioni di realtà mista che soddisfano la frequenza dei fotogrammi avranno ologrammi stabili, nonché un tracciamento della testa efficiente, il tracciamento della mano e altro ancora.
Rilevamento dell'ambiente
Il rendering olografico stabile si basa principalmente sul tracciamento della posizione della testa da parte della piattaforma e del dispositivo. Unity eseguirà il rendering della scena ogni fotogramma dalla posizione della fotocamera stimata e fornita dalla piattaforma sottostante. Se questo rilevamento non segue correttamente lo spostamento effettivo della testa, gli ologrammi appariranno visivamente imprecisi. Questo è particolarmente evidente e importante per i dispositivi AR come HoloLens in cui gli utenti possono correlare gli ologrammi virtuali al mondo reale. Le prestazioni sono significative per il tracciamento della testa affidabile, ma possono essere presenti anche altre funzionalità importanti. I tipi di elementi dell'ambiente che influisce sull'esperienza utente dipendono dalle specifiche della piattaforma di destinazione.
Windows Mixed Reality
La piattaforma Windows Realtà mista fornisce materiale di riferimento per la stabilizzazione degli ologrammi nella piattaforma. Esistono alcuni strumenti chiave, anche se gli sviluppatori possono usare per migliorare l'esperienza visiva dell'ologramma per gli utenti.
Condivisione del buffer di profondità
Gli sviluppatori Unity hanno la possibilità di condividere il buffer di profondità dell'applicazione con la piattaforma. In questo modo vengono fornite informazioni, in cui esistono ologrammi per un frame corrente, che la piattaforma può utilizzare per stabilizzare gli ologrammi tramite un processo assistito dall'hardware noto come Reprojection in fase tardiva.
Riprogettazione in fase tardiva
Al termine del rendering di un frame, la piattaforma Windows Realtà mista accetta le destinazioni di rendering di colore e profondità prodotte dall'applicazione e trasforma l'output finale dello schermo in modo da tenere conto di qualsiasi leggero movimento della testa dall'ultima previsione della posizione della testa. L'esecuzione del ciclo di gioco di un'applicazione richiede tempo. Ad esempio, a 60 FPS, significa che l'applicazione richiede circa 16,667 ms per eseguire il rendering di un fotogramma. Anche se questo può sembrare una quantità minima di tempo, la posizione e l'orientamento dell'utente della testa cambieranno causando nuove matrici di proiezione per la fotocamera nel rendering. La riprogettazione in fase tardiva trasforma i pixel nell'immagine finale in modo da tenere conto di questa nuova prospettiva.
LSR del piano di stabilizzazione per pixel e di stabilizzazione
A seconda dell'endpoint del dispositivo e della versione del sistema operativo in esecuzione in un dispositivo Windows Realtà mista, l'algoritmo Di riprogettazione in fase tardiva verrà eseguito per pixel o tramite un piano di stabilizzazione.
Profondità per pixel
La riprogettazione basata sulla profondità per pixel comporta l'uso del buffer di profondità per modificare l'output dell'immagine per pixel e quindi stabilizzare gli ologrammi a varie distanze. Ad esempio, una sfera di 1 m di distanza può trovarsi davanti a un pilastro che si trova a 10 metri di distanza. I pixel che rappresentano la sfera avranno una trasformazione diversa rispetto ai pixel lontani che rappresentano il pilastro se l'utente ha inclinato leggermente la testa. La riprogettazione per pixel tiene conto di questa differenza di distanza a ogni pixel per una riprogettazione più accurata.
Piano di stabilizzazione
Se non è possibile creare un buffer di profondità accurato da condividere con la piattaforma, un'altra forma di LSR utilizza un piano di stabilizzazione. Tutti gli ologrammi in una scena riceveranno una certa stabilizzazione, ma gli ologrammi che si trovano nel piano desiderato riceveranno la stabilizzazione hardware massima. Il punto e il normale per il piano possono essere forniti alla piattaforma tramite l'API HolographicSettings.SetFocusPointForFrame fornita da Unity.
Formato buffer di profondità
Se la destinazione è HoloLens per lo sviluppo, è consigliabile usare il formato del buffer di profondità a 16 bit rispetto a 24 bit. Ciò consente di risparmiare enormemente sulle prestazioni, anche se i valori di profondità avranno una precisione inferiore. Per compensare la precisione inferiore ed evitare z-fighting, è consigliabile ridurre il piano di ritaglio lontano dal valore predefinito di 1000m impostato da Unity.
Nota
Se si usa il formato di profondità a 16 bit, gli effetti necessari del buffer stencil non funzioneranno perché Unity non crea un buffer stencil in questa impostazione. Se si seleziona il formato di profondità a 24 bit, in genere verrà creato un buffer stencil a 8 bit, se applicabile nella piattaforma grafica dell'endpoint.
Condivisione del buffer di profondità in Unity
Per usare LSR basato su profondità, è necessario eseguire due passaggi importanti per gli sviluppatori.
- In Modifica>impostazioni>progetto Player>XR Settings>Virtual Reality SDK> Enable Depth Buffer Sharing
- Se la destinazione è HoloLens, è consigliabile selezionare anche il formato di profondità a 16 bit.
- Quando si esegue il rendering del colore sullo schermo, eseguire anche il rendering della profondità
I GameObject opachi in Unity in genere scriveranno in profondità automaticamente. Tuttavia, per impostazione predefinita, gli oggetti transparent e text non scrivono in profondità. Se si usa lo shader standard MRTK o Text Mesh Pro, questo può essere facilmente risolto.
Nota
Per determinare rapidamente quali oggetti in una scena non scrivono visivamente nel buffer di profondità, è possibile usare l'utilità Buffer profondità di rendering nelle impostazioni dell'editor nel profilo di configurazione MRTK.
Shader MRTK Standard trasparente
Per i materiali trasparenti che usano lo shader MRTK Standard, selezionare il materiale da visualizzare nella finestra Inspector .For transparent materials using the MRTK Standard shader, select the material to view it in the Inspector window. Fare quindi clic sul pulsante Correggi ora per convertire il materiale in profondità (ad esempio Z-Write On).
Prima
Dopo
Text Mesh Pro
Per gli oggetti Text Mesh Pro selezionare il GameObject TMP per visualizzarlo nel controllo. Sotto il componente materiale, cambiare lo shader per il materiale assegnato in modo da usare lo shader MRTK TextMeshPro.
Shader personalizzato
Se si scrive uno shader personalizzato, aggiungere il flag ZWrite all'inizio della definizione del blocco Pass per configurare lo shader da scrivere nel buffer di profondità.
Shader "Custom/MyShader"
{
SubShader
{
Pass
{
...
ZWrite On
...
}
}
}
Backing opachi
Se i metodi precedenti non funzionano per uno scenario specifico (ad esempio usando l'interfaccia utente di Unity), è possibile che un altro oggetto scriva nel buffer di profondità. Un esempio comune è l'uso del testo dell'interfaccia utente di Unity in un pannello mobile in una scena. Rendendo opaco il pannello o almeno scrivendo in profondità, il testo e il pannello saranno stabilizzati dalla piattaforma poiché i valori z sono così vicini l'uno all'altro.
WorldAnchors (HoloLens)
Oltre a garantire che le configurazioni corrette siano soddisfatte per garantire la stabilità visiva, è importante assicurarsi che gli ologrammi rimangano stabili nelle posizioni fisiche corrette. Per informare la piattaforma su posizioni importanti in uno spazio fisico, gli sviluppatori possono sfruttare WorldAnchors su GameObject che devono rimanere in un'unica posizione. Un WorldAnchor è un componente aggiunto a un GameObject che assume il controllo assoluto sulla trasformazione dell'oggetto.
I dispositivi come HoloLens eseguono costantemente l'analisi e l'apprendimento dell'ambiente. Pertanto, man mano che HoloLens tiene traccia dello spostamento e della posizione nello spazio, le stime verranno aggiornate e il sistema di coordinate Unity modificato. Ad esempio, se un GameObject viene posizionato 1m dalla fotocamera all'inizio, poiché HoloLens tiene traccia dell'ambiente, può rendersi conto del punto fisico in cui si trova il GameObject è effettivamente 1,1 m di distanza. Ciò comporta la deriva dell'ologramma. L'applicazione di un WorldAnchor a un GameObject consentirà all'ancoraggio di controllare la trasformazione dell'oggetto in modo che l'oggetto rimanga nella posizione fisica corretta,ad esempio l'aggiornamento a 1,1 m invece di 1 m in fase di esecuzione. Per rendere persistenti WorldAnchor tra le sessioni dell'app, gli sviluppatori possono usare WorldAnchorStore per salvare e caricare WorldAnchors.
Nota
Dopo aver aggiunto un componente WorldAnchor a un GameObject, non è possibile modificare la trasformazione di GameObject (ad esempio transform.position = x). Uno sviluppatore deve rimuovere WorldAnchor per modificare la trasformazione.
WorldAnchor m_anchor;
public void AddAnchor()
{
this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}
public void RemoveAnchor()
{
DestroyImmediate(m_anchor);
}
Per un'alternativa all'uso manuale degli ancoraggi, vedere Microsoft World Locking Tools.If you want an alternative to manually working with Anchors, check out the Microsoft World Locking Tools.