Hologramstabilisering

Prestanda

För att den underliggande plattformen och enheten för mixad verklighet ska få bästa resultat är det viktigt att uppnå prestanda för bildfrekvenser. Målramfrekvensen (t.ex. 60 FP eller 90 FP) varierar mellan olika plattformar och enheter. Program med mixad verklighet kommer dock att ha stabila hologram, effektiv huvudspårning, handspårning och mycket mer.

Miljöspårning

Stabil holografisk rendering förlitar sig i hög grad på huvudposeringsspårning av & enhet. Unity renderar scenen varje bildruta från kamerahållningen som uppskattas och tillhandahålls av den underliggande plattformen. Om spårningen inte följer den faktiska huvudförflyttningen visas hologram som visuellt felaktiga. Detta är särskilt tydligt och viktigt för AR-enheter som HoloLens där användare kan relatera virtuella hologram till den verkliga världen. Prestandan är viktig för tillförlitlig huvudspårning, men det kan även finnas andraviktiga funktioner. Vilka typer av miljöelement som påverkar användarupplevelsen beror på målplattformens specifika aspekter.

Windows Mixed Reality

Plattformen Windows Mixed Reality tillhandahåller ett referensmaterial för att stabilisera hologram på plattformen. Det finns en handfull viktiga verktyg som utvecklare kan använda för att förbättra användarnas visuella hologramupplevelse.

Delning av djupbuffert

Unity-utvecklare har möjlighet att dela programmets djupbuffert med plattformen. Detta ger information, där hologram finns för en aktuell ram, som plattformen kan använda för att stabilisera hologram via en maskinvarustödd process som kallas Late-Stage Reprojection.

Omprojektion av sent stadium

I slutet av återgivningen av en ram tar Windows Mixed Reality-plattformen mål för återgivning av färg-&-djup som skapas av programmet och transformerar slutskärmsutdata för att ta hänsyn till eventuella små huvudförflyttningar sedan den senaste förutsägelsen om huvudställning. Ett programs spelslinga tar tid att köra. Vid 60 FP innebär det till exempel att programmet tar ~16,667 ms för att rendera en ram. Även om detta kan verka som en minimal mängd tid, kommer användarens position och orientering för huvudet att ändras, vilket resulterar i nya projektionsmatriser för kameran vid rendering. Reprojection i sent stadium transformerar bildpunkterna i den slutliga bilden för att ta hänsyn till det här nya perspektivet.

LSR per pixel jämfört med stabilt plan

Beroende på enhetens slutpunkt och os-version som körs på en Windows Mixed Reality-enhet utförs antingen Late-Stage Reprojection-algoritmen per pixel eller via ett stabiliseringsplan.

Djupbaserad per pixel

Djupbaserad omprojektion per pixel omfattar användning av djupbufferten för att ändra bildens utdata per pixel och därmed stabilisera hologram vid olika avstånd. Till exempel kan en sfär 1 miljon bort finnas framför en pelare som är 10m bort. Bildpunkter som representerar sfären kommer att ha en annan transformering än de långt bort bildpunkter som representerar grundpelaren om användaren har lutat huvudet något. Reprojection per pixel tar hänsyn till den här avståndsskillnaden vid varje pixel för mer exakt omprojektering.

Stabiliseringsplanet

Om det inte går att skapa en korrekt djupbuffert att dela med plattformen använder en annan form av LSR ett stabilt plan. Alla hologram i en scen kommer att få viss stabilisering, men hologram i det önskade planet får maximal maskinvarustabilisering. Punkten och normal för planet kan skickas till plattformen via API:et HolographicSettings.SetFocusPointForFrame som tillhandahålls av Unity.

Format för djupbuffert

Om du HoloLens för utveckling rekommenderar vi starkt att du använder 16-bitars djupbuffertformatet jämfört med 24-bitars. Detta kan spara mycket på prestanda även om djupvärdena har mindre precision. För att kompensera för den lägre precisionen och undvika z-eringrekommenderar vi att du minskar det avlägsna klippplanet från standardvärdet på 1 000 m som angetts av Unity.

Anteckning

