Développement
Développement
Sélectionnez votre plateforme

Tableau de bord Oculus

Cette section présente Tableau de bord Oculus pour le SDK PC.
Tableau de bord Oculus rassemble tous les menus et toute l’UI de Rift dans un hub centralisé, instantanément accessible dans toute l’expérience VR. Tableau de bord s’exécute en superposition de votre expérience VR actuelle, ce qui vous permet de basculer d’une application à l’autre, d’ouvrir votre bibliothèque, de communiquer avec vos amis et même d’utiliser les autres applications de votre PC, rapidement et sans contraintes. Cela rend la VR plus intuitive et pratique, et vous permet de mener de front plusieurs tâches à la fois. Du jamais vu et un énorme plus pour tous les créateur·ices et équipes de développement qui font une utilisation professionnelle de la VR.
Vous trouverez des informations générales sur Tableau de bord en lisant notre annonce intitulée Introducing Rift Core 2.0—Our Biggest Software Update Yet! (Voici Rift Core 2.0, notre plus grande mise à jour logicielle à ce jour !). Vous pouvez également visionner la vidéo de présentation du Tableau de bord Oculus dans notre publication de blog Welcome to Rift Core 2.0 (Bienvenue dans Rift Core 2.0) pour avoir un aperçu de son fonctionnement.
Mettre en route Tableau de bord
Vous devez avant tout vérifier que votre ordinateur (fixe ou portable) possède la configuration requise pour vous offrir la meilleure expérience possible. Vous trouverez ci-dessous quelques conseils pour mieux vous préparer :
  • Windows 10 recommandé : Rift Core 2.0, système sous-jacent du Tableau de bord, repousse les limites informatiques de la VR. Les fonctions multitâches du Tableau de bord, l’épinglage de fenêtres et les fonctionnalités d’Oculus Desktop sont des tâches système gourmandes en ressources, que nous avons introduites tout en maintenant les niveaux de performances existants. Oculus Desktop requiert Windows 10. Sachez que vous pouvez toujours tirer parti des fonctionnalités principales de Rift Core 2.0 (notamment le menu du nouveau système Tableau de bord et Oculus Home) sur Windows 7 et Windows 8. Toutefois, vous ne pourrez pas utiliser certaines fonctionnalités telles que Oculus Desktop pour l’informatique virtuelle ni exécuter Tableau de bord en superposition de votre application VR en cours d’exécution.
  • Mettez à jour les pilotes de votre carte graphique : nous avons collaboré avec AMD et NVIDIA afin d’intégrer la prise en charge du Tableau de bord au niveau des pilotes. Vous aurez donc besoin des pilotes les plus récents de NVIDIA et AMD pour exécuter Tableau de bord. Cliquez ici pour en savoir plus sur nos exigences en matière de carte graphique.
  • Conception pensée pour la technologie tactile : nous avons repensé les fondements de l’expérience que confère le Rift autour d’une approche tactile native. Ainsi, vous bénéficierez d’une interface conviviale et intuitive dans laquelle vous disposerez d’une présence manuelle parfaitement opérationnelle. Si de nombreuses fonctionnalités restent compatibles avec la manette Xbox, certaines des nouvelles fonctionnalités, comme la personnalisation de votre Home, nécessitent les manettes Touch. En d’autres termes, vous devez utiliser les manettes Touch pour pouvoir tirer pleinement parti de toutes les fonctionnalités disponibles dans Rift Core 2.0.
Utiliser Tableau de bord
Nous vous recommandons d’ajouter la prise en charge de Tableau de bord à votre application pour offrir la meilleure expérience utilisateur·ice possible. L’expérience varie selon que votre application prend ou ne prend pas en charge Tableau de bord :
  • Si l’application prend en charge Tableau de bord, l’UI du menu Tableau de bord apparaît au-dessus de l’application lorsque celle-ci est mise en pause.
  • Dans le cas contraire, l’utilisateur·ice voit apparaître l’UI du menu Tableau de bord dans un salon vide lorsque l’application est mise en pause, comme le menu général dans les runtimes antérieurs d’Oculus.
