Рекомендации по использованию приложений OpenXR

Пример рекомендаций см. в файле OpenXRProgram.cpp BasicXrApp. Функция Run() в начале захватывает типичный поток кода приложения OpenXR от инициализации до цикла события и отрисовки.

Рекомендации по обеспечению качества и стабильности визуализации

Рекомендации в этом разделе описывают, как обеспечить наилучшее качество и стабильность визуализации в любом приложении OpenXR.

Дополнительные рекомендации по производительности, относящиеся к HoloLens 2, см. в разделе Рекомендации по повышению производительности в HoloLens 2 ниже.

Гамма-корректная отрисовка

Необходимо соблюдать осторожность, чтобы убедиться, что конвейер отрисовки является гамма-правильным. При отрисовке в цепочке буферов формат представления целевого объекта отрисовки должен соответствовать формату цепочки буферов. Например, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB для формата цепочки буферов и представления целевого объекта отрисовки. Существует исключение, если конвейер отрисовки приложения выполняет ручное преобразование sRGB в коде шейдера. Приложение должно запрашивать формат цепочки буферов sRGB, но использовать линейный формат для представления цели отрисовки. Например, запросите DXGI_FORMAT_B8G8R8A8_UNORM_SRGB как формат цепочки буферов, но используйте DXGI_FORMAT_B8G8R8A8_UNORM в качестве целевого представления отрисовки, чтобы предотвратить двойное исправление содержимого.

Отправка буфера глубины для слоев проекции

Всегда используйте XR_KHR_composition_layer_depth расширение и отправляйте буфер глубины вместе со слоем проекции при отправке кадра в xrEndFrame. Включение аппаратного перепроектирования глубины на HoloLens 2 повышает стабильность голограммы.

Выбор разумного диапазона глубины

Чтобы обеспечить стабильность голограммы на HoloLens, область виртуальное содержимое, рекомендуется использовать более узкий диапазон глубины. Например, в примере OpenXrProgram.cpp используется от 0,1 до 20 метров. Используйте обратное-Z для более равномерного разрешения глубины. На HoloLens 2 использование предпочтительного DXGI_FORMAT_D16_UNORM формата глубины поможет достичь лучшей частоты кадров и производительности, хотя 16-разрядные буферы глубины обеспечивают меньшее разрешение глубины, чем 24-разрядные буферы глубины. Соблюдение этих рекомендаций для оптимального использования разрешения глубины становится более важным.

Подготовка к различным режимам наложения среды

Если приложение также будет работать на иммерсивных гарнитурах, которые полностью блокируют мир, обязательно перечислите поддерживаемые режимы смешения среды с помощью xrEnumerateEnvironmentBlendModes API и подготовьте содержимое для отрисовки правильно. Например, для системы с XR_ENVIRONMENT_BLEND_MODE_ADDITIVE таким, как HoloLens, приложение должно использовать прозрачный в качестве прозрачного цвета, а для системы с XR_ENVIRONMENT_BLEND_MODE_OPAQUEприложением должно отображаться непрозрачный цвет или виртуальная комната в фоновом режиме.

Выбор неограниченного пространства ссылок в качестве корневого пространства приложения

Приложения обычно устанавливают некоторое пространство координат корневого мира для соединения представлений, действий и голограмм. Используйте XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT , когда расширение поддерживается для создания системы координат мирового масштаба, что позволяет приложению избежать нежелательного смещения голограмм, когда пользователь перемещается далеко (например, на 5 метров) от места запуска приложения. Используйте XR_REFERENCE_SPACE_TYPE_LOCAL в качестве резервного, если расширение свободного пространства не существует.

Связывание голограммы с пространственной привязкой

