Sdílet prostřednictvím


Stabilizace hologramu – MRTK2

Výkon

Aby základní platforma hybridní reality a zařízení mohly dosahovat nejlepších výsledků, je důležité dosáhnout frekvence snímků. Cílová snímková rychlost (např. 60 FPS nebo 90 FPS) se bude v různých platformách a zařízeních lišit. Aplikace hybridní reality však budou mít snímkovou rychlost schůzek stabilní hologramy a efektivní sledování hlavy, sledování rukou a další.

Sledování prostředí

Stabilní holografické vykreslování silně spoléhá na sledování hlavy platformy a zařízení. Unity vykreslí scénu každý snímek z fotoaparátu, který odhadne a poskytne podkladová platforma. Pokud toto sledování neodpovídá skutečnému pohybu hlavy, zobrazí se hologramy vizuálně nepřesné. To je zvlášť zřejmé a důležité pro zařízení ar, jako je HoloLens, kde uživatelé můžou propojit virtuální hologramy s reálným světem. Výkon je významný pro spolehlivé sledování hlavy, ale může existovat i další důležité funkce. Typy prvků prostředí, které ovlivňují uživatelské prostředí, budou záviset na konkrétních specifikách cílové platformy.

Windows Mixed Reality

Platforma Windows Mixed Reality poskytuje určitý referenční materiál pro stabilizaci hologramů na platformě. Existuje ale několik klíčových nástrojů, které můžou vývojáři využít ke zlepšení vizuálního prostředí hologramu pro uživatele.

Sdílení vyrovnávací paměti hloubky

Vývojáři Unity mají možnost sdílet hloubkovou vyrovnávací paměť aplikace s platformou. Poskytuje informace o tom, kde existují hologramy pro aktuální rámec, které platforma může využít ke stabilizaci hologramů prostřednictvím hardwarově asistovaného procesu označovaného jako reprojektování v pozdní fázi.

Reprojektování v pozdní fázi

Na konci vykreslování snímku platforma Windows Mixed Reality vezme cíle vykreslení barev a hloubky vytvořené aplikací a transformuje konečný výstup obrazovky tak, aby zohlednil jakýkoli mírný pohyb hlavy od poslední predikce pozice hlavy. Spuštění herní smyčky aplikace nějakou dobu trvá. Například při 60 FPS to znamená, že aplikace přijímá ~16,667ms k vykreslení rámce. I když se to může zdát jako minimální doba, změní se pozice a orientace hlavy uživatele, což vede k novým maticím projekce kamery při vykreslování. Přeprojektování v pozdní fázi transformuje pixely v konečném obrázku tak, aby zohlednily tuto novou perspektivu.

Per-pixel vs. stabilizační rovina LSR

V závislosti na koncovém bodu zařízení a verzi operačního systému spuštěné na zařízení s Windows Mixed Reality se algoritmus reprojektování pozdní fáze provede buď na pixel, nebo prostřednictvím roviny stabilizace.

Hloubková hloubka na pixelech

Reprojektování založené na hloubkových pixelech zahrnuje použití vyrovnávací paměti hloubky k úpravě výstupu obrázku na pixel, a proto stabilizuje hologramy v různých vzdálenostech. Například koule 1 min. může být před pilířem, který je 10 m daleko. Pixely představující kouli budou mít jinou transformaci než vzdálené pixely představující pilíř, pokud uživatel naklonil hlavu mírně. Reprojektování na pixel bude brát v úvahu tento rozdíl vzdálenosti v každém pixelu pro přesnější reprojektování.

Stabilizační rovina

Pokud není možné vytvořit přesnou hloubkovou vyrovnávací paměť pro sdílení s platformou, jiná forma LSR využívá stabilizační rovinu. Všechny hologramy ve scéně obdrží určitou stabilizaci, ale hologramy v požadované rovině obdrží maximální stabilizaci hardwaru. Bod a normální pro rovinu lze poskytnout platformě prostřednictvím rozhraní API HolographicSettings.SetFocusPointForFrame, které poskytuje Unity.

Formát vyrovnávací paměti hloubky

Pokud cílíte na HoloLens pro vývoj, důrazně doporučujeme použít 16bitový formát vyrovnávací paměti v porovnání s 24bitovým formátem vyrovnávací paměti. To může ušetřit obrovskou úsporu výkonu, i když hloubkové hodnoty budou mít menší přesnost. Chcete-li kompenzovat nižší přesnost a vyhnout se boji proti z, doporučujeme snížit vzdálenost roviny klipů z výchozí hodnoty 1000 m nastavenou Unity.

Poznámka:

Pokud používáte 16bitový formát hloubky, požadované efekty vyrovnávací paměti vzorníku nebudou fungovat, protože Unity v tomto nastavení nevytvoří vyrovnávací paměť vzorníku. Výběr 24bitového formátu hloubky naopak obecně vytvoří 8bitovou vyrovnávací paměť vzorníku, pokud je k dispozici na grafické platformě koncového bodu.

Sdílení hloubkové vyrovnávací paměti v Unity

Aby bylo možné využít LSR založené na hloubkách, musí vývojáři provést dva důležité kroky.

  1. V části Upravit>nastavení přehrávače>nastavení>projektu XR Nastavení>sady VIRTUAL Reality SDK> povolit sdílení hloubkové vyrovnávací paměti
    1. Pokud cílíte na HoloLens, doporučujeme vybrat i 16bitový formát hloubky.
  2. Při vykreslování barev na obrazovce je také hloubka vykreslení

Neprůhlásné objekty GameObject v Unity obvykle zapisují do hloubky automaticky. Transparentní a textové objekty však ve výchozím nastavení nebudou zapisovat do hloubky. Pokud používáte standardní shader MRTK nebo Text Mesh Pro, můžete to snadno napravit.

Poznámka:

Chcete-li rychle zjistit, které objekty ve scéně nezapisují do hloubkové vyrovnávací paměti vizuálně, můžete použít nástroj Vyrovnávací paměť hloubky vykreslení v nastavení editoru v konfiguračním profilu MRTK.

Průhledný shader MRTK Standard

U průhledných materiálů pomocí standardního shaderu MRTK vyberte materiál, který chcete zobrazit v okně inspektoru. Potom kliknutím na tlačítko Opravit nyní převeďte materiál na hloubku zápisu (tj. Z-Write On).

Před

Vyrovnávací paměť hloubky před opravou standardního shaderu MRTK

Po

Vyrovnávací paměť hloubky pevná standardní shader MRTK

Text Mesh Pro

Pro objekty Text Mesh Pro vyberte objekt TMP GameObject a zobrazte ho v inspektoru. Pod komponentou materiálu přepněte shader přiřazeného materiálu tak, aby používal shader MRTK TextMeshPro.

Oprava hloubkové vyrovnávací paměti textové sítě pro

Vlastní shader

Pokud píšete vlastní shader, přidejte příznak ZWrite do horní části definice pass bloku a nakonfigurujte shader pro zápis do hloubkové vyrovnávací paměti.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Neprůzné pozadí

Pokud výše uvedené metody pro daný scénář nefungují (tj. pomocí uživatelského rozhraní Unity), je možné, aby do vyrovnávací paměti hloubky zapisovaly další objekty. Běžným příkladem je použití textu uživatelského rozhraní Unity na plovoucím panelu ve scéně. Tím, že nastavíte neprůhledný panel nebo alespoň zapíšete do hloubky, pak se text a panel stabilizují platformou, protože jejich hodnoty z jsou tak blízko sebe.

WorldAnchors (HoloLens)

Spolu s zajištěním splnění správných konfigurací pro zajištění vizuální stability je důležité zajistit, aby hologramy zůstaly stabilní ve správných fyzických umístěních. Pokud chtějí vývojáři informovat platformu na důležitých místech ve fyzickém prostoru, můžou využít WorldAnchors na GameObjects, které potřebují zůstat na jednom místě. A WorldAnchor je komponenta přidaná do Objektu GameObject, který přebírá absolutní kontrolu nad transformací daného objektu.

Zařízení, jako je HoloLens, neustále skenují a učí se o prostředí. Vzhledem k tomu, že HoloLens sleduje pohyb a pozici v prostoru, jeho odhady budou aktualizovány a souřadnicový systém Unity upraven. Pokud je například Objekt GameObject umístěn 1m od kamery na začátku, protože HoloLens sleduje prostředí, může si uvědomit fyzický bod, kde je objekt GameObject umístěn, je ve skutečnosti 1,1m daleko. To by vedlo k posunu hologramu. Použití WorldAnchoru na GameObject umožní ukotvení řídit transformaci objektu tak, aby objekt zůstal ve správném fyzickém umístění (tj. aktualizovat na 1,1 min místo 1 min za běhu). Pokud chtějí vývojáři zachovat worldAnchors napříč relacemi aplikací, můžou použít WorldAnchorStore k ukládání a načítání worldAnchors.

Poznámka:

Po přidání komponenty WorldAnchor do Objektu GameObject není možné změnit transformaci Objektu GameObject (tj. transform.position = x). Vývojář musí odebrat WorldAnchor k úpravě transformace.

WorldAnchor m_anchor;

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

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

Pokud chcete alternativu k ruční práci s Anchors, podívejte se na nástroje Microsoft World Locking Tools.

Viz také