Bonnes pratiques pour les applications OpenXR

Vous pouvez voir un exemple des meilleures pratiques ci-dessous dans le fichier OpenXRProgram.cpp de BasicXrApp. La fonction Run() au début capture un flux de code d’application OpenXR classique de l’initialisation à l’événement et à la boucle de rendu.

Meilleures pratiques pour la qualité et la stabilité visuelles

Les meilleures pratiques décrites dans cette section décrivent comment obtenir la meilleure qualité visuelle et la meilleure stabilité dans n’importe quelle application OpenXR.

Pour obtenir d’autres recommandations en matière de performances spécifiques à HoloLens 2, consultez la section Meilleures pratiques pour les performances sur HoloLens 2 ci-dessous.

Rendu gamma correct

Veillez à ce que votre pipeline de rendu soit correct. Lors du rendu vers une chaîne d’échange, le format d’affichage cible de rendu doit correspondre au format de la chaîne d’échange. Par exemple, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB pour le format de chaîne d’échange et la vue cible de rendu. Il existe une exception si le pipeline de rendu de l’application effectue une conversion sRVB manuelle dans le code du nuanceur. L’application doit demander un format de chaîne d’échange sRGB, mais utiliser le format linéaire pour la vue cible de rendu. Par exemple, demande DXGI_FORMAT_B8G8R8A8_UNORM_SRGB comme format de chaîne d’échange, mais utilisez DXGI_FORMAT_B8G8R8A8_UNORM comme vue de cible de rendu pour empêcher la correction du contenu double gamma.

Envoyer une mémoire tampon de profondeur pour les couches de projection

Utilisez toujours l’extension XR_KHR_composition_layer_depth et envoyez la mémoire tampon de profondeur avec la couche de projection lors de l’envoi d’un frame à xrEndFrame. L’activation de la reprojection de profondeur matérielle sur HoloLens 2 améliore la stabilité de l’hologramme.

Choisir une plage de profondeur raisonnable

Préférez une plage de profondeur plus étroite pour étendre le contenu virtuel afin d’améliorer la stabilité de l’hologramme sur HoloLens. Par exemple, l’exemple OpenXrProgram.cpp utilise 0,1 mètre à 20 mètres. Utilisez reversed-Z pour une résolution de profondeur plus uniforme. Sur HoloLens 2, l’utilisation du format de profondeur préféré DXGI_FORMAT_D16_UNORM permet d’obtenir une meilleure fréquence d’images et de meilleures performances, bien que les mémoires tampons de profondeur de 16 bits fournissent moins de résolution de profondeur que les mémoires tampons de profondeur de 24 bits. Il est plus important de suivre ces bonnes pratiques pour optimiser l’utilisation de la résolution de profondeur.

Préparer les différents modes de fusion d’environnement

Si votre application s’exécute également sur des casques immersifs qui bloquent complètement le monde, veillez à énumérer les modes de fusion d’environnement pris en charge à l’aide xrEnumerateEnvironmentBlendModes de l’API et à préparer votre contenu de rendu correctement. Par exemple, pour un système avec XR_ENVIRONMENT_BLEND_MODE_ADDITIVE tel que HoloLens, l’application doit utiliser transparent comme couleur claire, tandis que pour un système avec XR_ENVIRONMENT_BLEND_MODE_OPAQUE, l’application doit afficher une couleur opaque ou une salle virtuelle en arrière-plan.

Choisir un espace de référence illimité comme espace racine de l’application

Les applications établissent généralement un espace de coordonnées du monde racine pour connecter des vues, des actions et des hologrammes ensemble. Utilisez XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT lorsque l’extension est prise en charge pour établir un système de coordonnées à l’échelle mondiale, ce qui permet à votre application d’éviter la dérive d’hologrammes indésirables lorsque l’utilisateur se déplace loin (par exemple, à 5 mètres) de l’endroit où l’application démarre. Utilisez XR_REFERENCE_SPACE_TYPE_LOCAL comme secours si l’extension d’espace illimité n’existe pas.

Associer l’hologramme à l’ancre spatiale