При использовании неограниченного пространства ссылок голограммы, размещенные непосредственно в этом пространстве ссылок, могут отклоняться по мере того, как пользователь перемещается в отдаленные комнаты, а затем возвращается. Для размещения голограммы в дискретном расположении в мире создайте пространственную привязку с помощью xrCreateSpatialAnchorSpaceMSFT функции расширения и расположите голограмму в ее источнике. Это позволит сохранить голограмму независимо стабильной с течением времени.

Поддержка захвата смешанной реальности

Хотя основной дисплей HoloLens 2 использует аддитивное смешивание среды, когда пользователь начинает запись смешанной реальности, содержимое отрисовки приложения будет альфа-смешиваться с видеопотоком среды. Чтобы добиться наилучшего визуального качества в видео захвата смешанной реальности, лучше всего задать XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT в слое проекции layerFlags.

Рекомендации по повышению производительности в HoloLens 2

Как мобильное устройство с поддержкой аппаратного перепроектирования, HoloLens 2 предъявляет более строгие требования к оптимальной производительности. Существует несколько способов отправки данных композиции, что приводит к постобработке с заметным снижением производительности.

Выбор формата цепочки подкачки

Всегда перечисляйте поддерживаемые форматы пикселей с помощью xrEnumerateSwapchainFormatsи выбирайте первый цвет и формат пикселей глубины из среды выполнения, поддерживаемой приложением, так как это то, что среда выполнения предпочитает для оптимальной производительности. Обратите внимание, что на HoloLens 2 иDXGI_FORMAT_D16_UNORM, как правило, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB является первым выбором для достижения лучшей производительности отрисовки. Этот параметр может отличаться на гарнитурах виртуальной реальности, работающих на настольном компьютере, где 24-разрядные буферы глубины имеют меньшее влияние на производительность.

Предупреждение о производительности. Использование формата, отличного от основного формата цвета цепочки буферов, приведет к постобработке среды выполнения, что значительно устрашает производительность.

Всегда отрисовывайтесь с рекомендуемой конфигурацией ширины и высоты представления (recommendedImageRectWidth и от XrViewConfigurationView), а recommendedImageRectHeight также всегда используйте xrLocateViews API для запроса рекомендуемой позиции представления, FOV и других параметров отрисовки перед отрисовкой. Всегда используйте XrFrameEndInfo.predictedDisplayTime из последнего xrWaitFrame вызова при запросе представлений и поз. Это позволяет HoloLens корректировать отрисовку и оптимизировать визуальное качество для пользователя, который носит HoloLens.

Использование одного слоя проекции

HoloLens 2 имеет ограниченную мощность GPU для отрисовки содержимого и аппаратный композитатор, оптимизированный для одного уровня проекции. Всегда использование одного уровня проекции может помочь приложению в частоте кадров, стабильности голограммы и визуальном качестве.

Предупреждение о производительности. Отправка чего-либо, кроме одного уровня защиты, приведет к постобработке среды выполнения, что значительно устратит производительность.

Отрисовка с помощью массива текстур и VPRT

Создайте один для xrSwapchain левого и правого глаз, используя arraySize=2 для цветовой цепочки переключения, и один для глубины. Отрисуйте левый глаз в срез 0, а правый — в срез 1. Используйте шейдер с VPRT и вызовами отрисовки экземпляров для стереоскопической отрисовки, чтобы свести к минимуму нагрузку на GPU. Это также позволяет оптимизировать среду выполнения для достижения наилучшей производительности на HoloLens 2. Альтернативы использованию массива текстур, например двусторонняя отрисовка или отдельная цепочка переключения на глаз, приводят к постобработке среды выполнения, что значительно устрашает производительность.

Избегайте четырех слоев

Вместо отправки четырех слоев в качестве слоев композиции с XrCompositionLayerQuadпомощью преобразуйте содержимое четырехугольника непосредственно в цепочку буферов проекции.

Предупреждение о производительности. Предоставление дополнительных слоев за пределами одного слоя проекции, таких как четырехслойные слои, приведет к постобработке среды выполнения, что приводит к значительному ухопростию производительности.