Delen via


Hologramstabilisatie — MRTK2

Prestaties

Om ervoor te zorgen dat het onderliggende mixed reality-platform en het apparaat de beste resultaten oplevert, is het belangrijk om framesnelheden te behalen. De doelframerate (bijvoorbeeld 60 FPS of 90 FPS) verschilt per platform en apparaat. Mixed reality-toepassingen die een framerate ontmoeten, hebben echter stabiele hologrammen en efficiënte hoofdtracking, handtracering en meer.

Omgevingstracering

Stabiele holografische rendering is sterk afhankelijk van het volgen van hoofdhoudingen door het platform en apparaat. Unity maakt de scène elk frame van de camerahouding geschat en geleverd door het onderliggende platform. Als deze tracering de werkelijke hoofdbeweging niet correct volgt, worden hologrammen visueel onnauwkeurig weergegeven. Dit is vooral duidelijk en belangrijk voor AR-apparaten zoals HoloLens, waar gebruikers virtuele hologrammen kunnen relateren aan de echte wereld. De prestaties zijn belangrijk voor betrouwbare hoofdtracking, maar er kunnen ook andere belangrijke functies zijn. De typen omgevingselementen die van invloed zijn op de gebruikerservaring, zijn afhankelijk van de specifieke platformspecifieke kenmerken.

Windows Mixed Reality

Het Windows Mixed Reality-platform biedt een aantal referentiemateriaal voor het stabiliseren van hologrammen op het platform. Er zijn echter een aantal belangrijke hulpprogramma's die ontwikkelaars kunnen gebruiken om de visuele ervaring van hologrammen voor gebruikers te verbeteren.

Dieptebuffer delen

Unity-ontwikkelaars kunnen de dieptebuffer van de toepassing delen met het platform. Dit biedt informatie, waar hologrammen bestaan voor een huidig frame, dat het platform kan gebruiken om hologrammen te stabiliseren via een hardware-ondersteund proces dat bekend staat als Late-Stage Reprojection.

Nieuwe projectie in latere fase

Aan het einde van het weergeven van een frame neemt het Windows Mixed Reality-platform de kleuren- en diepteweergavedoelen die door de toepassing worden geproduceerd en transformeert de uiteindelijke schermuitvoer om rekening te houden met een lichte hoofdbeweging sinds de laatste voorspelling van de hoofdhouding. Het duurt even voordat de gamelus van een toepassing wordt uitgevoerd. Bij 60 FPS betekent dit bijvoorbeeld dat de toepassing ~16,667 ms nodig heeft om een frame weer te geven. Hoewel dit misschien een miniscule hoeveelheid tijd lijkt, verandert de positie en stand van de gebruiker van het hoofd, wat resulteert in nieuwe projectiematrices voor de camera in rendering. Nieuwe projectie in de late fase transformeert de pixels in de uiteindelijke afbeelding om rekening te houden met dit nieuwe perspectief.

LSR per pixel versus stabilisatievlak

Afhankelijk van het apparaateindpunt en de besturingssysteemversie die wordt uitgevoerd op een Windows Mixed Reality-apparaat, wordt het algoritme Late Stage Reprojection per pixel of via een stabilisatievlak uitgevoerd.

Op basis van diepte per pixel

Reprojectie op basis van diepte per pixel omvat het gebruik van de dieptebuffer om de uitvoer van de afbeelding per pixel te wijzigen en zo hologrammen op verschillende afstanden te stabiliseren. Zo kan een bol 1m weg liggen voor een pijler die zich op 10 meter afstand bevindt. De pixels die de bol vertegenwoordigen, hebben een andere transformatie dan de ver weg pixels die de pijler vertegenwoordigen als de gebruiker zijn hoofd enigszins heeft gekanteld. Bij herprojectie per pixel wordt rekening gehouden met dit afstandsverschil bij elke pixel voor een nauwkeurigere herprojectie.

Stabilisatievlak

Als het niet mogelijk is om een nauwkeurige dieptebuffer te maken om te delen met het platform, maakt een andere vorm van LSR gebruik van een stabilisatievlak. Alle hologrammen in een scène krijgen enige stabilisatie, maar hologrammen die in het gewenste vlak lagen, krijgen de maximale hardwarestabilisatie. Het punt en normaal voor het vliegtuig kunnen worden geleverd aan het platform via de HolographicSettings.SetFocusPointForFrame-API geleverd door Unity.

Dieptebufferindeling

Als u HoloLens voor ontwikkeling wilt gebruiken, wordt het ten zeerste aanbevolen om de 16-bits dieptebufferindeling te gebruiken in vergelijking met 24-bits. Dit kan enorm besparen op prestaties, hoewel dieptewaarden minder precisie hebben. Om de lagere precisie te compenseren en z-vechten te voorkomen, wordt aanbevolen om het verre klemvlak te verminderen van de standaardwaarde van 1000m die door Unity is ingesteld.

Notitie

