In diesem Abschnitt wird Oculus Dash für das PC-SDK vorgestellt.
Oculus Dash vereint alle Menüs und Benutzeroberflächen von Rift an einer zentralen Stelle, die sofort von überall im VR-Erlebnis zugänglich ist. Dash wird als Overlay innerhalb deines aktuellen VR-Erlebnisses ausgeführt, sodass du schnell von einer App zu einer anderen umschalten, deine Bibliothek öffnen, dich mit Freund*innen verbinden und sogar andere Funktionen an deinem PC ohne weitere Schritte nutzen kannst. Diese Funktion bietet nicht nur intuitives und komfortables VR, sondern ermöglicht auch beispielloses Multitasking – ein riesiges Plus für Creators und Entwickler*innen, die mit VR arbeiten.
Stelle sicher, dass dein Computer (Desktop oder Laptop) gut vorbereitet ist, um optimale Erlebnisse zu erstellen. Dazu haben wir einige Tipps zusammengestellt:
Windows 10 empfohlen: Rift Core 2.0 dient als Basis für Dash und verschiebt die Grenzen des Möglichen im VR-Computing. Mit den Multitasking-, Fensterfixierungs- und Oculus Desktop-Features von Dash führen wir ressourcenintensive Systemaufgaben ein und behalten dabei unsere aktuellen Performance-Standards bei. Oculus Desktop erfordert Windows 10. Du kannst weiterhin Windows 7 und Windows 8 verwenden und die Kernfunktionen von Rift Core 2.0, einschließlich des neuen Dash-Systemmenüs und Oculus Home, nutzen. Features wie Oculus Desktop für virtuelles Computing sind damit jedoch nicht verfügbar, und du kannst Dash nicht als Overlay über deiner momentan aktiven VR-App ausführen.
GPU-Treiber aktualisieren: Wir haben sowohl mit AMD als auch mit NVIDIA zusammengearbeitet, um Dash-Support auf Treiberebene zu integrieren. Du benötigst die aktuellen Treiber von NVIDIA und AMD zur Ausführung von Dash. Klicke hier für weitere Informationen zu GPU-Spezifikationen.
Touch-First-Design: Das Rift-Kernerlebnis wurde von Grund auf für Touch-Bedienung entworfen und bietet alle Vorteile der Handbedienung auf einer intuitiven, benutzerfreundlichen Oberfläche. Viele Features funktionieren zwar auch mit dem Xbox-Controller, aber einige neue Funktionen wie die Anpassung deines Home erfordern Touch. Einfach ausgedrückt: Wenn du alle Features in Rift Core 2.0 nutzen möchtest, verwende Touch.
Dash verwenden
Wir empfehlen, Dash in deiner App zu unterstützen, um den Nutzer*innen das bestmögliche Erlebnis zu bieten. Das Erlebnis wird unterschiedlich ausfallen, je nachdem, ob deine App Dash unterstützt oder nicht:
Wenn die App Dash unterstützt, erscheint beim Anhalten der App die Benutzeroberfläche des Dash-Menüs über der angehaltenen App.
Wenn die App Dash nicht unterstützt, wird dem*der Nutzer*in die Dash-Menüoberfläche in einem leeren Raum gezeigt, ähnlich wie das universelle Menü in früheren Oculus-Runtimes.
Wenn die Dash-Benutzeroberfläche aktiv ist, rendert die Runtime nachverfolgte Controller in der Szene für Interaktionen mit dem Menü. Deine App sollte in sie in der Szene gerenderte nachverfolgte Controller anhalten, stummschalten und ausblenden, um zu vermeiden, dass zwei Paar Hände zu sehen sind.
Wenn du Unterstützung für Dash implementierst, solltest du drei Aspekte berücksichtigen:
Verarbeitung des Eingabefokus
Tiefen-Buffer-Unterstützung
Eine App als Eingabefokus-bewusst deklarieren
Verarbeitung des Eingabefokus
Verarbeitung des Oculus-CAPI-Fokus
Wenn die Dash-Benutzeroberfläche aktiv ist, verliert die laufende App den Eingabefokus und die Kennzeichnung ovrSessionStatus::HasInputFocus gibt „false“ zurück. In diesem Zustand rendert die Runtime nachverfolgte Controller in der Szene für Interaktionen mit dem Menü.
Wenn HasInputFocus gleich „false“ ist, sollte deine App alle Aktivitäten anhalten, die Audiowiedergabe stummschalten, nachverfolgte Controller ausblenden, damit keine zwei Paar Hände zu sehen sind, und Nahfeldobjekte (innerhalb von etwa 1 Meter Abstand zum*zur Nutzer*in) ausblenden. Je nach App sind unter Umständen weitere Maßnahmen ratsam, wenn der Eingabefokus verloren geht. Beispielsweise könnte es bei einem Multiplayer-Spiel gewünscht sein, anzuzeigen, das der*die Spieler*in nicht verfügbar ist, und weitere Maßnahmen zu ergreifen.
Der VR-Compositor kann bis zu 3 ms zusätzliche Rendering-Zeit pro Einzelbild-Zyklus verbrauchen, während HasInputFocus „false“ ist. Aus diesem Grund ist es eine gute Idee, deine App in einen Low-Performance-Modus zu versetzen, wenn möglich, solange HasInputFocusis gleich „false“ ist. Warte, bis HasInputFocus wieder gleich „true“ ist, bevor du dies rückgängig machst. Diese Vorgehensweise ist nicht erforderlich, und Performance-VRC-Anforderungen werden während der Zeit, in der die Dash-Benutzeroberfläche aktiv ist, nicht durchgesetzt.
Beachte, dass HasInputFocus auch unter anderen Umständen „false“ zurückgibt, wenn die App den Eingabefokus verliert, etwa, wenn das HMD vom Kopf abgenommen wird.
Du kannst die Kennzeichnung HasInputFocus mit dem folgenden Code überprüfen:
ovrSessionStatus sessionStatus = {};
ovr_GetSessionStatus(Session, &sessionStatus);
if (!sessionStatus.HasInputFocus) {/*Handle situation where your app has lost input focus*/}
Dieser Code sollte einmal pro Einzelbild-Rendering-Zyklus ausgeführt werden.
Verarbeitung des OpenXR-Fokus
Wenn die Dash-Benutzeroberfläche aktiv ist, verliert die laufende App den Eingabefokus und der Sitzungsstatus ändert sich von XR_SESSION_STATE_FOCUSED zu XR_SESSION_STATE_VISIBLE. In diesem Zustand rendert die Runtime nachverfolgte Controller in der Szene für Interaktionen mit dem Menü. Beachte, dass der Status XR_SESSION_STATE_FOCUSED auch den Sichtbar-Status impliziert.
Wenn der Sitzungsstatus von XR_SESSION_STATE_FOCUSED zu XR_SESSION_STATE_VISIBLE wechselt, sollte deine App alle Aktivitäten anhalten, die Audiowiedergabe stummschalten, nachverfolgte Controller in der Szene ausblenden, damit keine zwei Paar Hände zu sehen sind, und Nahfeldobjekte (innerhalb eines Abstands von etwa 1 Meter von dem*der Nutzer*in) ausblenden. Je nach App sind unter Umständen weitere Maßnahmen ratsam, wenn der Eingabefokus verloren geht. Beispielsweise könnte es bei einem Multiplayer-Spiel gewünscht sein, anzuzeigen, das der*die Spieler*in nicht verfügbar ist, und weitere Maßnahmen zu ergreifen.
Der VR-Compositor kann bis zu 3 ms zusätzliche Rendering-Zeit pro Einzelbild-Zyklus verbrauchen, während Dash sichtbar ist. Aus diesem Grund ist es eine gute Idee, deine App in einen Low-Performance-Modus zu versetzen, wenn möglich, solange die App keinen Fokus hat. Warte, bis XR_SESSION_STATE_VISIBLE zurückkehrt, bevor du dies rückgängig machst. Diese Vorgehensweise ist nicht erforderlich, und Performance-VRC-Anforderungen werden während der Zeit, in der die Dash-Benutzeroberfläche aktiv ist, nicht durchgesetzt.
Beachte, dass der Eingabefokus auch unter anderen Umständen verloren geht, wenn die App den Eingabefokus verliert, etwa, wenn das HMD vom Kopf abgenommen wird.
Änderungen des Sitzungsstatus werden über den folgenden Code identifiziert:
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 sollte ähnlich wie oben beschrieben pro Einzelbild-Zyklus mehrmals aufgerufen werden, bis keine Nachrichten mehr vorhanden sind.
Tiefen-Buffer-Unterstützung
CAPI-Tiefen-Buffer-Unterstützung
Viele geometrische Formen in der Nähe des*der Nutzer*in können unbehagliche visuelle Unstimmigkeiten verursachen, wenn ein Dash-Panel über einer geometrischen Form gerendert wird, die sich näher an dem*der Spieler*in als am Dash-Panel befindet. Um dies zu vermeiden, kannst du Tiefe mit deinen Eye-Render-Buffern übermitteln. Damit kann Dash einen Röntgeneffekt zeichnen, der dieses Unwohlsein verhindert. Aus diesem Grund und für zukünftige Verbesserungen, empfehlen wir, Tiefendaten mit deinen Eye-Render-Buffern zu übermitteln. Falls dies nicht möglich ist, ist es immer noch besser, Dash zu unterstützen (und die Unstimmigkeit zu akzeptieren), als Dash nicht zu unterstützen.
Du kannst Tiefendaten mit ovrLayerType_EyeFovDepth übermitteln, wie im folgenden Beispielcode gezeigt. Dieser Code basiert auf dem OculusRoomTiny DX11-Codebeispiel (unter {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++;
OpenXR-Tiefen-Buffer-Unterstützung
Um die Übermittlung von Tiefendaten zu unterstützen, aktiviere die Erweiterung XR_KHR_composition_layer_depth. Um die Tiefendaten zu übermitteln, füge eine Instanz von XrCompositionLayerDepthInfoKHR zur nächsten Chain für jede übermittelte XrCompositionLayerProjectionView-Struktur zu xrEndFrame hinzu. Tiefen-Buffer werden ähnlich wie Farb-Buffer mit xrCreateSwapchain erstellt.
Deine CAPI-basierte App sollte anzeigen, ob sie darauf vorbereitet ist, auf ovrSessionStatus-Fokuszustände zu reagieren, einschließlich HasInputFocus. Wenn deine App darauf vorbereitet ist, den Fokusverlust wie oben unter Handhabung des Eingabefokus beschrieben zu verarbeiten, dann setze die Kennzeichnung ovrInit_FocusAware auf „true“, und setze ovrInit_FocusAware andernfalls auf „false“.
Auf OpenXR basierende Apps sind nativ immer Eingabefokus-bewusst und brauchen keine spezielle Handhabung.
Eine App als Eingabefokus-bewusst deklarieren
Deine App sollte anzeigen, ob sie darauf vorbereitet ist, auf ovrSessionStatus-Fokuszustände zu reagieren, einschließlich HasInputFocus. Wenn deine App darauf vorbereitet ist, den Fokusverlust wie oben unter Handhabung des Eingabefokus beschrieben zu verarbeiten, dann setze die Kennzeichnung ovrInit_FocusAware auf „true“, und setze ovrInit_FocusAware andernfalls auf „false“.
Das folgende Codebeispiel zeigt, wie du ovrInit_FocusAware festlegen kannst. Dieser Code basiert auf dem OculusRoomTiny DX11-Codebeispiel (unter {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);
}