Stabilisation d’hologrammeHologram stabilization

PerformancesPerformance

Pour que la plateforme et le périphérique de réalité mixte sous-jacents produisent les meilleurs résultats, il est important d’effectuer des fréquences d’images.In order for the underlying mixed reality platform and device to produce the best results, it is important to achieve performing frame rates. La fréquence d’images cible (par exemple : 60 FPS ou 90 FPS) varie selon les plateformes et les appareils.The target framerate (ex: 60 FPS or 90 FPS) will vary across platforms and devices. Toutefois, les applications de réalité mixte qui respectent la fréquence d’images comporteront des hologrammes stables, ainsi qu’un suivi efficace des têtes, le suivi des mains et bien plus encore.However, mixed reality applications meeting framerate will have stable holograms as well as efficient head tracking, hand tracking and more.

Suivi de l’environnementEnvironment tracking

Le rendu holographique stable s’appuie fortement sur le suivi des poses par la plateforme & appareil.Stable holographic rendering heavily relies on head-pose tracking by the platform & device. Unity restitue la scène chaque image de la caméra est estimée et fournie par la plateforme sous-jacente.Unity will render the scene every frame from the camera pose estimated and supplied by the underlying platform. Si ce suivi ne suit pas correctement le mouvement de la tête réelle, les hologrammes apparaîtront mal.If this tracking does not correctly follow actual head movement, then holograms will appear visually inaccurate. ceci est particulièrement évident et important pour les appareils AR comme les HoloLens où les utilisateurs peuvent associer des hologrammes virtuels au monde réel.This is especially evident and important for AR devices like HoloLens where users can relate virtual holograms to the real world. Les performances sont significatives pour le suivi de la tête fiable, mais il peut également y avoir d' autres fonctionnalités importantes.Performance is significant for reliable head tracking, but there can be other important features, as well. Les types d’éléments d’environnement qui ont un impact sur l’expérience utilisateur dépendent des spécificités de la plateforme ciblée.The types of environment elements impacting user experience will depend on the targeted platform specifics.

Windows Mixed RealityWindows Mixed Reality

la plateforme Windows Mixed Reality fournit des documents de référence pour la stabilisation des hologrammes sur la plateforme.The Windows Mixed Reality platform provides some reference material for stabilizing holograms on the platform. Toutefois, il existe un certain nombre d’outils clés que les développeurs peuvent utiliser pour améliorer l’expérience visuelle des hologrammes pour les utilisateurs.There are a handful of key tools though that developers can utilize to improve the hologram visual experience for users.

Partage de mémoire tampon de profondeurDepth buffer sharing

Les développeurs Unity ont la possibilité de partager le tampon de profondeur de l’application avec la plateforme.Unity developers have the option of sharing the application's depth buffer with the platform. Cela fournit des informations, où des hologrammes existent pour un frame actuel, que la plateforme peut utiliser pour stabiliser des hologrammes via un processus d’assistance matérielle appelé reprojection Late-Stage.This provides information, where holograms exist for a current frame, that the platform can utilize to stabilize holograms via a hardware-assisted process known as Late-Stage Reprojection.

Reprojection à l’étape tardiveLate-stage reprojection

à la fin du rendu d’un frame, la plateforme Windows Mixed Reality prend les cibles de rendu de profondeur & de couleur générées par l’application et transforme la sortie finale de l’écran en compte pour tout déplacement de tête depuis la dernière prédiction de pose.At the end of rendering a frame, the Windows Mixed Reality platform takes the color & depth render targets produced by the application and transforms the final screen output to account for any slight head movement since the last head pose prediction. L’exécution de la boucle de jeu d’une application prend du temps.An application's game loop takes time to execute. Par exemple, à 60 FPS, cela signifie que l’application prend ~ 16.667 ms pour afficher un frame.For example, at 60 FPS, this means the application is taking ~16.667ms to render a frame. Même si cela peut sembler un rien de temps, la position et l’orientation de l’utilisateur changent en fonction de nouvelles matrices de projection pour l’appareil photo en cours de rendu.Even though this may seem like a miniscule amount of time, the user's position and orientation of their head will change resulting in new projection matrices for the camera in rendering. La reprojection en phase tardive transforme les pixels de l’image finale pour tenir compte de cette nouvelle perspective.Late-stage reprojection transforms the pixels in the final image to account for this new perspective.

