Bewährte Methoden für OpenXR-Apps

Ein Beispiel für die bewährten Methoden finden Sie unten in der Datei OpenXRProgram.cpp von BasicXrApp. Die Run()-Funktion am Anfang erfasst einen typischen OpenXR-App-Codefluss von der Initialisierung bis zur Ereignis- und Renderingschleife.

Bewährte Methoden für visuelle Qualität und Stabilität

In den bewährten Methoden in diesem Abschnitt wird beschrieben, wie Sie die beste visuelle Qualität und Stabilität in jeder OpenXR-Anwendung erzielen.

Weitere leistungsspezifische Empfehlungen für HoloLens 2 finden Sie im Abschnitt Best Practices for Performance on HoloLens 2 weiter unten.

Gamma-korrektes Rendering

Es muss darauf geachtet werden, dass Ihre Renderingpipeline gammakorrekt ist. Beim Rendern in einer Swapchain sollte das Renderzielansichtsformat mit dem Swapchainformat übereinstimmen. Beispielsweise DXGI_FORMAT_B8G8R8A8_UNORM_SRGB sowohl für das Swapchainformat als auch für die Renderzielansicht. Es gibt eine Ausnahme, wenn die Renderingpipeline der App eine manuelle sRGB-Konvertierung im Shadercode durchführt. Die App sollte ein sRGB-Swapchainformat anfordern, aber das lineare Format für die Renderzielansicht verwenden. Fordern Sie DXGI_FORMAT_B8G8R8A8_UNORM_SRGB beispielsweise als Swapchainformat an, aber verwenden Sie DXGI_FORMAT_B8G8R8A8_UNORM als Renderzielansicht, um zu verhindern, dass Inhalte doppelt gamma korrigiert werden.

Übermitteln eines Tiefenpuffers für Projektionsebenen

Verwenden XR_KHR_composition_layer_depth Sie immer die Erweiterung, und übermitteln Sie den Tiefenpuffer zusammen mit der Projektionsebene, wenn Sie einen Frame an xrEndFrameübermitteln. Das Aktivieren der Hardwaretiefen-Neuprojektion auf HoloLens 2 verbessert die Stabilität des Hologramms.

Wählen Sie einen angemessenen Tiefenbereich aus.

Bevorzugen Sie einen engeren Tiefenbereich, um den virtuellen Inhalt so einzugrenzen, dass die Hologrammstabilität auf HoloLens unterstützt wird. Das Beispiel OpenXrProgram.cpp verwendet beispielsweise 0,1 Meter bis 20 Meter. Verwenden Sie reversed-Z für eine einheitlichere Tiefenauflösung. Auf HoloLens 2 kann die Verwendung des bevorzugten DXGI_FORMAT_D16_UNORM Tiefenformats zu einer besseren Bildfrequenz und Leistung beitragen, obwohl 16-Bit-Tiefenpuffer eine geringere Tiefenauflösung bieten als 24-Bit-Tiefenpuffer. Die Anwendung dieser bewährten Methoden, um die Tiefenauflösung optimal zu nutzen, wird wichtiger.

Vorbereiten für verschiedene Umgebungsmischungsmodi

Wenn Ihre Anwendung auch auf immersiven Headsets ausgeführt wird, die die Welt vollständig blockieren, müssen Sie die unterstützten Umgebungsmischungsmodi mithilfe der xrEnumerateEnvironmentBlendModes API auflisten und Ihre Renderinginhalte ordnungsgemäß vorbereiten. Für ein System mit XR_ENVIRONMENT_BLEND_MODE_ADDITIVE z. B. HoloLens sollte die App transparent als klare Farbe verwenden, während für ein System mit XR_ENVIRONMENT_BLEND_MODE_OPAQUEdie App eine undurchsichtige Farbe oder ein virtueller Raum im Hintergrund gerendert werden sollte.

Auswählen des ungebundenen Verweisbereichs als Stammbereich der Anwendung

Anwendungen richten in der Regel einen Stammweltkoordinatenraum ein, um Ansichten, Aktionen und Hologramme miteinander zu verbinden. Verwenden Sie XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT , wenn die Erweiterung unterstützt wird, um ein Koordinatensystem auf Weltniveau einzurichten, sodass Ihre App unerwünschte Hologrammdrift vermeiden kann, wenn sich der Benutzer weit entfernt (z. B. 5 Meter entfernt) von dem Startort der App entfernt. Verwenden Sie XR_REFERENCE_SPACE_TYPE_LOCAL als Fallback, wenn die Erweiterung für unbegrenzten Speicherplatz nicht vorhanden ist.

Zuordnen des Hologramms zum Raumanker

