Procedure consigliate per l'app OpenXR
È possibile visualizzare un esempio delle procedure consigliate riportate di seguito nel file OpenXRProgram.cpp di BasicXrApp. La funzione Run() all'inizio acquisisce un tipico flusso di codice dell'app OpenXR dall'inizializzazione al ciclo di eventi e rendering.
Procedure consigliate per la qualità e la stabilità degli oggetti visivi
Le procedure consigliate in questa sezione descrivono come ottenere la migliore qualità visiva e stabilità in qualsiasi applicazione OpenXR.
Per altre raccomandazioni sulle prestazioni specifiche per HoloLens 2, vedere la sezione Procedure consigliate per le prestazioni in HoloLens 2 di seguito.
Rendering con correzione gamma
È necessario prestare attenzione per assicurarsi che la pipeline di rendering sia corretta. Quando si esegue il rendering in una swapchain, il formato di visualizzazione di destinazione di rendering deve corrispondere al formato swapchain. Ad esempio, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
sia per il formato swapchain che per la visualizzazione di destinazione di rendering.
Esiste un'eccezione se la pipeline di rendering dell'app esegue una conversione manuale sRGB nel codice shader. L'app deve richiedere un formato di swapchain sRGB, ma usare il formato lineare per la visualizzazione di destinazione di rendering. Ad esempio, richiedere DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
come formato swapchain, ma usare DXGI_FORMAT_B8G8R8A8_UNORM
come visualizzazione di destinazione di rendering per impedire che il contenuto venga corretto a gamma doppia.
Inviare il buffer di profondità per i livelli di proiezione
Usare sempre l'estensione XR_KHR_composition_layer_depth
e inviare il buffer di profondità insieme al livello di proiezione quando si invia un frame a xrEndFrame
.
L'abilitazione della riprogettazione della profondità hardware in HoloLens 2 migliora la stabilità dell'ologramma.
Scegliere un intervallo di profondità ragionevole
Preferisce un intervallo di profondità più ristretto per definire l'ambito del contenuto virtuale per facilitare la stabilità dell'ologramma in HoloLens.
Ad esempio, l'esempio OpenXrProgram.cpp usa da 0,1 metri a 20 metri.
Usare invertito-Z per una risoluzione di profondità più uniforme.
In HoloLens 2, l'uso del formato di profondità preferito DXGI_FORMAT_D16_UNORM
consente di ottenere prestazioni e velocità dei fotogrammi migliori, anche se i buffer di profondità a 16 bit offrono una risoluzione di profondità inferiore ai buffer di profondità a 24 bit.
Seguire queste procedure consigliate per usare al meglio la risoluzione della profondità diventa più importante.
Preparare le diverse modalità di fusione dell'ambiente
Se l'applicazione verrà eseguita anche su visori VR immersive che bloccano completamente il mondo, assicurarsi di enumerare le modalità di fusione dell'ambiente supportate usando l'API xrEnumerateEnvironmentBlendModes
e preparare correttamente il contenuto di rendering.
Ad esempio, per un sistema con XR_ENVIRONMENT_BLEND_MODE_ADDITIVE
come HoloLens, l'app deve usare trasparente come colore chiaro, mentre per un sistema con XR_ENVIRONMENT_BLEND_MODE_OPAQUE
, l'app dovrebbe eseguire il rendering di un colore opaco o di una stanza virtuale in background.
Scegliere lo spazio di riferimento non associato come spazio radice dell'applicazione
Le applicazioni stabiliscono in genere uno spazio di coordinate del mondo radice per connettere visualizzazioni, azioni e ologrammi.
Usa XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT
quando l'estensione è supportata per stabilire un sistema di coordinate su scala globale, consentendo all'app di evitare deviazioni indesiderate dell'ologramma quando l'utente si sposta lontano (ad esempio, 5 metri di distanza) da dove viene avviata l'app.
Usare XR_REFERENCE_SPACE_TYPE_LOCAL
come fallback se l'estensione dello spazio non associato non esiste.
Associare l'ologramma all'ancoraggio nello spazio
Quando si usa uno spazio di riferimento non associato, gli ologrammi posizionati direttamente in tale spazio di riferimento possono derivare mentre l'utente passa a stanze distanti e quindi torna indietro.
Per gli utenti dell'ologramma posizionati in una posizione discreta nel mondo, creare un ancoraggio spaziale usando la xrCreateSpatialAnchorSpaceMSFT
funzione di estensione e posizionare l'ologramma all'origine. Questo ologramma manterrà l'ologramma indipendentemente stabile nel tempo.
Supportare l'acquisizione di realtà mista
Anche se la visualizzazione principale di HoloLens 2 usa la fusione dell'ambiente aggiuntivo, quando l'utente avvia l'acquisizione della realtà mista, il contenuto di rendering dell'app verrà combinato con il flusso video dell'ambiente.
Per ottenere la migliore qualità visiva nei video di acquisizione in realtà mista, è consigliabile impostare nel XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT
livello di layerFlags
proiezione .
Procedure consigliate per le prestazioni in HoloLens 2
Come dispositivo mobile con supporto per la riprogettazione hardware, HoloLens 2 ha requisiti più rigorosi per ottenere prestazioni ottimali. Esistono diversi modi per inviare i dati di composizione, il che comporta una post-elaborazione con una notevole riduzione delle prestazioni.
Selezionare un formato di swapchain
Enumera sempre i formati pixel supportati usando xrEnumerateSwapchainFormats
e scegli il primo formato di pixel di colore e profondità dal runtime supportato dall'app, perché questo è ciò che il runtime preferisce per prestazioni ottimali. 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. Questa preferenza può essere diversa nei visori VR in esecuzione in un PC desktop, in cui i buffer di profondità a 24 bit hanno un impatto minore sulle prestazioni.
Avviso di prestazioni: L'uso di un formato diverso dal formato di colore della porta di scambio principale comporterà una post-elaborazione in fase di esecuzione, che comporta una significativa riduzione delle prestazioni.
Eseguire il rendering con parametri di rendering consigliati e intervallo dei fotogrammi
Eseguire sempre il rendering con la larghezza/altezza della visualizzazione consigliata (recommendedImageRectWidth
e recommendedImageRectHeight
da XrViewConfigurationView
) e usare sempre l'API xrLocateViews
per eseguire query per la posizione di visualizzazione consigliata, foV e altri parametri di rendering prima del rendering.
Usare sempre dalla XrFrameEndInfo.predictedDisplayTime
chiamata più recente xrWaitFrame
quando si eseguono query per le posizioni e le visualizzazioni.
Ciò consente a HoloLens di regolare il rendering e ottimizzare la qualità visiva per la persona che indossa HoloLens.
Usare un singolo livello di proiezione
HoloLens 2 ha una potenza GPU limitata per il rendering del contenuto e un programma di composizione hardware ottimizzato per un singolo livello di proiezione. L'uso di un singolo livello di proiezione può aiutare la frequenza dei fotogrammi, la stabilità dell'ologramma e la qualità visiva dell'applicazione.
Avviso di prestazioni: L'invio di qualsiasi livello di protezione, ma un singolo livello di protezione, comporterà una post-elaborazione in fase di esecuzione, che comporta una significativa riduzione delle prestazioni.
Rendering con matrice di trame e VPRT
Crearne uno xrSwapchain
per l'occhio sinistro e destro usando arraySize=2
per la porta di scambio dei colori e uno per la profondità.
Eseguire il rendering dell'occhio sinistro nella sezione 0 e nell'occhio destro nella sezione 1.
Usare uno shader con VPRT e chiamate di disegno istanze per il rendering stereoscopico per ridurre al minimo il carico della GPU.
Ciò consente anche all'ottimizzazione del runtime di ottenere prestazioni ottimali in HoloLens 2.
Le alternative all'uso di una matrice di trame, ad esempio il rendering a doppio larghezza o una porta di scambio separata per occhio, comportano una post-elaborazione in fase di esecuzione, che comporta una significativa riduzione delle prestazioni.
Evitare livelli quad
Invece di inviare livelli quad come livelli di composizione con XrCompositionLayerQuad
, eseguire il rendering del contenuto quad direttamente nella swapchain di proiezione.
Avviso di prestazioni: La fornitura di livelli aggiuntivi oltre un singolo livello di proiezione, ad esempio i livelli quad, comporterà una post-elaborazione in fase di esecuzione, che comporta una significativa riduzione delle prestazioni.