Quand l’UI Tableau de bord est active, le runtime affiche les manettes suivies dans la scène pour permettre à l’utilisateur·ice d’interagir avec le menu. Votre application doit se mettre en pause, se mettre en sourdine et masquer les manettes suivies qu’elle affiche pour éviter que deux paires de mains apparaissent simultanément dans la scène.
Lorsque vous implémentez la prise en charge de Tableau de bord, vous devez tenir compte des trois points suivants :
  • Gestion de l’input focus
  • Prise en charge du tampon de profondeur
  • Déclaration de la détection de l’input focus dans une application
Gestion de l’input focus
Gestion du focus Oculus CAPI
Quand l’UI Tableau de bord est active, l’application en cours d’exécution perd l’input focus et le marqueur ovrSessionStatus::HasInputFocus renvoie False. Dans cet état, le runtime affiche les manettes suivies dans la scène pour permettre à l’utilisateur·ice d’interagir avec le menu.
Quand HasInputFocus est False, votre application doit mettre en pause toute activité, mettre en sourdine la lecture audio, masquer les éventuelles manettes suivies dans la scène pour éviter que deux paires de mains apparaissent simultanément, et masquer tous les objets en champ proche (situés à moins d’un mètre de l’utilisateur·ice, environ). En fonction de l’application, d’autres mesures peuvent être requises en cas de perte de l’input focus. Par exemple, au cours d’une partie dans un jeu de combat multijoueur, il peut être souhaitable d’indiquer que le joueur ou la joueuse n’est pas disponible et d’effectuer d’autres actions appropriées.
Le composeur de VR peut demander jusqu’à 3 ms de délai de rendu supplémentaires à chaque cycle d’image quand HasInputFocus est False. C’est pourquoi il est judicieux de basculer votre application dans un mode à faibles performances, si possible, tant que HasInputFocusis est False. Vous pouvez annuler cette action dès que HasInputFocus redevient True. Cette stratégie n’est pas obligatoire et les exigences de performances VRC ne sont pas imposées pendant la durée d’activation de l’UI Tableau de bord.
Notez que HasInputFocus renvoie False dans toutes les autres situations impliquant la perte de l’input focus par l’application, notamment quand le casque est retiré de la tête.
Vous pouvez vérifier le marqueur HasInputFocus avec le code suivant :
ovrSessionStatus sessionStatus = {};
ovr_GetSessionStatus(Session, &sessionStatus);
if (!sessionStatus.HasInputFocus) {/*Handle situation where your app has lost input focus*/}
Ce code doit être exécuté une fois à chaque cycle de rendu d’image.
Gestion du focus dans OpenXR
Quand l’UI Tableau de bord est active, l’application en cours d’exécution perd l’input focus et l’état de la session passe de XR_SESSION_STATE_FOCUSED à XR_SESSION_STATE_VISIBLE. Dans cet état, le runtime affiche les manettes suivies dans la scène pour permettre à l’utilisateur·ice d’interagir avec le menu. Notez que l’état XR_SESSION_STATE_FOCUSED implique également l’état visible.
Quand l’état de la session passe de XR_SESSION_STATE_FOCUSED à XR_SESSION_STATE_VISIBLE, votre application doit mettre en pause toute activité, mettre en sourdine la lecture audio, masquer les éventuelles manettes suivies dans la scène pour éviter que deux paires de mains apparaissent simultanément, et masquer tous les objets en champ proche (situés à moins d’un mètre de l’utilisateur·ice, environ). En fonction de l’application, d’autres mesures peuvent être requises en cas de perte de l’input focus. Par exemple, au cours d’une partie dans un jeu de combat multijoueur, il peut être souhaitable d’indiquer que le joueur ou la joueuse n’est pas disponible et d’effectuer d’autres actions appropriées.
Le composeur de VR peut demander jusqu’à 3 ms de délai de rendu supplémentaires à chaque cycle d’image quand Tableau de bord est visible. C’est pourquoi il est judicieux de basculer votre application dans un mode à faibles performances, si possible, tant qu’elle ne récupère pas le focus. Vous pouvez annuler cette action dès que la valeur XR_SESSION_STATE_VISIBLE est renvoyée. Cette stratégie n’est pas obligatoire et les exigences de performances VRC ne sont pas imposées pendant la durée d’activation de l’UI Tableau de bord.
Notez que l’input focus sera perdu dans toutes les autres situations impliquant la perte de l’input focus par l’application, notamment quand le casque est retiré de la tête.
Les changements d’état de la session sont identifiés par le code suivant :
do {
    XrEventDataBuffer event{XR_TYPE_EVENT_DATA_BUFFER};
    XrResult result = xrPollEvent(instance, &event);

    if (result == XR_SUCCESS) {
        switch (event.type) {
            case XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED: {
                const XrEventDataSessionStateChanged& sessionStateChanged =
                    *reinterpret_cast<XrEventDataSessionStateChanged*>(&event);

                switch(sessionStateChanged.state){
                    case XR_SESSION_STATE_FOCUSED:
                        // Application is now focused (and visible)...
                        break;

                    case XR_SESSION_STATE_VISIBLE:
                        // Application is now merely visible and not focused...
                        break;

                    ...
                }

                break;
            }
        }
    }
} while(result == XR_SUCCESS)
xrPollEvent doit être appelée de façon répétée à chaque cycle d’image comme précédemment jusqu’à ce qu’il n’y ait plus de messages.
Prise en charge du tampon de profondeur
Prise en charge du tampon de profondeur CAPI
Si votre rendu comprend de nombreuses géométries proches de l’utilisateur·ice, la présence d’un panneau Tableau de bord devant une géométrie censée être plus proche de l’utilisateur·ice que le panneau lui-même peut provoquer un inconfort visuel. Pour éviter cela, vous pouvez définir une profondeur à l’aide de vos eye buffers. Tableau de bord pourra ainsi dessiner un effet de rayons X afin de prévenir cet inconfort. C’est pourquoi nous vous recommandons, en prévision de futures améliorations, d’envoyer des données de profondeur avec vos eye buffers. Si toutefois vous n’étiez pas en mesure de le faire, il est toujours préférable de prendre en charge Tableau de bord (et d’accepter que cet inconfort existe) plutôt que de ne pas prendre Tableau de bord en charge.
Pour envoyer des données de profondeur, utilisez ovrLayerType_EyeFovDepth comme indiqué dans l’exemple de code ci-dessous. Ce code est dérivé de l’exemple de code OculusRoomTiny DX11 (situé dans le répertoire {sdk_folder}\OculusSDK\Samples\OculusRoomTiny\OculusRoomTiny (DX11)\Projects\Windows\VS2015) :
// Initialize our single full screen Fov layer.
ovrLayerEyeFovDepth ld = {};
ld.Header.Type = ovrLayerType_EyeFovDepth;
ld.Header.Flags = 0;

