Stabilizzazione dell'ologramma - MRTK2

Prestazioni

Affinché la piattaforma di realtà mista sottostante e il dispositivo producano i risultati migliori, è importante ottenere prestazioni di frequenza dei fotogrammi. La frequenza dei fotogrammi di destinazione (ad esempio 60 FPS o 90 FPS) varia tra piattaforme e dispositivi. Tuttavia, le applicazioni di realtà mista con framerate di riunioni 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 dalla piattaforma & 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 verranno visualizzati visivamente imprecisi. Ciò è 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 di ambiente che influisce sull'esperienza utente dipendono dalle specifiche della piattaforma di destinazione.

Windows Mixed Reality

La piattaforma Windows Mixed Reality fornisce materiale di riferimento per la stabilizzazione degli ologrammi sulla piattaforma. Esistono alcuni strumenti chiave, anche se gli sviluppatori possono usare per migliorare l'esperienza visiva degli ologrammi 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 da hardware noto come Late-Stage Reprojection.

Riprogettazione in fase tardiva

Al termine del rendering di un frame, la piattaforma Windows Mixed Reality accetta il colore & destinazioni di rendering della 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 posa 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 frame. Anche se questo può sembrare una quantità minima di tempo, la posizione e l'orientamento dell'utente cambieranno la posizione e l'orientamento della testa, generando 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 per pixel e piano di stabilizzazione

A seconda dell'endpoint del dispositivo e della versione del sistema operativo in esecuzione in un dispositivo Windows Mixed Reality, l'algoritmo Late-Stage Reprojection 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ò essere davanti a un pilastro che si trova a 10 m 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 prenderà in considerazione 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.SetFocusPointForFramefornita da Unity.

Formato del 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ò può ridurre notevolmente le 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 obbligatori del buffer degli stencil non funzioneranno perché Unity non crea un buffer stencil in questa impostazione. Se si seleziona un formato di profondità a 24 bit , in genere si creerà un buffer stencil a 8 bit, se applicabile nella piattaforma grafica dell'endpoint.

Condivisione del buffer di profondità in Unity

Per usare LSR basato sulla profondità, esistono due passaggi importanti che gli sviluppatori devono eseguire.

  1. In EditProject Settings Player XR Settings Virtual Reality SDK Enable Depth Buffer Sharing (Modificaimpostazioni> progetto)>XR Settings>Virtual Reality SDK> (Abilita >condivisione buffer di profondità)
    1. Se la destinazione è HoloLens, è consigliabile selezionare anche il formato di profondità a 16 bit .
  2. Quando si esegue il rendering del colore sullo schermo, eseguire anche il rendering della profondità

I GameObject opachi in Unity in genere scriveranno automaticamente in profondità. Tuttavia, per impostazione predefinita, gli oggetti di testo trasparenti & non scriveranno in profondità. Se si utilizza 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 in Impostazioni 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 (Controllo ). Fare quindi clic sul pulsante Correggi ora per convertire il materiale in profondità (ad esempio Z-Write On).

Prima

Buffer di profondità prima di correggere lo shader standard MRTK

After

Depth Buffer Fixed MRTK Standard Shader

Text Mesh Pro

Per Oggetti Text Mesh Pro selezionare il GameObject TMP per visualizzarlo nel controllo. Nel componente materiale cambiare lo shader per il materiale assegnato in modo che usi lo shader TextMeshPro shader MRTK.

Correzione del buffer di profondità di Text Mesh Pro Depth

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à, quindi entrambi il testo & il pannello verrà stabilizzato 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. 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 & posizione nello spazio, le stime verranno aggiornate e il sistema di coordinate Unity regolato. 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 di 1,1 m di distanza. Ciò comporterebbe 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 1m in fase di esecuzione. Per rendere persistenti WorldAnchor nelle 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.

Vedere anche