Reprojekce pozdní fáze

Pozdní fáze reprojektování (LSR) je hardwarová funkce, která pomáhá stabilizovat hologramy, když se uživatel přesune.

U statických modelů se očekává, že při pohybu po nich vizuálně zachovají svou pozici. Pokud se zdá, že jsou nestabilní, může toto chování naznačovat problémy s LSR. Mějte na paměti, že toto chování může maskovat další dynamické transformace, jako jsou animace nebo zobrazení exploze.

Můžete si vybrat mezi dvěma různými režimy LSR, konkrétně Planar LSR nebo Depth LSR. Oba režimy LSR zlepšují stabilitu hologramu, i když mají svá různá omezení. Začněte tím, že vyzkoušíte hloubkový LSR, protože ve většině případů pravděpodobně dává lepší výsledky.

Jak nastavit režim LSR

Který z režimů LSR se používá, určuje, jestli klientská aplikace odešle hloubkovou vyrovnávací paměť. Pokud je vyrovnávací paměť hloubky odeslána, použije hloubkové LSR a Planar LSR jinak.

Následující odstavce vysvětlují, jak se odesílání vyrovnávací paměti hloubky provádí v Unity a nativních aplikacích.

Unity

V editoru Unity přejděte na File > Build Settings. Vyberte Player Settings v levém dolním rohu a pak zaškrtněte, Player > XR Settings > Virtual Reality SDKs > Windows Mixed Reality jestli Enable Depth Buffer Sharing je zaškrtnuté:

Depth Buffer Sharing Enabled flag

Pokud ano, vaše aplikace bude používat hloubkový LSR, jinak bude používat Planar LSR.

Při použití OpenXR by měla být vždy odeslána hloubková vyrovnávací paměť. Nastavení najdete v XR Plug-in Management > OpenXRsouboru . Režim opětovného projektu pak můžete změnit prostřednictvím rozšíření v modulu plug-in OpenXR:

using Microsoft.MixedReality.OpenXR;

public class OverrideReprojection : MonoBehaviour
{
    void OnEnable()
    {
        RenderPipelineManager.endCameraRendering += RenderPipelineManager_endCameraRendering;
    }
    void OnDisable()
    {
        RenderPipelineManager.endCameraRendering -= RenderPipelineManager_endCameraRendering;
    }

    // When using the Universal Render Pipeline, OnPostRender has to be called manually.
    private void RenderPipelineManager_endCameraRendering(ScriptableRenderContext context, Camera camera)
    {
        OnPostRender();
    }

    // Called directly when using Unity's legacy renderer.
    private void OnPostRender()
    {
        ReprojectionSettings reprojectionSettings = default;
        reprojectionSettings.ReprojectionMode = ReprojectionMode.PlanarManual; // Or your favorite reprojection mode.
        
        // In case of PlanarManual you also need to provide a focus point here.
        reprojectionSettings.ReprojectionPlaneOverridePosition = ...;
        reprojectionSettings.ReprojectionPlaneOverrideNormal = ...;
        reprojectionSettings.ReprojectionPlaneOverrideVelocity = ...;

        foreach (ViewConfiguration viewConfiguration in ViewConfiguration.EnabledViewConfigurations)
        {
            if (viewConfiguration.IsActive && viewConfiguration.SupportedReprojectionModes.Contains(reprojectionSettings.ReprojectionMode))
            {
                viewConfiguration.SetReprojectionSettings(reprojectionSettings);
            }
        }
    }
}

Nativní aplikace C++

Odeslání hloubkové vyrovnávací paměti je plně pod kontrolou nativního kódu vazby C++, nezávisle na verzi WMR nebo OpenXR. Jedinou podmínkou, kterou je potřeba splnit, je, že v době, kdy GraphicsBinding::BlitRemoteFrame se volá, musí být hloubková vyrovnávací paměť svázaná s grafickým rozhraním API.

Hloubka LSR

Aby hloubkový LSR fungoval, musí klientská aplikace zadat platnou vyrovnávací paměť hloubky, která obsahuje veškerou příslušnou geometrii, kterou je potřeba zvážit během LSR.

Hloubka LSR se pokusí stabilizovat videorámeček na základě obsahu dodané hloubkové vyrovnávací paměti. V důsledku toho se obsah, který se do něj nevykresloval, například průhledné objekty, nemůže LSR upravit a může ukazovat nestabilitu a artefakty reprojektování.

Chcete-li zmírnit nestabilitu opětovného projektu pro transparentní objekty, můžete vynutit zápis do vyrovnávací paměti hloubky. Podívejte se na materiálový příznak TransparencyWritesDepth pro materiály Color a PBR . Mějte však na paměti, že při povolení tohoto příznaku může dojít k omezení vizuální kvality transparentní/neprůhledné interakce objektů.

Planar LSR