Plan de stabilisation par pixel et LSRPer-pixel vs stabilization plane LSR

en fonction du point de terminaison de l’appareil et de la version du système d’exploitation exécuté sur un appareil Windows Mixed Reality, l’algorithme de reprojection Late-Stage sera effectué par pixel ou par le biais d’un plan de stabilisation.Depending on the device endpoint and OS version running on a Windows Mixed Reality device, the Late-Stage Reprojection algorithm will either be performed per-pixel or via a stabilization plane.

Basé sur la profondeur par pixelPer-pixel depth-based

La reprojection basée sur la profondeur par pixel implique l’utilisation de la mémoire tampon de profondeur pour modifier la sortie de l’image par pixel et ainsi stabiliser les hologrammes à différentes distances.Per-pixel depth-based reprojection involves utilizing the depth buffer to modify the image output per pixel and thus stabilize holograms at various distances. Par exemple, une sphère 1m peut être devant un pilier qui est en millions de mètres.For example, a sphere 1m away may be in front of a pillar that is 10m away. Les pixels représentant la sphère auront une transformation différente des pixels éloignés représentant le pilier si l’utilisateur a légèrement incliné son tête.The pixels representing the sphere will have a different transform than the far away pixels representing the pillar if the user has tilted their head slightly. La reprojection par pixel prendra en compte cette différence de distance à chaque pixel pour une reprojection plus précise.Per-pixel reprojection will take into account this distance difference at every pixel for more accurate reprojection.

Plan de stabilisationStabilization plane

S’il n’est pas possible de créer une mémoire tampon de profondeur exacte à partager avec la plateforme, une autre forme de LSR utilise un plan de stabilisation.If it is not possible to create an accurate depth buffer to share with the platform, another form of LSR utilizes a stabilization plane. Tous les hologrammes d’une scène recevront une certaine stabilisation, mais les hologrammes se trouvant dans le plan souhaité recevront la stabilisation matérielle maximale.All holograms in a scene will receive some stabilization, but holograms lying in the desired plane will receive the maximum hardware stabilization. Le point et la normale du plan peuvent être fournis à la plateforme via l’API HolographicSettings. SetFocusPointForFrame fournie par Unity.The point and normal for the plane can be supplied to the platform via the HolographicSettings.SetFocusPointForFrame API provided by Unity.

Format de mémoire tampon de profondeurDepth buffer format

si le ciblage HoloLens pour le développement, il est fortement recommandé d’utiliser le format de mémoire tampon de profondeur de 16 bits par rapport à 24 bits.If targeting HoloLens for development, it is highly recommended to utilize the 16-bit depth buffer format compared to 24-bit. Cela permet d’économiser énormément de performances, bien que les valeurs de profondeur présentent moins de précision.This can save tremendously on performance although depth values will have less precision. Pour compenser la précision inférieure et éviter la lutte z, il est recommandé de réduire le plan de découpage éloigné de la valeur par défaut de 1000MD définie par Unity.To compensate for the lower precision and avoid z-fighting, it is recommended to reduce the far clip plane from the 1000m default value set by Unity.

Notes

Si vous utilisez le format de profondeur 16 bits, les effets requis pour la mémoire tampon des stencils ne fonctionneront pas, car Unity ne crée pas de tampon de stencil dans ce paramètre.If using 16-bit depth format, stencil buffer required effects will not work because Unity does not create a stencil buffer in this setting. Si vous sélectionnez le format de profondeur 24 bits , vous créez généralement une mémoire tampon de stencil de 8 bits, le cas échéant sur la plateforme graphique de point de terminaison.Selecting 24-bit depth format conversely will generally create an 8-bit stencil buffer, if applicable on the endpoint graphics platform.