for (int eye = 0; eye < 2; ++eye)
{
    ld.ColorTexture[eye] = pEyeRenderTexture[eye]->TextureChain;
    ld.DepthTexture[eye] = pEyeRenderTexture[eye]->DepthTextureChain;
    ld.Viewport[eye] = eyeRenderViewport[eye];
    ld.Fov[eye] = hmdDesc.DefaultEyeFov[eye];
    ld.RenderPose[eye] = EyeRenderPose[eye];
    ld.SensorSampleTime = sensorSampleTime;
    ld.ProjectionDesc = posTimewarpProjectionDesc[eye];
}

ovrLayerHeader* layers = &ld.Header;
result = ovr_SubmitFrame(session, frameIndex, nullptr, &layers, 1);
// exit the rendering loop if submit returns an error, will retry on ovrError_DisplayLost
if (!OVR_SUCCESS(result))
    goto Done;

frameIndex++;
Prise en charge du tampon de profondeur OpenXR
Pour permettre l’envoi de données de profondeur, activez l’extension XR_KHR_composition_layer_depth. Pour envoyer les données de profondeur, ajoutez une instance de XrCompositionLayerDepthInfoKHR à la chaîne suivante pour chaque structure XrCompositionLayerProjectionView envoyée à xrEndFrame. Les tampons de profondeur sont créés par xrCreateSwapchain de la même manière que les tampons de couleur.
Exemple d’utilisation :
    XrFrameEndInfo frameEndInfo = ...;
    XrCompositionLayerProjectionView compositionLayerProjection = ...;

    XrCompositionLayerDepthInfoKHR depthInfoLayer{XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR};

    depthInfoLayer.subImage.swapchain = depthSwapChain;
    depthInfoLayer.subImage.imageArrayIndex = 0;
    depthInfoLayer.subImage.imageRect = {0, 0, depthSwapChainWidth, depthSwapChainHeight};
    depthInfoLayer.minDepth = 0.0;
    depthInfoLayer.maxDepth = 1.0;
    depthInfoLayer.nearZ = cameraNearZ;
    depthInfoLayer.farZ = camearFarZ;

    compositionLayerProjection.next = &depthInfoLayer;

    const XrCompositionLayerBaseHeader* headerPtrArray[1] = {
        reinterpret_cast<const XrCompositionLayerBaseHeader*>(&compositionLayerProjection)};
    frameEndInfo.layerCount = 1;
    frameEndInfo.layers = headerPtrArray;

    XrResult result = xrEndFrame(session.GetSession(), &frameEndInfo);
    ...