Lors de l’utilisation d’un espace de référence illimité, les hologrammes que vous placez directement dans cet espace de référence peuvent dériver à mesure que l’utilisateur marche vers des salles distantes, puis revient. Pour les utilisateurs d’hologrammes placés à un emplacement discret dans le monde, créez une ancre spatiale à l’aide de la xrCreateSpatialAnchorSpaceMSFT fonction d’extension et positionnez l’hologramme à son origine. Cela maintient cet hologramme de façon indépendante au fil du temps.

Prise en charge de la capture de réalité mixte

Bien que l’affichage principal de HoloLens 2 utilise la fusion d’environnement additive, lorsque l’utilisateur démarre la capture de réalité mixte, le contenu de rendu de l’application est fusionné en alpha avec le flux vidéo de l’environnement. Pour obtenir la meilleure qualité visuelle dans les vidéos de capture de réalité mixte, il est préférable de définir dans la XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT couche de layerFlagsprojection de .

Meilleures pratiques en matière de performances sur HoloLens 2

En tant qu’appareil mobile avec prise en charge de la reprojection matérielle, HoloLens 2 a des exigences plus strictes pour des performances optimales. Il existe plusieurs façons de soumettre des données de composition via, ce qui entraîne un post-traitement avec une pénalité de performances notable.

Sélectionner un format de chaîne d’échange

Énumérez toujours les formats de pixels pris en charge à l’aide xrEnumerateSwapchainFormatsde , puis choisissez le premier format de pixel de couleur et de profondeur dans le runtime pris en charge par l’application, car c’est ce que le runtime préfère pour des performances optimales. Notez que, sur HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB et DXGI_FORMAT_D16_UNORM est généralement le premier choix pour obtenir de meilleures performances de rendu. Cette préférence peut être différente sur les casques VR exécutés sur un PC de bureau, où les mémoires tampons de profondeur 24 bits ont moins d’impact sur les performances.

Avertissement de performances : L’utilisation d’un format autre que le format de couleur de la chaîne d’échange principale entraîne un post-traitement de l’exécution, ce qui entraîne une baisse importante des performances.

Effectuez toujours le rendu avec la largeur/la hauteur de configuration de la vue recommandée (recommendedImageRectWidth et recommendedImageRectHeight à partir de XrViewConfigurationView), et utilisez toujours l’API xrLocateViews pour interroger la pose de vue recommandée, FOV et d’autres paramètres de rendu avant le rendu. Utilisez toujours le XrFrameEndInfo.predictedDisplayTime à partir de l’appel le plus récent xrWaitFrame lors de l’interrogation des poses et des vues. Cela permet à HoloLens d’ajuster le rendu et d’optimiser la qualité visuelle pour la personne qui porte l’HoloLens.

Utiliser une seule couche de projection

HoloLens 2 dispose d’une puissance GPU limitée pour le rendu du contenu et d’un compositeur matériel optimisé pour une seule couche de projection. Le fait de toujours utiliser une seule couche de projection peut améliorer la fréquence d’images, la stabilité de l’hologramme et la qualité visuelle de l’application.

Avertissement de performances : L’envoi d’une couche de protection autre qu’une seule couche de protection entraîne un post-traitement de l’exécution, ce qui entraîne une pénalité importante en termes de performances.

Rendu avec tableau de textures et VPRT

Créez-en un xrSwapchain pour l’œil gauche et l’œil droit à l’aide arraySize=2 de pour l’échange de couleurs, et un autre pour la profondeur. Restituer l’œil gauche en tranche 0 et l’œil droit en tranche 1. Utilisez un nuanceur avec VPRT et des appels de dessin d’instance pour le rendu stéréoscopique afin de réduire la charge gpu. Cela permet également à l’optimisation du runtime d’obtenir les meilleures performances sur HoloLens 2. Les alternatives à l’utilisation d’un tableau de textures, telles que le rendu double-large ou une chaîne d’échange distincte par œil, entraînent un post-traitement de l’exécution, ce qui entraîne une perte de performances importante.

Éviter les quatre couches

Au lieu de soumettre des couches de quatre couches en tant que couches de composition avec XrCompositionLayerQuad, restituez le contenu quad directement dans la chaîne d’échange de projection.

Avertissement de performances : La fourniture de couches supplémentaires au-delà d’une seule couche de projection, telles que les quatre couches, entraîne un post-traitement de l’exécution, ce qui entraîne une pénalité importante en termes de performances.