Partage de mémoire tampon de profondeur dans UnityDepth buffer sharing in Unity

Pour pouvoir utiliser des LSR à base de profondeur, les développeurs doivent effectuer deux étapes importantes.In order to utilize depth-based LSR, there are two important steps that developers need to take.

  1. sous modifier > Project Paramètres > Player > XR Paramètres kits de développement logiciel ( > sdk) Virtual realisation > activer le partage de mémoire tampon de profondeurUnder Edit > Project Settings > Player > XR Settings > Virtual Reality SDKs > Enable Depth Buffer Sharing
    1. si vous ciblez HoloLens, il est recommandé de sélectionner également le format de profondeur 16 bits .If targeting HoloLens, it is recommended to select 16-bit depth format as well.
  2. Lors du rendu de couleur à l’écran, afficher la profondeur égalementWhen rendering color on screen, render depth as well

Les GameObjects opaques dans Unity sont généralement écrits automatiquement en profondeur.Opaque GameObjects in Unity will generally write to depth automatically. Toutefois, les objets de texte transparent & n’écrivent généralement pas en profondeur par défaut.However, transparent & text objects will generally not write to depth by default. en cas d’utilisation du nuanceur Standard MRTK ou de la Pro maille de texte, cela peut être facilement résolu.If utilizing the MRTK Standard Shader or Text Mesh Pro, this can be easily remedied.

Notes

pour déterminer rapidement quels objets d’une scène n’écrivent pas dans le tampon de profondeur visuellement, vous pouvez utiliser l’utilitaire de tampon de profondeur de rendu sous l' éditeur Paramètres dans le profil de Configuration MRTK.To quickly determine which objects in a scene do not write to the depth buffer visually, one can use the Render Depth Buffer utility under the Editor Settings in the MRTK Configuration profile.

Nuanceur transparent MRTK standardTransparent MRTK Standard shader

Pour les matériaux transparents à l’aide du nuanceur standard MRTK, sélectionnez le matériau pour l’afficher dans la fenêtre de l' inspecteur .For transparent materials using the MRTK Standard shader, select the material to view it in the Inspector window. Cliquez ensuite sur le bouton corriger maintenant pour convertir la matière en écriture en profondeur (c.-à-d.Then click the Fix Now button to convert the material to write to depth (i.e Z-écrire sur).Z-Write On).

AvantBefore

Mémoire tampon de profondeur avant correction du nuanceur standard MRTK

AprèsAfter

Nuanceur standard MRTK fixe du tampon de profondeur

Maille de texte ProText Mesh Pro

pour Pro objets de maillage de texte, sélectionnez le GameObject TMP pour l’afficher dans l’inspecteur.For Text Mesh Pro objects, select the TMP GameObject to view it in the inspector. Sous le composant matériau, faites basculer le nuanceur pour la documentation affectée afin d’utiliser le nuanceur MRTK TextMeshPro.Under the material component, switch the shader for the assigned material to use the MRTK TextMeshPro shader.

correction du tampon de la profondeur du maillage de texte Pro

Nuanceur personnaliséCustom shader

Si vous écrivez un nuanceur personnalisé, ajoutez l' indicateur ZWrite au début de la définition du bloc de passe pour configurer le nuanceur à écrire dans la mémoire tampon de profondeur.If writing a custom shader, add the ZWrite flag to the top of the Pass block definition to configure the shader to write to the depth buffer.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Enstockages opaquesOpaque backings

