Najlepsze rozwiązania dotyczące aplikacji OpenXR

Przykład najlepszych rozwiązań można znaleźć w pliku OpenXRProgram.cpp basicXrApp. Funkcja Run() na początku przechwytuje typowy przepływ kodu aplikacji OpenXR z inicjowania do pętli renderowania i zdarzenia.

Najlepsze rozwiązania dotyczące jakości i stabilności wizualizacji

Najlepsze rozwiązania w tej sekcji opisują, jak uzyskać najlepszą jakość i stabilność wizualizacji w dowolnej aplikacji OpenXR.

Aby uzyskać dalsze zalecenia dotyczące wydajności specyficzne dla HoloLens 2, zobacz sekcję Najlepsze rozwiązania dotyczące wydajności w HoloLens 2 poniżej.

Renderowanie poprawne gamma

Należy zachować ostrożność, aby upewnić się, że potok renderowania jest poprawny w formacie gamma. Podczas renderowania do łańcucha wymiany format widoku render-target powinien być zgodny z formatem swapchain. Na przykład DXGI_FORMAT_B8G8R8A8_UNORM_SRGB dla formatu swapchain i widoku render-target. Istnieje wyjątek, jeśli potok renderowania aplikacji wykonuje ręczną konwersję SRGB w kodzie cieniowania. Aplikacja powinna zażądać formatu sRGB swapchain, ale użyj formatu liniowego dla widoku render-target. Na przykład żądanie DXGI_FORMAT_B8G8R8A8_UNORM_SRGB jako format swapchain, ale użyj DXGI_FORMAT_B8G8R8A8_UNORM go jako widoku render-target, aby zapobiec poprawianiu podwójnej gamma zawartości.

Przesyłanie bufora głębokości dla warstw projekcji

Zawsze używaj XR_KHR_composition_layer_depth rozszerzenia i przesyłaj bufor głębokości wraz z warstwą projekcji podczas przesyłania ramki do xrEndFrame. Włączenie ponownego projektu głębokości sprzętu na HoloLens 2 poprawia stabilność hologramu.

Wybierz rozsądny zakres głębokości

Preferuj węższy zakres głębokości, aby ograniczyć zakres zawartości wirtualnej, aby ułatwić stabilność hologramu na urządzeniu HoloLens. Na przykład próbka OpenXrProgram.cpp używa od 0,1 metra do 20 metrów. Aby uzyskać bardziej jednolitą rozdzielczość głębi, należy użyć odwróconego-Z . W przypadku HoloLens 2 użycie preferowanego DXGI_FORMAT_D16_UNORM formatu głębokości pomoże osiągnąć lepszą szybkość klatek i wydajność, chociaż bufory głębokości 16-bitowej zapewniają mniej rozdzielczości niż bufory głębokości 24-bitowej. Zastosowanie tych najlepszych rozwiązań w celu najlepszego wykorzystania rozdzielczości głębokości staje się ważniejsze.

Przygotowanie do różnych trybów mieszania środowiska

Jeśli aplikacja będzie również działać na immersywnych zestawach nagłownych, które całkowicie blokują świat, pamiętaj, aby wyliczyć obsługiwane tryby mieszania środowiska przy użyciu xrEnumerateEnvironmentBlendModes interfejsu API i prawidłowo przygotować zawartość renderowania. Na przykład w przypadku systemu z systemem, XR_ENVIRONMENT_BLEND_MODE_ADDITIVE takim jak HoloLens, aplikacja powinna używać przezroczystego koloru jako jasnego koloru, podczas gdy w przypadku systemu z XR_ENVIRONMENT_BLEND_MODE_OPAQUEprogramem aplikacja powinna renderować nieprzezroczysty kolor lub jakiś wirtualny pokój w tle.

Wybierz niezwiązaną przestrzeń referencyjną jako przestrzeń główną aplikacji

Aplikacje zazwyczaj ustanawiają przestrzeń współrzędnych świata głównego w celu łączenia widoków, akcji i hologramów. Użyj XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT polecenia , gdy rozszerzenie jest obsługiwane w celu ustanowienia systemu współrzędnych skali światowej, umożliwiając aplikacji uniknięcie niepożądanego dryfu hologramu, gdy użytkownik porusza się daleko (na przykład 5 metrów) od miejsca uruchamiania aplikacji. Użyj polecenia XR_REFERENCE_SPACE_TYPE_LOCAL jako rezerwowego, jeśli rozszerzenie niezwiązanego miejsca nie istnieje.

Kojarzenie hologramu z kotwicą przestrzenną

W przypadku korzystania z niezwiązanej przestrzeni referencyjnej hologramy umieszczane bezpośrednio w tej przestrzeni referencyjnej mogą dryfować, gdy użytkownik przechodzi do odległych pomieszczeń, a następnie wraca. W przypadku użytkowników hologramu umieść w dyskretnej lokalizacji na świecie , utwórz kotwicę przestrzenną przy użyciu xrCreateSpatialAnchorSpaceMSFT funkcji rozszerzenia i umieść hologram na jego początku. To sprawi, że hologram będzie niezależnie stabilny w czasie.

