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_OPAQUE
ska å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 xrEnumerateSwapchainFormats
och 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 med rekommenderade återgivningsparametrar och ramtidsinställningar
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 XrCompositionLayerQuad
renderar 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.