Wenn Sie einen unbegrenzten Referenzraum verwenden, können Hologramme, die Sie direkt in diesem Referenzraum platzieren, abdriften, wenn der Benutzer zu entfernten Räumen geht und dann zurückkommt. Für Hologrammbenutzer an einem diskreten Ort in der Welt platzieren, erstellen Sie mithilfe derxrCreateSpatialAnchorSpaceMSFT Erweiterungsfunktion einen Raumanker, und positionieren Sie das Hologramm an seinem Ursprung. Dadurch bleibt dieses Hologramm im Laufe der Zeit unabhängig stabil.

Unterstützung der Mixed Reality-Erfassung

Obwohl die primäre Anzeige von HoloLens 2 die additive Umgebungsmischung verwendet, wird der Renderinhalt der App mit dem Umgebungsvideostream alpha-blended, wenn der Benutzer mit der Mixed Reality-Aufnahme beginnt. Um die beste visuelle Qualität in Mixed Reality-Aufnahmevideos zu erzielen, ist es am besten, die in der XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT Projektionsebene layerFlagsfestzulegen.

Bewährte Methoden für die Leistung auf HoloLens 2

Als mobiles Gerät mit Unterstützung für hardwarebasierte Neuprojektionen hat HoloLens 2 strengere Anforderungen an eine optimale Leistung. Es gibt eine Reihe von Möglichkeiten, Kompositionsdaten zu übermitteln, was zu einer Nachverarbeitung mit spürbaren Leistungseinbußen führt.

Auswählen eines Swapchainformats

Führen Sie immer unterstützte Pixelformate mithilfe xrEnumerateSwapchainFormatsvon auf, und wählen Sie das erste Farb- und Tiefenpixelformat aus der von der App unterstützten Runtime aus, da dies die Runtime für eine optimale Leistung bevorzugt. Beachten Sie, dass HoloLens 2 und DXGI_FORMAT_D16_UNORM in der Regel die erste Wahl ist, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB um eine bessere Renderingleistung zu erzielen. Diese Einstellung kann sich bei VR-Headsets unterscheiden, die auf einem Desktop-PC ausgeführt werden, wobei 24-Bit-Tiefenpuffer weniger Leistungseinbußen haben.

Leistungswarnung: Die Verwendung eines anderen Formats als das primäre Swapchainfarbformat führt zu einer Nachverarbeitung der Laufzeit, was zu einer erheblichen Leistungseinbuße führt.

Rendern Sie immer mit der empfohlenen Ansichtskonfiguration Breite/Höhe (recommendedImageRectWidth und recommendedImageRectHeight von XrViewConfigurationView), und verwenden Sie xrLocateViews immer die API, um die empfohlene Ansichtsposition, den FOV und andere Renderingparameter vor dem Rendern abzufragen. Verwenden Sie beim Abfragen nach Posen und Ansichten immer den XrFrameEndInfo.predictedDisplayTime aus dem neuesten xrWaitFrame Aufruf. Dadurch kann HoloLens das Rendering anpassen und die visuelle Qualität für die Person optimieren, die die HoloLens trägt.

Verwenden einer einzelnen Projektionsebene

HoloLens 2 verfügt über eine begrenzte GPU-Leistung zum Rendern von Inhalten und einen Hardwarekompositor, der für eine einzelne Projektionsebene optimiert ist. Wenn Sie immer eine einzelne Projektionsebene verwenden, können Sie die Framerate, die Hologrammstabilität und die visuelle Qualität der Anwendung unterstützen.

Leistungswarnung: Das Übermitteln von außer einer einzelnen Schutzschicht führt zu einer Nachverarbeitung der Laufzeit, was zu erheblichen Leistungseinbußen führt.

Rendern mit Texturarray und VPRT

Erstellen Sie eine xrSwapchain für das linke und rechte Auge mit arraySize=2 der Farbwechselkette und eine für die Tiefe. Rendern Sie das linke Auge in Slice 0 und das rechte Auge in Slice 1. Verwenden Sie einen Shader mit VPRT- und instanzierten Zeichnungsaufrufen für stereoskopisches Rendering, um die GPU-Last zu minimieren. Dies ermöglicht auch die Optimierung der Runtime, um die beste Leistung auf HoloLens 2 zu erzielen. Alternativen zur Verwendung eines Texturarrays, z. B. doppeltes Rendering oder eine separate Swapchain pro Auge, führen zu einer Nachverarbeitung der Laufzeit, was zu erheblichen Leistungseinbußen führt.

Vermeiden von Quad-Ebenen

Anstatt Quad-Ebenen als Kompositionsebenen mit XrCompositionLayerQuadzu übermitteln, rendern Sie den Quad-Inhalt direkt in die Projektions-Swapchain.

Leistungswarnung: Das Bereitstellen zusätzlicher Ebenen über eine einzelne Projektionsebene hinaus, z. B. vier Ebenen, führt zu einer Nachverarbeitung der Laufzeit, was zu erheblichen Leistungseinbußen führt.