Stabilisatie van hologrammen — MRTK2

Prestaties

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

Omgeving bijhouden

Stabiele holografische rendering is sterk afhankelijk van het volgen van hoofdhoudingen door het platform & apparaat. Unity geeft de scène elk frame weer van de camerahouding die door het onderliggende platform is geschat en geleverd. 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 het betrouwbaar bijhouden van hoofden, maar er kunnen ook andere belangrijke functies zijn. De typen omgevingselementen die van invloed zijn op de gebruikerservaring, zijn afhankelijk van de specifieke platformgegevens.

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 hologramvisual-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, waar hologrammen bestaan voor een huidig frame, die het platform kan gebruiken om hologrammen te stabiliseren via een hardwareondersteund proces dat bekend staat als Late-Stage Reprojection.

Nieuwe projectie in een late fase

Aan het einde van het weergeven van een frame gebruikt het Windows Mixed Reality platform de kleur & diepteweergavedoelen die door de toepassing worden geproduceerd en transformeert het de uiteindelijke schermuitvoer om rekening te houden met eventuele lichte hoofdbewegingen sinds de laatste voorspelling van de hoofdpositie. Het uitvoeren van de 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 minuscule hoeveelheid tijd lijkt, veranderen de positie en richting van het hoofd van de gebruiker, wat resulteert in nieuwe projectiematrices voor de camera in de rendering. Nieuwe projectie in een 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 versie van het besturingssysteem die worden uitgevoerd op een Windows Mixed Reality apparaat, wordt het algoritme Late-Stage Reprojection uitgevoerd per pixel of via een stabilisatievlak.

Diepte per pixel

Herprojectie 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 bevindt zich bijvoorbeeld voor een pilaar op 10 meter afstand. De pixels die de bol vertegenwoordigen, hebben een andere transformatie dan de pixels die de pilaar vertegenwoordigen als de gebruiker het 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 ontvangen enige stabilisatie, maar hologrammen in het gewenste vlak ontvangen de maximale hardwarestabilisatie. Het punt en normaal voor het vliegtuig kunnen aan het platform worden geleverd via de HolographicSettings.SetFocusPointForFrame-APIvan Unity.

Dieptebufferindeling

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

Notitie

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

Dieptebuffer delen in Unity

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

  1. OnderProjectinstellingen>bewerken>Speler>XR-instellingen>Virtual Reality SDK's>dieptebuffer delen inschakelen
    1. Als het gericht is op HoloLens, wordt het aanbevolen om ook een 16-bits diepteindeling te selecteren.
  2. Bij het weergeven van kleur op het scherm, wordt ook diepte weergegeven

Ondoorzichtige GameObjects in Unity worden over het algemeen automatisch naar diepte geschreven. 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 verholpen.

Notitie

Als u snel wilt bepalen welke objecten in een scène visueel niet naar de dieptebuffer schrijven, kunt u het hulpprogramma Dieptebuffer weergeven gebruiken onder de Editor-instellingen in het MRTK-configuratieprofiel.

Transparante MRTK Standard-shader

Voor transparante materialen met de MRTK Standard-shader selecteert u het materiaal om het weer te geven in het venster Inspector . Klik vervolgens op de knop Nu herstellen om het materiaal te converteren naar diepte (dat wil zeggen Z-Write On).

Voor

Dieptebuffer voordat MRTK Standard Shader wordt opgelost

Na

Dieptebuffer opgelost 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 arcering voor het toegewezen materiaal om de MRTK TextMeshPro-shader te gebruiken.

Text Mesh Pro Depth Buffer Fix

Aangepaste arcering

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

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

Als de bovenstaande methoden niet werken voor een bepaald scenario (dat wil zeggen met behulp van de Unity-gebruikersinterface), is het mogelijk om een ander object naar de dieptebuffer te laten schrijven. Een veelvoorkomend voorbeeld is het gebruik van Unity UI Text in een zwevend deelvenster in een scène. Door het paneel ondoorzichtig of op zijn minst schrijvend tot in de diepte te maken, worden zowel de tekst & het paneel gestabiliseerd door het platform omdat hun z-waarden zo dicht bij elkaar liggen.

WorldAnchors (HoloLens)

Naast ervoor 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 de juiste fysieke locaties. Om het platform te informeren over belangrijke locaties in een fysieke ruimte, 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 de absolute controle over de transformatie van dat object overneemt.

Apparaten zoals HoloLens scannen voortdurend en leren over de omgeving. Wanneer de HoloLens de beweging & positie in de ruimte volgt, worden de schattingen bijgewerkt en wordt het Unity-coördinatensysteem aangepast. Als een GameObject bijvoorbeeld bij het begin op 1 meter van de camera wordt geplaatst, omdat de HoloLens de omgeving volgt, kan het zich realiseren dat het fysieke punt waar het GameObject zich bevindt, zich op 1,1 meter afstand bevindt. Dit zou leiden tot het afdwingen van het hologram. 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 zeggen bijwerken naar 1,1 m in plaats van 1 m 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 (d.w.z. transform.position = x) te wijzigen. 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