Hologramstabilisatie

Prestaties

Om ervoor te zorgen dat mixed reality platform en apparaat de beste resultaten opleveren, is het belangrijk om framesnelheden te bereiken. De doelframerate (bijvoorbeeld 60 FPS of 90 FPS) verschilt per platform en apparaat. Maar mixed reality toepassingen die voldoen aan framerate, hebben stabiele hologrammen, evenals efficiënt bijhouden van hoofd, handtracking en meer.

Omgeving bijhouden

Stabiele holografische rendering is sterk afhankelijk van het bijhouden van de hoofdhouding door het platform & apparaat. Unity geeft de scène elk frame van de camerahouding weer die wordt geschat en geleverd door het onderliggende platform. Als deze tracering de werkelijke verplaatsing van het hoofd 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. Prestaties zijn belangrijk voor betrouwbare headtracking, maar er kunnen ook andere belangrijke functieszijn. De typen omgevingselementen die van invloed zijn op de gebruikerservaring, zijn afhankelijk van de specifieke platformspecifieke elementen van het doel.

Windows Mixed Reality

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

Dieptebuffer delen

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

Late-stage reprojection

Aan het einde van het weergeven van een frame neemt het Windows Mixed Reality-platform de kleur & diepterenderingsdoelen die door de toepassing worden geproduceerd en transformeert het uiteindelijke schermuitvoer om rekening te houden met eventuele kleine hoofdbewegingen sinds de laatste voorspelling van de hoofdhouding. Het duurt even om de gamelus van een toepassing uit te voeren. Bij 60 FPS betekent dit bijvoorbeeld dat de toepassing ~16,667 ms nodig heeft om een frame weer te geven. Hoewel dit een minuscule hoeveelheid tijd lijkt, verandert de positie en richting van de hoofd van de gebruiker, wat resulteert in nieuwe projectie matrices voor de camera bij het weergeven. Met de laatste fase van de reprojectie worden de pixels in de uiteindelijke afbeelding getransformeerd om rekening te houden met dit nieuwe perspectief.

LSR per pixel versus stabiliserende vlak

Afhankelijk van het eindpunt van het apparaat en de versie van het besturingssysteem dat wordt uitgevoerd op een Windows Mixed Reality-apparaat, wordt het Late-Stage-reprojectiealgoritme uitgevoerd per pixel of via een stabiliserende vlak.

Op basis van diepte per pixel

Reprojectie op basis van diepte per pixel omvat het gebruik van de dieptebuffer om de afbeeldingsuitvoer per pixel te wijzigen en op die manier hologrammen op verschillende afstanden te stabiliseren. Zo kan een bol 1m verderop voor een pijler staan die 10 m verwijderd is. 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. Bij reprojectie per pixel wordt rekening gehouden met dit afstandsverschil op elke pixel voor een nauwkeurigere reprojectie.

Stabiliserende vlak

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 stabiliserende vlak. Alle hologrammen in een scène krijgen enige stabiliserende vorm, maar hologrammen die in het gewenste vlak liggen, krijgen de maximale hardwarestabilisatie. Het punt en de normale waarde voor het vlak kunnen worden opgegeven aan het platform via de HolographicSettings.SetFocusPointForFrame-API van Unity.

Indeling van dieptebuffer

Als u HoloLens voor ontwikkeling, is het raadzaam om de bufferindeling van 16-bits diepte 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-ingte voorkomen, is het raadzaam om het klemvlak te verminderen van de standaardwaarde van 1000 m die is ingesteld door Unity.

Notitie

Als u een 16-bits diepteindeling gebruikt, werkt de vereiste effecten van stencilbuffer niet omdat Unity in deze instelling geen stencilbuffer maakt. Als u daarentegen de 24-bits diepte-indeling selecteert, wordt in het algemeen een 8-bits stencilbufferaanmaken, indien van toepassing op het grafische eindpuntplatform.

Diepte buffer delen in Unity

Als u gebruik wilt maken van LSR op basis van diepte, zijn er twee belangrijke stappen die ontwikkelaars moeten nemen.

  1. Onder Edit > Project Instellingen > Player > XR Instellingen Virtual Reality > SDK's > Enable Depth Buffer Sharing (Dieptebuffer delen inschakelen)
    1. Als u HoloLens, is het raadzaam om ook de 16-bits diepte-indeling te selecteren.
  2. Bij het weergeven van de kleur op het scherm, moet ook de diepte van de weergave worden weergegeven

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

Notitie

Om snel te 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-shader

Voor transparante materialen met behulp van de MRTK Standard-shaderselecteert 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 (dat wil zeggen Z-Write On).

Voor

Dieptebuffer voordat mrtk-standaard-shader is opgelost

Na

Dieptebuffer Vaste MRTK Standard-shader

Tekst-mesh-Pro

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

Oplossing voor dieptebuffer Pro Mesh-tekst

Aangepaste shader

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

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Ondoorzichtige back-s

Als de bovenstaande methoden niet werken voor een bepaald scenario (dat wil zeggen met unity-gebruikersinterface) is het mogelijk om een ander object naar de dieptebuffer te schrijven. Een veelvoorkomende voorbeeld is het gebruik van Unity UI Text in een zwevend paneel in een scène. Door het deelvenster ondoorzichtig te maken of ten minste naar de diepte te schrijven, wordt de tekst & het deelvenster stabiel door het platform omdat de z-waarden zo dicht bij elkaar liggen.

WorldAnchors (HoloLens)

Naast het garanderen van de juiste configuraties om visuele stabiliteit te garanderen, is het belangrijk om ervoor te zorgen dat hologrammen stabiel blijven op de 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 worden voortdurend gescand en leren over de omgeving. Dus als de HoloLens de verplaatsing & positie in de ruimte bij houdt, worden de schattingen bijgewerkt en wordt het Unity-coördinaatsysteem aangepast. Als een GameObject bijvoorbeeld bij het begin op 1m van de camera wordt geplaatst, omdat de HoloLens de omgeving volgt, kan het zich realiseren dat het fysieke punt waar het GameObject zich bevindt, in feite 1,1m verwijderd is. Dit zou leiden tot het driften van het hologram. Door een WorldAnchor toe te passen op een GameObject kan het anker de transformatie van het object bepalen, zodat het object op de juiste fysieke locatie blijft (dat wil zeggen bijwerken naar 1,1 m verwijderd in plaats van 1m tijdens runtime). Om WorldAnchors te bewaren tussen app-sessies, kunnen ontwikkelaars de WorldAnchorStore gebruiken om WorldAnchorsop 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 (dat wil zeggen transform.position = x). Een ontwikkelaar moet de 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 handmatig werken met Ankers, raadpleegt u de Microsoft World Locking Tools.

Zie ook