Hologrammstabilisierung — MRTK2

Leistung

Damit die zugrunde liegende Mixed Reality-Plattform und das Zugrunde liegende Gerät die besten Ergebnisse erzielen, ist es wichtig, bildfrequenzen zu erzielen. Die Zielframerate (z. B. 60 FPS oder 90 FPS) variiert je nach Plattform und Gerät. Mixed Reality-Anwendungen, die die Framerate treffen, verfügen jedoch über stabile Hologramme sowie über effiziente Kopfverfolgung, Handnachverfolgung und vieles mehr.

Umgebungsnachverfolgung

Stabiles holografisches Rendering basiert stark auf der Kopfhaltungsnachverfolgung durch die Plattform & Geräts. Unity rendert die Szene mit jedem Frame aus der Kameraposition, die von der zugrunde liegenden Plattform geschätzt und bereitgestellt wird. Wenn diese Nachverfolgung der tatsächlichen Kopfbewegung nicht korrekt folgt, erscheinen Hologramme visuell ungenau. Dies ist besonders offensichtlich und wichtig für AR-Geräte wie HoloLens, bei denen Benutzer virtuelle Hologramme mit der realen Welt verknüpfen können. Die Leistung ist wichtig für eine zuverlässige Headtracking, aber es kann auch andere wichtige Features geben. Die Typen von Umgebungselementen, die sich auf die Benutzererfahrung auswirken, hängen von den spezifischen Plattformdaten ab.

Windows Mixed Reality

Die Windows Mixed Reality-Plattform bietet Referenzmaterial für die Stabilisierung von Hologrammen auf der Plattform. Es gibt jedoch einige wichtige Tools, die Entwickler verwenden können, um die visuelle Darstellung von Hologrammen für Benutzer zu verbessern.

Freigabe des Tiefenpuffers

Unity-Entwickler haben die Möglichkeit, den Tiefenpuffer der Anwendung für die Plattform freizugeben. Dies liefert Informationen, bei denen Hologramme für einen aktuellen Frame vorhanden sind, die die Plattform verwenden kann, um Hologramme über einen hardwaregestützten Prozess zu stabilisieren, der als Late-Stage Reprojection bezeichnet wird.

Späte Neuprojektion

Am Ende des Renderns eines Frames verwendet die Windows Mixed Reality Plattform die Farbe & von der Anwendung erzeugten Tiefenrenderingziele und transformiert die endgültige Bildschirmausgabe, um alle leichten Kopfbewegungen seit der letzten Kopfhaltungsvorhersage zu berücksichtigen. Die Ausführung der Spielschleife einer Anwendung dauert. Bei 60 FPS bedeutet dies, dass die Anwendung etwa 16,667 ms zum Rendern eines Frames verwendet. Auch wenn dies wie ein minimaler Zeitraum erscheinen mag, ändert sich die Position und Ausrichtung des Kopfes des Benutzers, was zu neuen Projektionsmatrizen für die Kamera beim Rendering führt. Die späte Neuprojektion transformiert die Pixel im endgültigen Bild, um diese neue Perspektive zu berücksichtigen.

LSR pro Pixel im Vergleich zur Stabilisierungsebene

Abhängig vom Geräteendpunkt und der Betriebssystemversion, die auf einem Windows Mixed Reality Gerät ausgeführt wird, wird der Late-Stage Reprojection-Algorithmus entweder pro Pixel oder über eine Stabilisierungsebene ausgeführt.

Pro Pixel tiefenbasiert

Die tiefenbasierte Neuprojektion pro Pixel umfasst die Verwendung des Tiefenpuffers, um die Bildausgabe pro Pixel zu ändern und so Hologramme in verschiedenen Entfernungen zu stabilisieren. Beispielsweise kann eine Kugel, die 1 m entfernt ist, vor einer Säule stehen, die 10 m entfernt ist. Die Pixel, die die Kugel darstellen, haben eine andere Transformation als die weit entfernten Pixel, die die Säule darstellen, wenn der Benutzer den Kopf leicht gekippt hat. Bei der Neuprojektion pro Pixel wird dieser Abstandsunterschied bei jedem Pixel berücksichtigt, um eine genauere Neuprojektion zu ermöglichen.

Stabilisierungsebene

Wenn es nicht möglich ist, einen genauen Tiefenpuffer für die Freigabe mit der Plattform zu erstellen, verwendet eine andere Form von LSR eine Stabilisierungsebene. Alle Hologramme in einer Szene erhalten eine gewisse Stabilisierung, aber Hologramme, die in der gewünschten Ebene liegen, erhalten die maximale Hardwarestabilisierung. Der Punkt und die Normalität für die Ebene können der Plattform über die von Unity bereitgestellteHolographicSettings.SetFocusPointForFrame-API bereitgestellt werden.

Tiefenpufferformat

Wenn HoloLens für die Entwicklung als Ziel verwendet wird, wird dringend empfohlen, das 16-Bit-Tiefenpufferformat im Vergleich zu 24-Bit zu verwenden. Dies kann die Leistung enorm einsparen, obwohl Tiefenwerte eine geringere Genauigkeit aufweisen. Um die geringere Genauigkeit zu kompensieren und Z-Fighting zu vermeiden, wird empfohlen, die entfernte Clipebene von dem von Unity festgelegten Standardwert von 1000m zu reduzieren.

Hinweis