Obsługa przechwytywania rzeczywistości mieszanej

Mimo że podstawowy ekran HoloLens 2 używa mieszania środowiska addytywnego, gdy użytkownik rozpoczyna przechwytywanie rzeczywistości mieszanej, zawartość renderowania aplikacji zostanie połączona alfa ze strumieniem wideo środowiska. Aby uzyskać najlepszą jakość wizualizacji w filmach wideo przechwytywania rzeczywistości mieszanej, najlepiej jest ustawić XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT element w warstwie layerFlagsprojekcji .

Najlepsze rozwiązania dotyczące wydajności HoloLens 2

Jako urządzenie przenośne z obsługą ponownego projektu sprzętowego, HoloLens 2 ma bardziej rygorystyczne wymagania w celu uzyskania optymalnej wydajności. Istnieje wiele sposobów przesyłania danych kompozycji za pośrednictwem, co powoduje po przetworzeniu z zauważalną karą za wydajność.

Wybieranie formatu swapchain

Zawsze wyliczaj obsługiwane formaty pikseli przy użyciu polecenia xrEnumerateSwapchainFormats, a następnie wybieraj pierwszy format pikseli koloru i głębokości w środowisku uruchomieniowym obsługiwanym przez aplikację, ponieważ w ten sposób środowisko uruchomieniowe preferuje optymalną wydajność. Należy pamiętać, że w HoloLens 2 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB i DXGI_FORMAT_D16_UNORM jest to zazwyczaj pierwszy wybór, aby osiągnąć lepszą wydajność renderowania. Ta preferencja może być inna w przypadku zestawów słuchawkowych VR uruchomionych na komputerze stacjonarnym, gdzie bufory głębokości 24-bitowej mają mniejszy wpływ na wydajność.

Ostrzeżenie o wydajności: Użycie formatu innego niż podstawowy format koloru swapchain spowoduje po przetworzeniu w czasie wykonywania, co wiąże się ze znacznymi karami za wydajność.

Zawsze renderuj z zalecaną szerokością/wysokością widoku (recommendedImageRectWidth i recommendedImageRectHeight z XrViewConfigurationView), a zawsze używaj xrLocateViews interfejsu API do wykonywania zapytań dotyczących zalecanych parametrów widoku, FOV i innych parametrów renderowania przed renderowaniem. Zawsze używaj XrFrameEndInfo.predictedDisplayTime funkcji z najnowszego xrWaitFrame wywołania podczas wykonywania zapytań dotyczących pozy i widoków. Dzięki temu urządzenie HoloLens może dostosować renderowanie i zoptymalizować jakość wizualizacji dla osoby, która ma na sobie urządzenie HoloLens.

Używanie pojedynczej warstwy projekcji

HoloLens 2 ma ograniczoną moc procesora GPU do renderowania zawartości i sprzętowego kompositora zoptymalizowanego pod kątem pojedynczej warstwy projekcji. Zawsze używanie pojedynczej warstwy projekcji może pomóc aplikacji w korzystaniu ze stabilności ramek, stabilności hologramu i jakości wizualnej.

Ostrzeżenie o wydajności: Przesyłanie niczego oprócz pojedynczej warstwy ochrony spowoduje przetwarzanie końcowe w czasie wykonywania, co wiąże się ze znaczną karą za wydajność.

Renderowanie za pomocą tablicy tekstur i narzędzia VPRT

Utwórz jeden xrSwapchain dla lewego i prawego oka za pomocą polecenia arraySize=2 dla łańcucha wymiany kolorów, a drugi dla głębokości. Renderowanie lewego oka na plasterek 0 i prawe oko na plasterek 1. Użyj cieniowania z procesorem VPRT i wywołaniami rysowania dla renderowania stereoskopowego, aby zminimalizować obciążenie procesora GPU. Umożliwia to również optymalizację środowiska uruchomieniowego w celu uzyskania najlepszej wydajności na HoloLens 2. Alternatywy dla używania tablicy tekstury, takiej jak renderowanie o podwójnej szerokości lub oddzielny pęk wymiany na oko, spowoduje przetwarzanie końcowe w czasie wykonywania, co wiąże się ze znaczną karą wydajności.

Unikanie warstw czworokąta

Zamiast przesyłać warstwy czworokąta jako warstwy kompozycji za pomocą XrCompositionLayerQuadelementu , renderuj zawartość czworokąta bezpośrednio do łańcucha wymiany projekcji.

Ostrzeżenie o wydajności: Zapewnienie dodatkowych warstw poza pojedynczą warstwę projekcji, taką jak warstwy czworokątne, spowoduje po przetworzeniu środowiska uruchomieniowego, co wiąże się ze znaczną karą wydajności.