Planar LSR neobsahuje podrobné informace o jednotlivých pixelech, protože LSR hloubky dělá. Místo toho přeprojektuje veškerý obsah na základě roviny, kterou je nutné zadat každý rámec.

Planar LSR reprojects those objects best that lie close to the supplied plane. Čím dál je objekt, tím více nestabilní bude vypadat. I když hloubkový LSR je lepší při reprojektování objektů v různých hloubkách, planar LSR může fungovat lépe pro obsah odpovídající rovině.

Konfigurace Planar LSR v Unity

Parametry roviny jsou odvozeny od tzv . fokusového bodu. Při použití WMR musí být fokus nastaven na každý rámec přes UnityEngine.XR.WSA.HolographicSettings.SetFocusPointForFrame. Podrobnosti najdete v rozhraní UNITY Focus Point API . V případě OpenXR musí být fokus nastavený prostřednictvím ReprojectionSettings uvedeného v předchozí části. Pokud fokus nenastavíte, vybere se pro vás náhradní bod. Tato automatická náhradní aplikace ale často vede k neoptimálním výsledkům.

Bod fokusu můžete vypočítat sami, i když může být vhodné ho založit na tom, který vypočítá hostitel vzdáleného vykreslování. Zavolejte RemoteManagerUnity.CurrentSession.GraphicsBinding.GetRemoteFocusPoint , abyste to získali.

Klient i hostitel obvykle vykreslují obsah, o který druhá strana neví, například prvky uživatelského rozhraní v klientovi. Proto může být vhodné zkombinovat vzdálený fokus s místně počítaným bodem.

Body fokusu vypočítané ve dvou po sobě jdoucích snímcích se můžou hodně lišit. Jednoduše je používat tak, jak je, může vést k tomu, že hologramy vypadají jako skoky. Pokud chcete tomuto chování zabránit, doporučujeme interpolaci mezi předchozími a aktuálními body fokusu.

Režimy přeprojektování

Obecný rozsah problému s hybridním vykreslováním může být uveden takto: Vzdálený a místní obsah jsou v různých pozicích (tj. souřadnicových prostorů), protože vzdálená pozice je předpovězena serverem, zatímco místní pozice je skutečná aktuální. Na konci rámečku vykreslování ale musí být vzdálený i místní obsah zarovnaný a přenesený na displej. Následující obrázek ukazuje příklad, kde jsou místní a vzdálené pozice přeloženy v porovnání s oblast zobrazení zobrazení:

Diagram that illustrates remote and local pose in relation to target viewport.

V závislosti na GraphicsBinding použitém prostředí poskytuje ARR až tři režimy reprojektování, které fungují orgonálně do režimu LSR, který je popsán výše. Tyto režimy se označují jako Remote pose mode, Local pose modea Passthrough pose mode. Na rozdíl od režimu LSR režimy zobrazení definují způsob kombinování vzdáleného a místního obsahu. Volba režimu obchoduje vizuální kvalitu místního obsahu za běhu výkonu, takže aplikace by měly pečlivě zvážit, která možnost je vhodná. Podívejte se na následující aspekty.

Remote pose mode

Remote pose mode je výchozí režim v ARR. V tomto režimu se místní obsah vykreslí nad příchozím vzdáleným streamem obrázku pomocí vzdálené pozice ze vzdáleného rámce. Potom se kombinovaný výsledek předá operačnímu systému pro finální reprojektování. I když tento přístup používá pouze jeden reprojekt, konečná oprava je založena na intervalu odezvy, takže úplná chyba opětovného projektu se použije i na místní obsah. V důsledku toho může velký rozdíl opravy způsobit významné zkreslení místní geometrie včetně prvků uživatelského rozhraní.

Na obrázku výše je použita Remote pose modenásledující transformace:

Reprojection steps in remote pose mode.

Local pose mode

V tomto režimu je přeprojektování rozděleno do dvou různých kroků: V prvním kroku se vzdálený obsah přeprojektuje do místního prostoru, tj. prostor, se kterým se místní obsah ve výchozím nastavení vykresluje na zařízeních VR/AR. Potom se místní obsah vykreslí nad tímto předem transformovaným obrázkem pomocí obvyklé místní pozice. V druhém kroku se kombinovaný výsledek předá operačnímu systému pro finální reprojektování. Vzhledem k tomu, že k tomuto druhému reprojektování dochází pouze k malému rozdílu – ve skutečnosti stejné rozdíly, které by se použily v případě, že ARR nebyla přítomna – artefakty zkreslení místního obsahu se výrazně zmírní.

Proto obrázek vypadá takto:

Reprojection steps in local pose mode.

Passthrough pose mode

Tento režim pozice se v podstatě chová stejně jako Remote pose modemístní a vzdálený obsah jsou kombinovány ve vzdáleném prostoru. Obsah se ale po kombinaci nepřeprojektuje, ale zůstane ve vzdáleném prostoru. Hlavní výhodou tohoto režimu je, že výsledný obrázek nebude ovlivněn artefakty opětovného projektu.

