Dela via


Metodtips för OpenXR-appen

Du kan se ett exempel på metodtipsen nedan i Filen OpenXRProgram.cpp i BasicXrApp. Funktionen Run() i början samlar in ett typiskt OpenXR-appkodflöde från initiering till händelse- och renderingsloopen.

Metodtips för visuell kvalitet och stabilitet

Metodtipsen i det här avsnittet beskriver hur du får bästa möjliga visuella kvalitet och stabilitet i alla OpenXR-program.

Ytterligare prestandarekommendationer som är specifika för HoloLens 2 finns i avsnittet Metodtips för prestanda på HoloLens 2 nedan.

Gamma-korrekt återgivning

Se till att återgivningspipelinen är gammakorrigerad. Vid återgivning till en växlingskedja ska visningsformatet för återgivningsmål matcha växlingskedjans format. Till exempel DXGI_FORMAT_B8G8R8A8_UNORM_SRGB för både swapchain-formatet och vyn render-target. Det finns ett undantag om appens återgivningspipeline utför en manuell sRGB-konvertering i skuggningskod. Appen bör begära ett sRGB-växlingsformat men använda det linjära formatet för återgivningsmålvyn. Begär till exempel DXGI_FORMAT_B8G8R8A8_UNORM_SRGB som växlingsringsformat men använd DXGI_FORMAT_B8G8R8A8_UNORM som återgivningsmålvy för att förhindra att innehåll korrigeras med dubbel gamma.

Skicka djupbuffert för projektionsskikt

Använd XR_KHR_composition_layer_depth alltid tillägget och skicka djupbufferten tillsammans med projektionsskiktet när du skickar en ram till xrEndFrame. Om du aktiverar omprojektion av maskinvarudjup på HoloLens 2 förbättras hologramstabiliteten.

Välj ett rimligt djupintervall

Föredra ett smalare djupintervall för att begränsa det virtuella innehållet för att hjälpa hologramstabilitet på HoloLens. Till exempel använder Exemplet OpenXrProgram.cpp 0,1 meter till 20 meter. Använd reverse-Z för en mer enhetlig djupupplösning. På HoloLens 2 ger det önskade DXGI_FORMAT_D16_UNORM djupformatet bättre bildfrekvens och prestanda, även om 16-bitars djupbuffertar ger mindre djupupplösning än 24-bitars djupbuffertar. Att följa dessa metodtips för att använda djupupplösningen på bästa sätt blir viktigare.

Förbereda för olika miljöblandningslägen

Om programmet också körs på uppslukande headset som helt blockerar världen bör du räkna upp miljöblandningslägen som stöds med hjälp av xrEnumerateEnvironmentBlendModes API:et och förbereda renderingsinnehållet på rätt sätt. För ett system med XR_ENVIRONMENT_BLEND_MODE_ADDITIVE till exempel HoloLens bör appen till exempel använda transparent som klarfärg, medan appen för ett system med XR_ENVIRONMENT_BLEND_MODE_OPAQUEska återge en ogenomskinlig färg eller något virtuellt rum i bakgrunden.

Välj obundet referensutrymme som programmets rotutrymme

Program upprättar vanligtvis en del rotvärldskoordinatutrymme för att koppla ihop vyer, åtgärder och hologram. Använd XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT när tillägget stöds för att upprätta ett koordinatsystem i världsskala, vilket gör att appen kan undvika oönskad hologramavvikelse när användaren rör sig långt (till exempel 5 meter bort) från den plats där appen startar. Använd XR_REFERENCE_SPACE_TYPE_LOCAL som reserv om det obundna utrymmestillägget inte finns.

Associera hologram med spatial fästpunkt

När du använder ett obundet referensutrymme kan hologram som du placerar direkt i referensutrymmet glida när användaren går till avlägsna rum och sedan kommer tillbaka. För hologramanvändare som placerar på en diskret plats i världen skapar du ett rumsligt fästpunkt med hjälp av xrCreateSpatialAnchorSpaceMSFT tilläggsfunktionen och placerar hologrammet i dess ursprung. Det håller hologrammet oberoende stabilt över tid.

Stöd för insamling av mixad verklighet

Även om HoloLens 2 primära visning använder additiv miljöblandning, kommer appens renderingsinnehåll att alfablandas med miljövideoströmmen när användaren startar mixad verklighet. För att uppnå bästa visuella kvalitet i videoinspelningar med mixad verklighet är det bäst att ange XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT i projektionsskiktets layerFlags.

Metodtips för prestanda på HoloLens 2

Som en mobil enhet med stöd för maskinvaruåtergivning har HoloLens 2 strängare krav för optimala prestanda. Det finns ett antal sätt att skicka kompositionsdata genom, vilket resulterar i efterbearbetning med en märkbar prestandaavgift.

Välj ett swapchain-format

Räkna alltid upp pixelformat som stöds med hjälp av xrEnumerateSwapchainFormatsoch välj det första färg- och djuppunktsformatet från den körning som appen stöder, eftersom det är vad körningen föredrar för optimala prestanda. Observera, på HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB och DXGI_FORMAT_D16_UNORM är vanligtvis det första valet för att uppnå bättre renderingsprestanda. Den här inställningen kan skilja sig åt på VR-headset som körs på en stationär dator, där 24-bitars djupbuffertar har mindre prestandapåverkan.

Prestandavarning: Om du använder ett annat format än det primära swapchain-färgformatet resulterar det i körning efter bearbetning, vilket medför en betydande prestandapåföljd.

Rendera alltid med den rekommenderade vykonfigurationens bredd/höjd (recommendedImageRectWidth och recommendedImageRectHeight från XrViewConfigurationView) och använd xrLocateViews alltid API för att fråga efter den rekommenderade vyställningen, FOV och andra återgivningsparametrar före återgivning. Använd alltid från det senaste xrWaitFrame anropet XrFrameEndInfo.predictedDisplayTime när du frågar efter poser och vyer. På så sätt kan HoloLens justera återgivningen och optimera den visuella kvaliteten för den person som bär HoloLens.

Använda ett enda projektionslager

HoloLens 2 har begränsad GPU-kraft för rendering av innehåll och en maskinvarukompostitor som är optimerad för ett enda projektionslager. Att alltid använda ett enda projektionslager kan hjälpa programmets ramhastighet, hologramstabilitet och visuella kvalitet.

Prestandavarning: Om du skickar in allt annat än ett enda skyddslager resulterar det i körning efter bearbetning, vilket medför en betydande prestandaförstöring.

Rendera med strukturmatris och VPRT

Skapa en xrSwapchain för både vänster och höger öga med hjälp av arraySize=2 för färgväxlingskedja och en för djup. Rendera det vänstra ögat i sektor 0 och det högra ögat i sektor 1. Använd en skuggning med VPRT och instanserade anrop för stereoskopisk rendering för att minimera GPU-belastningen. Detta gör det också möjligt för körningsoptimeringen att uppnå bästa prestanda på HoloLens 2. Alternativ till att använda en strukturmatris, till exempel dubbelomfattande rendering eller en separat växlingskedja per öga, resulterar i körning efter bearbetning, vilket medför en betydande prestandapåföljd.

Undvik quad-skikt

I stället för att skicka quad-skikt som sammansättningslager med XrCompositionLayerQuadrenderar du quad-innehållet direkt i projektionsväxlingskedjan.

Prestandavarning: Om du tillhandahåller ytterligare lager utöver ett enda projektionslager, till exempel quad-lager, resulterar det i körning efter bearbetning, vilket medför en betydande prestandaförsedd.