Procedure consigliate per le app OpenXROpenXR app best practices

È possibile vedere un esempio delle procedure consigliate riportate di seguito nel file OpenXRProgram. cpp di BasicXrApp.You can see an example of the best practices below in BasicXrApp's OpenXRProgram.cpp file. La funzione Run () all'inizio acquisisce un flusso di codice dell'app OpenXR tipico dall'inizializzazione all'evento e al ciclo di rendering.The Run() function at the beginning captures a typical OpenXR app code flow from initialization to the event and rendering loop.

Procedure consigliate per la qualità e la stabilità visiveBest practices for visual quality and stability

Le procedure consigliate in questa sezione descrivono come ottenere la qualità visiva e la stabilità migliori in qualsiasi applicazione OpenXR.The best practices in this section describe how to get the best visual quality and stability in any OpenXR application.

Per ulteriori raccomandazioni sulle prestazioni specifiche per HoloLens 2, vedere la sezione procedure consigliate per le prestazioni in HoloLens 2 .For further performance recommendations specific to HoloLens 2, see the Best practices for performance on HoloLens 2 section below.

Rendering con correzione gammaGamma-correct rendering

È necessario prestare attenzione per assicurarsi che la pipeline di rendering sia corretta da gamma.Care must be taken to ensure that your rendering pipeline is gamma-correct. Quando si esegue il rendering in un presentazione catena, il formato di visualizzazione della destinazione di rendering deve corrispondere al formato presentazione catena.When rendering to a swapchain, the render-target view format should match the swapchain format. Ad esempio, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB sia per il formato presentazione catena che per la visualizzazione di destinazione di rendering.For example, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB for both the swapchain format and the render-target view. Si verifica un'eccezione se la pipeline di rendering dell'app esegue una conversione di sRGB manuale nel codice dello shader.There's an exception if the app's rendering pipeline does a manual sRGB conversion in shader code. L'app deve richiedere un formato presentazione catena di sRGB, ma usare il formato lineare per la visualizzazione di destinazione di rendering.The app should request an sRGB swapchain format but use the linear format for the render-target view. Ad esempio, richiedere DXGI_FORMAT_B8G8R8A8_UNORM_SRGB come formato presentazione catena ma usare DXGI_FORMAT_B8G8R8A8_UNORM come visualizzazione di destinazione di rendering per impedire che il contenuto venga corretto a seconda della gamma.For example, request DXGI_FORMAT_B8G8R8A8_UNORM_SRGB as the swapchain format but use DXGI_FORMAT_B8G8R8A8_UNORM as the render-target view to prevent content from being double-gamma corrected.

Invia buffer di profondità per i livelli di proiezioneSubmit depth buffer for projection layers

Usare sempre XR_KHR_composition_layer_depth Extension e inviare il buffer di profondità insieme al livello di proiezione quando si invia un frame a xrEndFrame .Always use XR_KHR_composition_layer_depth extension and submit the depth buffer together with the projection layer when submitting a frame to xrEndFrame. L'abilitazione della riproiezione hardware depth in HoloLens 2 migliora la stabilità degli ologrammi.Enabling hardware depth reprojection on HoloLens 2 improves hologram stability.

Scegliere un intervallo di profondità ragionevoleChoose a reasonable depth range

Preferire un intervallo di profondità più ristretto per definire l'ambito del contenuto virtuale per aiutare la stabilità degli ologrammi in HoloLens.Prefer a narrower depth range to scope the virtual content to help hologram stability on HoloLens. Ad esempio, l'esempio OpenXrProgram. cpp USA 0,1 metri per 20 metri.For example, the OpenXrProgram.cpp sample is using 0.1 meters to 20 meters. Utilizzare invertito-Z per una risoluzione più uniforme della profondità.Use reversed-Z for a more uniform depth resolution. In HoloLens 2, l'uso del DXGI_FORMAT_D16_UNORM formato di profondità preferito consentirà di ottimizzare la frequenza dei fotogrammi e le prestazioni, sebbene i buffer di profondità a 16 bit forniscano una risoluzione inferiore ai buffer di profondità a 24 bit.On HoloLens 2, using the preferred DXGI_FORMAT_D16_UNORM depth format will help achieve better frame rate and performance, although 16-bit depth buffers provide less depth resolution than 24-bit depth buffers. Seguire queste procedure consigliate per sfruttare al meglio la risoluzione di profondità diventa più importante.Following these best practices to make best use of the depth resolution becomes more important.

Preparare le diverse modalità di Blend dell'ambientePrepare for different environment blend modes