Koncepčně lze tento režim porovnat s běžnými aplikacemi pro streamování cloudu. Vzhledem k vysoké latenci není vhodná pro scénáře připojené k hlavě, ale je to vhodná alternativa pro desktopové a jiné aplikace s plochou obrazovkou, kde je požadovaná vyšší kvalita obrazu. Je tedy k dispozici GraphicsBindingSimD3D11 pouze na tuto dobu.

Důležité informace o výkonu a kvalitě

Volba režimu pose má vliv na vizuální kvalitu a výkon. Dodatečné náklady na dobu běhu na straně klienta za provedení dodatečného přeprojektování na Local pose mode zařízení HoloLens 2 se časově liší přibližně na 1 milisekundu. Tyto dodatečné náklady je potřeba vzít v úvahu, pokud se klientská aplikace již blíží rozpočtu rámce 16 milisekund. Na druhou stranu existují typy aplikací bez místního obsahu nebo místního obsahu, které nejsou náchylné k zkreslení artefaktů. V takových případech Local pose mode nezíská žádnou vizuální výhodu, protože kvalita reprojektu vzdáleného obsahu nemá vliv.

Obecným doporučením by tedy bylo otestovat režimy na základě případu použití a zjistit, jestli zisk ve vizuální kvalitě zdůvodňuje dodatečné režijní náklady na výkon. Režim je také možné dynamicky přepínat, například povolit místní režim pouze v případě, že se zobrazí důležitá uživatelská rozhraní.

Postup změny za Pose mode běhu

Ke změně režimu za běhu je možné použít následující klientské rozhraní API:

RenderingSession session = ...;
session.GraphicsBinding.SetPoseMode(PoseMode.Local); // set local pose mode
ApiHandle<RenderingSession> session = ...;
session->GetGraphicsBinding()->SetPoseMode(PoseMode::Local); // set local pose mode

Obecně platí, že režim lze změnit, kdykoli je objekt grafické vazby k dispozici. Existuje důležitý rozdíl pro GraphicsBindingSimD3D11: režim pozice lze změnit pouze na PoseMode.Remote, pokud byl inicializován s proxy texturami. Pokud tomu tak není, lze režim pozice přepínat pouze mezi PoseMode.Local a PoseMode.Passthrough až do opětovné inicializace grafické vazby. Prohlédněte si dvě přetížení GraphicsBindingSimD3d11.InitSimulation, které přebírají buď nativní ukazatele na ID3D11Texture2D objekty (cesta proxy) nebo width a height požadovaného zobrazení uživatele (cesta bez proxy serveru).

Důležité informace o modulu runtime Desktop Unity

Vzhledem k technickému pozadí GraphicsBindingSimD3D11 a skutečnosti, jak funguje vykreslování mimo obrazovku v Unity, modul runtime ARR Unity vyžaduje, aby uživatel při spuštění RemoteManagerUnity zadal požadovaný režim pozice:

public static void InitRemoteManager(Camera camera)
{
    RemoteUnityClientInit clientInit = new RemoteUnityClientInit(camera, PoseMode.Remote);
    RemoteManagerUnity.InitializeManager(clientInit);
}

Pokud PoseMode.Remote je zadána, grafická vazba se inicializuje s texturami proxy serveru mimo obrazovku a veškeré vykreslování se přesměruje z hlavní kamery scény Unity na proxy kameru. Tato cesta kódu se doporučuje pouze pro použití, pokud se vyžadují změny PoseMode.Remote režimu runtime. Pokud není zadán žádný režim pozice, modul runtime ARR Unity vybere v závislosti na aktuální platformě odpovídající výchozí nastavení.

Upozorňující

Přesměrování proxy kamery může být nekompatibilní s jinými rozšířeními Unity, které očekávají, že se vykreslování scény provede s hlavní kamerou. Proxy kameru je možné načíst prostřednictvím RemoteManagerUnity.ProxyCamera vlastnosti, pokud se musí dotazovat nebo zaregistrovat jinde. Konkrétně pro Cinemachine modul plug-in se podívejte na tuto položku řešení potíží: Modul plug-in Unity Cinemachine nefunguje v režimu vzdálené pozice.

Pokud PoseMode.Local se místo PoseMode.Passthrough toho použije grafická vazba, nebude inicializována s texturami proxy serveru mimo obrazovku a použije se rychlá cesta pomocí hlavní kamery scény Unity k vykreslení. Pokud příslušný případ použití vyžaduje režim vzdálené pozice za běhu, PoseMode.Remote je třeba při inicializaci zadat RemoteManagerUnity . Přímé vykreslování pomocí hlavní kamery Unity je efektivnější a může zabránit problémům s jinými rozšířeními Unity. Proto se doporučuje použít cestu vykreslování bez proxy serveru.

Další kroky