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_OPAQUE
die 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 layerFlags
festzulegen.
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 xrEnumerateSwapchainFormats
von 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 mit empfohlenen Renderingparametern und Framezeitpunkt
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 XrCompositionLayerQuad
zu ü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.