Se l'applicazione verrà eseguita anche su auricolari immersivi che bloccano completamente il mondo, assicurarsi di enumerare le modalità di Blend dell'ambiente supportate usando l' xrEnumerateEnvironmentBlendModes API e preparare correttamente il contenuto di rendering.If your application will also run on immersive headsets that completely block out the world, be sure to enumerate supported environment blend modes using xrEnumerateEnvironmentBlendModes API, and prepare your rendering content correctly. Ad esempio, per un sistema con come XR_ENVIRONMENT_BLEND_MODE_ADDITIVE HoloLens, l'app deve usare trasparente come colore chiaro, mentre per un sistema con XR_ENVIRONMENT_BLEND_MODE_OPAQUE , l'app deve eseguire il rendering di un colore opaco o di una stanza virtuale in background.For example, for a system with XR_ENVIRONMENT_BLEND_MODE_ADDITIVE such as the HoloLens, the app should use transparent as the clear color, while for a system with XR_ENVIRONMENT_BLEND_MODE_OPAQUE, the app should render some opaque color or some virtual room in the background.

Scegliere lo spazio di riferimento senza limiti come spazio radice dell'applicazioneChoose unbounded reference space as application's root space

In genere, le applicazioni stabiliscono uno spazio delle coordinate del mondo radice per connettere viste, azioni e ologrammi.Applications typically establish some root world coordinate space to connect views, actions, and holograms together. Usare XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT quando l'estensione è supportata per stabilire un sistema di coordinate su scala globale, consentendo all'app di evitare la tendenza olografica indesiderata quando l'utente si sposta per la prima volta, ad esempio 5 metri di distanza, da dove viene avviata l'app.Use XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT when the extension is supported to establish a world-scale coordinate system, enabling your app to avoid undesired hologram drift when the user moves far (for example, 5 meters away) from where the app starts. Utilizzare XR_REFERENCE_SPACE_TYPE_LOCAL come fallback se l'estensione dello spazio non associato non esiste.Use XR_REFERENCE_SPACE_TYPE_LOCAL as a fallback if the unbounded space extension doesn't exist.

Associa ologramma a ancoraggio spazialeAssociate hologram with spatial anchor

Quando si usa uno spazio di riferimento non vincolato, gli ologrammi posizionati direttamente nello spazio di riferimento potrebbero andare alla deriva quando l'utente passa a una stanza lontana e quinditorna.When using an unbounded reference space, holograms you place directly in that reference space may drift as the user walks to distant rooms and then comes back. Per gli utenti olografici posizionati in una posizione discreta nel mondo, creare un ancoraggio spaziale usando la xrCreateSpatialAnchorSpaceMSFT funzione di estensione e posizionare l'ologramma all'origine.For hologram users place at a discrete location in the world, create a spatial anchor using the xrCreateSpatialAnchorSpaceMSFT extension function and position the hologram at its origin. In questo modo l'ologramma viene mantenuto indipendentemente stabile nel tempo.That will keep that hologram independently stable over time.

Supportare l'acquisizione di realtà mistaSupport mixed reality capture

Sebbene la visualizzazione principale di HoloLens 2 usi la fusione dell'ambiente additiva, quando l'utente avvia l' acquisizione della realtà mista, il contenuto di rendering dell'app verrà sottoposto ad Alpha blending con il flusso video dell'ambiente.Although HoloLens 2's primary display uses additive environment blending, when the user starts mixed reality capture, the app's rendering content will be alpha-blended with the environment video stream. Per ottenere la migliore qualità visiva nei video di acquisizione di realtà mista, è preferibile impostare nell'oggetto del XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT livello di proiezione layerFlags .To achieve the best visual quality in mixed reality capture videos, it's best to set the XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT in your projection layer's layerFlags.

Procedure consigliate per le prestazioni in HoloLens 2Best practices for performance on HoloLens 2

Come dispositivo mobile con supporto per la riproiezione dell'hardware, HoloLens 2 presenta requisiti più restrittivi per ottenere prestazioni ottimali.As a mobile device with hardware reprojection support, HoloLens 2 has stricter requirements for optimal performance. Esistono diversi modi per inviare i dati di composizione tramite, il che comporta un notevole calo delle prestazioni.There are a number of ways to submit composition data through, which results in post-processing with a noticeable performance penalty.

Selezionare un formato presentazione catenaSelect a swapchain format

