Hologramstabilisatie

Prestaties

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

Omgevingstracering

Stabiele holografische rendering is sterk afhankelijk van het volgen van hoofdhoudingen door het platformapparaat & . Unity geeft de scène weer van elk frame van de camerahouding die wordt geschat en geleverd door het onderliggende platform. Als deze tracering niet correct de werkelijke hoofdbeweging 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 hoofdtracering, 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 hardwaregeassisteerd proces dat bekend staat als Late-Stage Reprojection.

Latere projectie

Aan het einde van het weergeven van een frame neemt het Windows Mixed Reality platform de kleurendiepteweergavedoelen & die door de toepassing worden geproduceerd en transformeert de uiteindelijke schermuitvoer om rekening te houden met eventuele lichte hoofdbewegingen sinds de laatste voorspelling van de hoofdhouding. Het uitvoeren van een gamelus van een toepassing kost tijd. Bij 60 FPS betekent dit bijvoorbeeld dat de toepassing ~16,667 ms nodig heeft om een frame weer te geven. Hoewel dit misschien een kleine 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 op een Windows Mixed Reality apparaat wordt uitgevoerd, wordt het algoritme Late-Stage Reprojection per pixel of via een stabilisatievlak uitgevoerd.

Diepte per pixel gebaseerd

Reprojectie op basis van diepte per pixel omvat het gebruik van de dieptebuffer om de afbeeldingsuitvoer per pixel te wijzigen en zo hologrammen op verschillende afstanden te stabiliseren. Een bol op 1 meter afstand kan zich bijvoorbeeld voor een pijler bevinden 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 iets heeft gekanteld. Reprojectie per pixel houdt rekening met dit afstandsverschil bij elke pixel voor nauwkeurigere reprojectie.

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 liggen, krijgen de maximale hardwarestabilisatie. Het punt en normaal voor het vliegtuig kunnen worden geleverd aan het platform via de HolographicSettings.SetFocusPointForFrameAPIgeleverd door Unity.

Dieptebufferindeling

Als u zich richt op HoloLens voor ontwikkeling, 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-fighting te voorkomen, wordt aanbevolen om het verre clipvlak te verminderen van de standaardwaarde van 1000m die is ingesteld door Unity.

Notitie

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

Dieptebuffer delen in Unity

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

  1. Onder Bewerken>Project Instellingen>PlayerXR> Instellingen >Virtual Reality SDK's>dieptebuffer delen inschakelen
    1. Als u zich richt op HoloLens, 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 & 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 de Editor Instellingen in het MRTK-configuratieprofiel.

Transparante MRTK Standard-arcering

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 (bijvoorbeeld Z-Write On).

Voor

Depth Buffer Before Fix MRTK Standard Shader

Na

Depth Buffer Fixed MRTK Standard Shader

Tekst Mesh Pro

Selecteer voor Text Mesh Pro-objecten 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 arcering

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 (d.w.w.v. Unity UI), is het mogelijk om een ander object naar de dieptebuffer te schrijven. Een veelvoorkomend voorbeeld is het gebruik van Unity UI Text op een zwevend paneel in een scène. Door het paneel ondoorzichtig te maken of ten minste tot diepte te schrijven, wordt zowel de tekst & van 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 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 heeft over de transformatie van dat object.

Apparaten zoals HoloLens scannen en leren voortdurend over de omgeving. Als de HoloLens dus de positie van de beweging & in de ruimte bijhoudt, worden de schattingen bijgewerkt en wordt het Unity-coördinaatsysteem aangepast. Als bijvoorbeeld een GameObject vanaf het begin 1m van de camera wordt geplaatst, terwijl de HoloLens de omgeving volgt, kan het zich realiseren waar het GameObject zich bevindt zich eigenlijk 1,1m afstand. 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 (dat wil bijvoorbeeld bijwerken naar 1,1m weg in plaats van 1m tijdens runtime). Om WorldAnchors in app-sessies te behouden, kunnen ontwikkelaars de WorldAnchorStore gebruiken om WorldAnchors op te slaan en te laden.

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 Ankers, raadpleegt u de Microsoft World Locking Tools.

Zie ook