Bei Verwendung des 16-Bit-Tiefenformats funktionieren die erforderlichen Schablonenpuffereffekte nicht, da Unity in dieser Einstellung keinen Schablonenpuffer erstellt . Wenn Sie umgekehrt das 24-Bit-Tiefenformat auswählen, wird in der Regel ein 8-Bit-Schablonenpuffer erstellt, falls zutreffend auf der Endpunktgrafikplattform.

Tiefenpufferfreigabe in Unity

Um die tiefenbasierte LSR zu nutzen, müssen Entwickler zwei wichtige Schritte ausführen.

  1. UnterProjekteinstellungen>bearbeiten>Player>XR-Einstellungen>Virtual Reality SDKs>Tiefenpufferfreigabe aktivieren
    1. Wenn HoloLens als Ziel verwendet wird, wird empfohlen, auch das 16-Bit-Tiefenformat auszuwählen.
  2. Beim Rendern von Farbe auf dem Bildschirm können Sie auch die Tiefe rendern.

Undurchsichtige GameObjects in Unity schreiben in der Regel automatisch in die Tiefe. Transparente & Textobjekte schreiben jedoch in der Regel nicht standardmäßig in die Tiefe. Wenn Sie den MRTK Standard-Shader oder Text Mesh Pro verwenden, kann dies problemlos behoben werden.

Hinweis

Um schnell zu ermitteln, welche Objekte in einer Szene nicht visuell in den Tiefenpuffer schreiben, kann das Hilfsprogramm Rendertiefepuffer unter den Editoreinstellungen im MRTK-Konfigurationsprofil verwendet werden.

Transparent MRTK Standard-Shader

Wählen Sie für transparente Materialien, die den MRTK Standard-Shader verwenden, das Material aus, um es im Inspektorfenster anzuzeigen. Klicken Sie dann auf die Schaltfläche Jetzt fixieren , um das Material in die Tiefe zu konvertieren (d. h. Z-Write On).

Vorher

Tiefenpuffer vor der Behebung des MRTK-Standard-Shaders

Nach

Tiefenpuffer: MRTK-Standard-Shader korrigiert

Text Mesh Pro

Wählen Sie für Text Mesh Pro-Objekte das TMP-GameObject aus, um es im Inspektor anzuzeigen. Wechseln Sie unter der Materialkomponente den Shader für das zugewiesene Material, um den MRTK TextMeshPro-Shader zu verwenden.

Korrektur des Text mesh Pro-Tiefenpuffers

Benutzerdefinierter Shader

Wenn Sie einen benutzerdefinierten Shader schreiben, fügen Sie das ZWrite-Flag am Anfang der Pass-Blockdefinition hinzu, um den Shader so zu konfigurieren, dass er in den Tiefenpuffer schreibt.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Undurchsichtige Unterstützungen

Wenn die oben genannten Methoden für ein bestimmtes Szenario (d. h. die Verwendung der Unity-Benutzeroberfläche) nicht funktionieren, ist es möglich, dass ein anderes Objekt in den Tiefenpuffer schreibt. Ein häufiges Beispiel ist die Verwendung von Unity UI Text in einem unverankerten Bereich in einer Szene. Wenn Sie das Panel undurchsichtig machen oder zumindest in die Tiefe schreiben, werden sowohl der Text & das Panel von der Plattform stabilisiert, da ihre Z-Werte so nah beieinander liegen.

WorldAnchors (HoloLens)

Neben der Sicherstellung, dass die richtigen Konfigurationen erfüllt sind, um die visuelle Stabilität zu gewährleisten, ist es wichtig, sicherzustellen, dass Hologramme an ihren richtigen physischen Positionen stabil bleiben. Um die Plattform über wichtige Orte in einem physischen Raum zu informieren, können Entwickler WorldAnchors auf GameObjects nutzen, die an einem Ort bleiben müssen. Ein WorldAnchor ist eine Komponente, die einem GameObject hinzugefügt wird und die absolute Kontrolle über die Transformation dieses Objekts übernimmt.

Geräte wie HoloLens scannen ständig und lernen die Umgebung kennen. Da die HoloLens bewegung & Position im Raum nachverfolgt, werden ihre Schätzungen aktualisiert und das Unity-Koordinatensystem angepasst. Wenn ein GameObject beispielsweise beim Start 1 m von der Kamera entfernt platziert wird, während die HoloLens die Umgebung verfolgt, kann der physische Punkt, an dem sich das GameObject befindet, tatsächlich 1,1 m entfernt sein. Dies würde dazu führen, dass das Hologramm driftet. Wenn Sie ein WorldAnchor-Objekt auf ein GameObject anwenden, kann der Anker die Transformation des Objekts steuern, sodass das Objekt am richtigen physischen Speicherort verbleibt (d. h. auf 1,1 m anstatt auf 1 Mio. zur Laufzeit aktualisiert). Um WorldAnchors über App-Sitzungen hinweg beizubehalten, können Entwickler worldAnchorStore verwenden, um WorldAnchors zu speichern und zu laden.

Hinweis

Sobald eine WorldAnchor-Komponente zu einem GameObject hinzugefügt wurde, ist es nicht möglich, die Transformation dieses GameObjects (d. h. transform.position = x) zu ändern. Ein Entwickler muss worldAnchor entfernen, um die Transformation zu bearbeiten.

WorldAnchor m_anchor;

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

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

Wenn Sie eine Alternative zum manuellen Arbeiten mit Anchors benötigen, lesen Sie die Microsoft World Locking Tools.

Siehe auch