Déclaration de la détection de l’input focus dans une application basée sur CAPI
Votre application basée sur CAPI doit indiquer si elle est ou non en mesure de répondre aux états de focus ovrSessionStatus, y compris HasInputFocus. Si votre application est en mesure de gérer la perte de focus, comme décrit dans la section Gestion de l’input focus ci-dessus, définissez le marqueur ovrInit_FocusAware sur True. Sinon, définissez le marqueur ovrInit_FocusAware sur False.
Les applications basées sur OpenXR sont nativement capables de détecter l’input focus et n’ont pas besoin d’un traitement spécial.
Déclaration de la détection de l’input focus dans une application
Votre application doit indiquer si elle est ou non en mesure de répondre aux états de focus ovrSessionStatus, y compris HasInputFocus. Si votre application est en mesure de gérer la perte de focus, comme décrit dans la section Gestion de l’input focus ci-dessus, définissez le marqueur ovrInit_FocusAware sur True. Sinon, définissez le marqueur ovrInit_FocusAware sur False.
L’exemple de code suivant montre comment définir ovrInit_FocusAware. Ce code est dérivé de l’exemple de code OculusRoomTiny DX11 (situé dans le répertoire {sdk_folder}\OculusSDK\Samples\OculusRoomTiny\OculusRoomTiny (DX11)\Projects\Windows\VS2015) :
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    // Initializes LibOVR and the Rift
       ovrInitParams initParams = { ovrInit_RequestVersion | ovrInit_FocusAware, OVR_MINOR_VERSION, NULL, 0, 0 };
       ovrResult result = ovr_Initialize(&initParams);
    VALIDATE(OVR_SUCCESS(result), "Failed to initialize libOVR.");

    VALIDATE(DIRECTX.InitWindow(hinst, L"Oculus Room Tiny (DX11)"), "Failed to open window.");

    DIRECTX.Run(MainLoop);

    ovr_Shutdown();
    return(0);
}
Logo nav.
Français (France)
©2026 Meta