Si les méthodes ci-dessus ne fonctionnent pas pour un scénario donné (par exemple,If the above methods do not work for a given scenario (i.e à l’aide de l’interface utilisateur Unity), il est possible d’écrire un autre objet dans le tampon de profondeur.using Unity UI), it is possible to have another object write to the depth buffer. Un exemple courant consiste à utiliser le texte de l’interface utilisateur Unity sur un panneau flottant dans une scène.A common example is using Unity UI Text on a floating panel in a scene. En rendant le panneau opaque ou au moins écrit en profondeur, le texte & le panneau sera stabilisé par la plateforme, car leurs valeurs z sont tellement proches les unes des autres.By making the panel opaque or at least writing to depth, then both the text & the panel will be stabilized by the platform since their z-values are so close to each other.

WorldAnchors (HoloLens)WorldAnchors (HoloLens)

En plus de vous assurer que les configurations correctes sont respectées pour garantir la stabilité visuelle, il est important de s’assurer que les hologrammes restent stables à leurs emplacements physiques corrects.Along with ensuring the correct configurations are met to ensure visual stability, it is important to ensure holograms remain stable at their correct physical locations. Pour informer la plateforme des emplacements importants dans un espace physique, les développeurs peuvent tirer parti de WorldAnchors sur GameObjects qui doivent rester dans un même emplacement.To inform the platform on important locations in a physical space, developers can leverage WorldAnchors on GameObjects that need to stay in one place. Un WorldAnchor est un composant ajouté à un gameobject qui prend un contrôle absolu sur la transformation de cet objet.A WorldAnchor is a component added to a GameObject that takes absolute control over that object's transform.

les appareils tels que les HoloLensnt constamment analyser et apprendre à propos de l’environnement.Devices such as HoloLens are constantly scanning and learning about the environment. ainsi, à mesure que le HoloLens effectue le suivi du mouvement & position dans l’espace, ses estimations sont mises à jour et le système de coordonnées unity est ajusté.Thus, as the HoloLens tracks movement & position in space, its estimates will be updated and the Unity coordinate system adjusted. par exemple, si un GameObject est placé 1m à partir de l’appareil photo au démarrage, étant donné que le HoloLens effectue le suivi de l’environnement, il peut réaliser le point physique où se trouve le GameObject est en fait 1.1 m.For example, if a GameObject is placed 1m from the camera at start, as the HoloLens tracks the environment, it may realize the physical point where the GameObject is located is actually 1.1m away. Cela entraînerait la dérive de l’hologramme.This would result in the hologram drifting. L’application d’un WorldAnchor à un GameObject permet à l’ancre de contrôler la transformation de l’objet afin que l’objet reste à l’emplacement physique correct (c.-à-d.Applying a WorldAnchor to a GameObject will enable the anchor to control the object's transform so that the object will remain at the correct physical location (i.e Mettez à jour vers la version 1.1 m à la place de 1m au moment de l’exécution).update to 1.1m away instead of 1m at runtime). Pour conserver les WorldAnchors entre les sessions d’application, les développeurs peuvent utiliser le WorldAnchorStore pour enregistrer et charger WorldAnchors.To persist WorldAnchors across app sessions, developers can employ the WorldAnchorStore to save and load WorldAnchors.

Notes

Une fois qu’un composant WorldAnchor a été ajouté à un GameObject, il n’est pas possible de modifier la transformation de ce GameObject (c.-à-d.Once a WorldAnchor component has been added to a GameObject, it is not possible to modify that GameObject's transform (i.e transformation. position = x).transform.position = x). Un développeur doit supprimer le WorldAnchor pour modifier la transformation.A developer must remove the WorldAnchor to edit the transform.

WorldAnchor m_anchor;

public void AddAnchor()
{
    this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}

public void RemoveAnchor()
{
    DestroyImmediate(m_anchor);
}

Si vous souhaitez une alternative à l’utilisation manuelle des ancres, consultez les outils de verrouillage Microsoft World.If you want an alternative to manually working with Anchors, check out the Microsoft World Locking Tools.

Voir aussiSee also