Enumerare sempre i formati di pixel supportati usando xrEnumerateSwapchainFormats e scegliere il primo formato pixel di colore e profondità dal runtime supportato dall'app, perché questo è quello che il runtime preferisce per ottenere prestazioni ottimali.Always enumerate supported pixel formats using xrEnumerateSwapchainFormats, and choose the first color and depth pixel format from the runtime that the app supports, because that's what the runtime prefers for optimal performance. Si noti che, in HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB ed DXGI_FORMAT_D16_UNORM è in genere la prima scelta per ottenere prestazioni di rendering migliori.Note, on HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB and DXGI_FORMAT_D16_UNORM is typically the first choice to achieve better rendering performance. Questa preferenza può essere diversa negli auricolari VR in esecuzione su un PC desktop, in cui i buffer di profondità a 24 bit hanno un minore effetto sulle prestazioni.This preference can be different on VR headsets running on a Desktop PC, where 24-bit depth buffers have less of a performance impact.

Avviso di prestazioni: L'uso di un formato diverso dal formato di colore presentazione catena primario comporterà la post-elaborazione del runtime, che comporta una riduzione significativa delle prestazioni.Performance Warning: Using a format other than the primary swapchain color format will result in runtime post-processing, which comes at a significant performance penalty.

Eseguire sempre il rendering con la larghezza/altezza di configurazione della visualizzazione consigliata ( recommendedImageRectWidth e recommendedImageRectHeight da XrViewConfigurationView ) e usare sempre l' xrLocateViews API per eseguire una query per la visualizzazione, FOV e altri parametri di rendering consigliati prima del rendering.Always render with the recommended view configuration width/height (recommendedImageRectWidth and recommendedImageRectHeight from XrViewConfigurationView), and always use xrLocateViews API to query for the recommended view pose, FOV, and other rendering parameters before rendering. Usare sempre XrFrameEndInfo.predictedDisplayTime dalla chiamata più recente xrWaitFrame quando si eseguono query per pose e viste.Always use the XrFrameEndInfo.predictedDisplayTime from the latest xrWaitFrame call when querying for poses and views. Ciò consente a HoloLens di modificare il rendering e ottimizzare la qualità visiva per la persona che sta indossando la HoloLens.This allows HoloLens to adjust rendering and optimize visual quality for the person who is wearing the HoloLens.

Usa un solo livello di proiezioneUse a single projection layer

HoloLens 2 ha una potenza GPU limitata per il rendering del contenuto e un compositor hardware ottimizzato per un singolo livello di proiezione.HoloLens 2 has limited GPU power for rendering content and a hardware compositor optimized for a single projection layer. Usare sempre un solo livello di proiezione può aiutare a framerate, stabilità olografica e qualità visiva dell'applicazione.Always using a single projection layer can help the application's framerate, hologram stability and visual quality.

Avviso di prestazioni: L'invio di qualsiasi elemento, ma un solo livello di protezione, comporterà la post-elaborazione del runtime, che comporta una riduzione significativa delle prestazioni.Performance Warning: Submitting anything but a single protection layer will result in runtime post-processing, which comes at a significant performance penalty.

Rendering con matrice di trame e VPRTRender with texture array and VPRT

Crearne uno xrSwapchain per gli occhi sinistro e destro usando arraySize=2 per il colore presentazione catena e uno per la profondità.Create one xrSwapchain for both left and right eye using arraySize=2 for color swapchain, and one for depth. Eseguire il rendering dell'occhio sinistro nella sezione 0 e l'occhio destro nella sezione 1.Render the left eye into slice 0 and the right eye into slice 1. Usare uno shader con VPRT e le chiamate di progetto con istanza per il rendering stereoscopico per ridurre al minimo il carico della GPU.Use a shader with VPRT and instanced draw calls for stereoscopic rendering to minimize GPU load. Questo consente anche l'ottimizzazione del runtime per ottenere prestazioni ottimali in HoloLens 2.This also enables the runtime's optimization to achieve the best performance on HoloLens 2. Le alternative all'uso di una matrice di trame, ad esempio il rendering a doppio livello o un presentazione catena separato per occhio, comporteranno la post-elaborazione del runtime, che comporta una riduzione significativa delle prestazioni.Alternatives to using a texture array, such as double-wide rendering or a separate swapchain per eye, will result in runtime post-processing, which comes at a significant performance penalty.

Evitare i livelli quadAvoid quad layers

Anziché inviare livelli quad come livelli di composizione con XrCompositionLayerQuad , eseguire il rendering del contenuto Quad direttamente nella proiezione presentazione catena.Rather than submitting quad layers as composition layers with XrCompositionLayerQuad, render the quad content directly into the projection swapchain.

Avviso di prestazioni: Fornire livelli aggiuntivi oltre un singolo livello di proiezione, ad esempio i livelli quad, comporterà la post-elaborazione del runtime, che comporta una riduzione significativa delle prestazioni.Performance Warning: Providing additional layers beyond a single projection layer, such as quad layers, will result in runtime post-processing, which comes at a significant performance penalty.