Als u de 16-bits diepteindeling gebruikt, werken de vereiste effecten voor de stencilbuffer niet omdat Unity geen stencilbuffer maakt in deze instelling. Als u een 24-bits diepteindeling selecteert, wordt doorgaans een 8-bits stencilbuffer gemaakt, indien van toepassing op het platform voor eindpuntafbeeldingen.

Dieptebuffer delen in Unity

Om gebruik te kunnen maken van LSR op basis van diepte, zijn er twee belangrijke stappen die ontwikkelaars moeten uitvoeren.

  1. Onder Project>Settings>Player>XR Settings>Virtual Reality SDK's> bewerken, dieptebuffer delen inschakelen
    1. Als u HoloLens wilt gebruiken, wordt u aangeraden ook een 16-bits diepteindeling te selecteren.
  2. Bij het weergeven van de kleur op het scherm, wordt ook diepte weergegeven

Ondoorzichtige GameObjects in Unity schrijven over het algemeen automatisch naar diepte. Transparante en tekstobjecten schrijven over het algemeen echter niet standaard naar diepte. Als u de MRTK Standard Shader of Text Mesh Pro gebruikt, kan dit eenvoudig worden opgelost.

Notitie

Als u snel wilt bepalen welke objecten in een scène niet visueel naar de dieptebuffer schrijven, kunt u het hulpprogramma Render Depth Buffer gebruiken onder editorinstellingen in het MRTK-configuratieprofiel.

Transparante MRTK Standard-shader

Voor transparante materialen met behulp van de MRTK Standard-shader selecteert u het materiaal om het weer te geven in het Inspector-venster . Klik vervolgens op de knop Nu herstellen om het materiaal te converteren naar diepte (z-write on).

Vóór

Dieptebuffer voordat MRTK Standard Shader wordt hersteld

Zodra

Dieptebuffer vaste MRTK Standard Shader

Text Mesh Pro

Voor Text Mesh Pro-objecten selecteert u het TMP GameObject om het in de inspector weer te geven. Schakel onder het materiaalonderdeel de shader voor het toegewezen materiaal om de MRTK TextMeshPro-shader te gebruiken.

Text Mesh Pro Depth Buffer Fix

Aangepaste shader

Als u een aangepaste shader schrijft, voegt u de ZWrite-vlag toe aan de bovenkant van de Pass-blokdefinitie om de shader te configureren om naar de dieptebuffer te schrijven.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Ondoorzichtige backings

Als de bovenstaande methoden niet werken voor een bepaald scenario (bijvoorbeeld het gebruik van de Unity-gebruikersinterface), is het mogelijk om een ander object naar de dieptebuffer te schrijven. Een veelvoorkomend voorbeeld is het gebruik van Unity UI Text in een zwevend deelvenster in een scène. Door het paneel ondoorzichtig of ten minste naar diepte te schrijven, worden zowel de tekst als het paneel gestabiliseerd door het platform omdat hun z-waarden zo dicht bij elkaar liggen.

WorldAnchors (HoloLens)

Naast ervoor te zorgen dat aan de juiste configuraties wordt voldaan om visuele stabiliteit te garanderen, is het belangrijk om ervoor te zorgen dat hologrammen stabiel blijven op hun juiste fysieke locaties. Om het platform op belangrijke locaties in een fysieke ruimte te informeren, kunnen ontwikkelaars Gebruikmaken van WorldAnchors op GameObjects die op één plek moeten blijven. Een WorldAnchor is een onderdeel dat is toegevoegd aan een GameObject dat absolute controle over de transformatie van dat object krijgt.

Apparaten zoals HoloLens scannen voortdurend en leren over de omgeving. Als de HoloLens beweging en positie in de ruimte bijhoudt, worden de schattingen bijgewerkt en wordt het Unity-coördinaatsysteem aangepast. Als een GameObject bijvoorbeeld 1m van de camera aan het begin wordt geplaatst, terwijl de HoloLens de omgeving bijhoudt, kan het fysieke punt waar het GameObject zich bevindt, zich daadwerkelijk op 1,1 meter afstand realiseren. Dit zou ertoe leiden dat het hologram afdrijdt. Als u een WorldAnchor toepast op een GameObject, kan het anker de transformatie van het object beheren, zodat het object op de juiste fysieke locatie blijft (bijvoorbeeld bijwerken naar 1,1 min in plaats van 1m tijdens runtime). Ontwikkelaars kunnen WorldAnchorStore gebruiken om WorldAnchors op te slaan en te laden in app-sessies.

Notitie

Zodra een WorldAnchor-onderdeel is toegevoegd aan een GameObject, is het niet mogelijk om de transformatie van Dat GameObject te wijzigen (d.w.z. transform.position = x). Een ontwikkelaar moet WorldAnchor verwijderen om de transformatie te bewerken.

WorldAnchor m_anchor;

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

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

Als u een alternatief wilt voor het handmatig werken met Anchors, raadpleegt u de Microsoft World Locking Tools.

Zie ook