Om du använder formatet 16-bitars djup fungerar inte stencilbufferten nödvändiga effekter eftersom Unity inte skapar en stencilbuffert i den här inställningen. Om du väljer 24-bitars djupformat på samma sätt skapas vanligtvis en 8-bitarsstencilbuffert , om tillämpligt på slutpunktsgrafikplattformen.

Delning av djupbuffert i Unity

För att kunna använda djupbaserad LSR finns det två viktiga steg som utvecklare behöver vidta.

  1. Under Edit > Project Inställningar > Player > XR Inställningar Virtual > Reality-SDKs > Enable Depth Buffer Sharing (Aktivera delning av djupbuffert)
    1. Om du HoloLens mål rekommenderar vi att du även väljer 16-bitars djupformat.
  2. Vid rendering av färg på skärmen, rendera djup samt

Opaque GameObjects i Unity skriver vanligtvis till djupet automatiskt. Transparenta & skriver normalt inte till djupet som standard. Om du använder MRTK Standard Shader eller Text Mesh Pro kan du enkelt åtgärda detta.

Anteckning

För att snabbt avgöra vilka objekt i en scen som inte skriver till djupbufferten visuellt kan du använda verktyget Render Depth Buffer (Rendera djupbuffert) under redigeraren Inställningar i MRTK-konfigurationsprofilen.

Transparent MRTK Standard-skuggare

För transparenta material som använder MRTK Standard-skuggarenväljer du materialet för att visa det i kontrollfönstret. Klicka sedan på knappen Åtgärda nu för att konvertera materialet att skriva till djupet (d.v.s. Z-Write On).

Före

Djupbuffert innan du åtgärdar MRTK Standard Shader

Efter

Djupbuffert med fast MRTK Standard Shader

Text Mesh-Pro

För Text Mesh Pro objekt väljer du TMP GameObject för att visa det i kontrollanten. Under materialkomponenten växlar du skuggaren för det tilldelade materialet för att använda MRTK TextMeshPro-skuggaren.

Korrigering av Pro Text Mesh-djupbuffert

Anpassad skuggare

Om du skriver en anpassad skuggare lägger du till ZWrite-flaggan överst i definitionen för Pass-blocket för att konfigurera shader till att skriva till djupbufferten.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Täckande bakningar

Om ovanstående metoder inte fungerar för ett visst scenario (d.v.s. med hjälp av Unity UI är det möjligt att skriva ett annat objekt till djupbufferten. Ett vanligt exempel är att använda Unity UI Text på en flytande panel i en scen. Genom att göra panelen täckande eller åtminstone skriva till djupet stabiliseras både texten & panelen av plattformen eftersom deras z-värden är så nära varandra.

WorldAnchors (HoloLens)

Förutom att säkerställa att rätt konfigurationer uppfylls för att säkerställa visuell stabilitet, är det viktigt att se till att hologram förblir stabila på rätt fysiska platser. För att informera plattformen om viktiga platser i ett fysiskt utrymme kan utvecklare utnyttja WorldAnchors på GameObjects som måste vara på en och samma plats. En WorldAnchor är en komponent som läggs till i ett GameObject som tar absolut kontroll över objektets transformering.

Enheter som HoloLens genomsöker och lär sig hela tiden om miljön. Det innebär att HoloLens spårar & i rymden, kommer dess uppskattningar att uppdateras och Unity-koordinatsystemet justeras. Om ett GameObject exempelvis placeras 1 miljon från kameran vid start, när HoloLens spårar miljön, kanske den fysiska punkt där GameObject finns faktiskt är 1,1 miljon bort. Detta skulle leda till att hologrammet avar sig. Genom att tillämpa en WorldAnchor på ett GameObject kan fästpunkten styra objektets transformering så att objektet förblir på rätt fysisk plats (dvs. uppdatera till 1,1 m bort i stället för 1 m vid körning). För att bevara WorldAnchors mellan appsessioner kan utvecklare använda WorldAnchorStore för att spara och läsa in WorldAnchors.

Anteckning

När en WorldAnchor-komponent har lagts till i ett GameObject går det inte att ändra GameObject-transformeringen (d.v.s. transform.position = x). En utvecklare måste ta bort WorldAnchor för att redigera transformeringen.

WorldAnchor m_anchor;

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

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

Om du vill ha ett alternativ till att arbeta manuellt med fästpunkter kan du titta på Microsoft World Locking Tools.

Se även