Стабилизация голограмм

Производительность

Чтобы базовая платформа смешанной реальности и устройство достигли наилучших результатов, важно достичь скорости кадров. Целевая частота кадров (например, 60 FPS или 90 FPS) зависит от платформ и устройств. Однако приложения смешанной реальности, использующие частоту кадров, будут иметь стабильные голограммы, а также эффективное отслеживание головы, отслеживание рук и многое другое.

Отслеживание среды

Стабильная голографическая отрисовка в значительной степени зависит от отслеживания положения головы устройством платформы & . Unity будет отображать сцену каждого кадра из камеры, предполагаемой и предоставленной базовой платформой. Если отслеживание неправильно соответствует фактическому перемещению головы, голограммы будут отображаться визуально неточными. Это особенно очевидно и важно для устройств AR, таких как HoloLens, где пользователи могут связывать виртуальные голограммы с реальным миром. Производительность важна для надежного отслеживания головы, но также могут быть и другие важные функции. Типы элементов среды, влияющих на взаимодействие с пользователем, будут зависеть от особенностей целевой платформы.

Windows Mixed Reality

Платформа Windows Mixed Reality предоставляет некоторые справочные материалы для стабилизации голограмм на платформе. Существует несколько ключевых инструментов, хотя разработчики могут использовать для улучшения визуального интерфейса голограммы для пользователей.

Общий доступ к буферу глубины

Разработчики Unity могут совместно использовать буфер глубины приложения с платформой. Это предоставляет сведения о том, где существуют голограммы для текущего кадра, которые платформа может использовать для стабилизации голограмм с помощью аппаратного процесса, известного как Late-Stage reprojection.

Перепроектирование поздних этапов

В конце отрисовки кадра платформа Windows Mixed Reality принимает целевые объекты отрисовки глубины цвета&, созданные приложением, и преобразует окончательные выходные данные экрана, чтобы учитывать любое небольшое движение головы с момента последнего прогнозирования положения головы. Выполнение игрового цикла приложения занимает время. Например, при 60 FPS приложение принимает около 16,667 мс для отрисовки кадра. Несмотря на то, что это может показаться минискулированием времени, положение пользователя и ориентация головы изменится, в результате чего новые матрицы проекции для камеры при отрисовке. Перепроектирование позднего этапа преобразует пиксели в окончательном изображении, чтобы учитывать эту новую перспективу.

На пиксель и плоскость стабилизации LSR

В зависимости от конечной точки устройства и версии ОС, работающей на устройстве Windows Mixed Reality, алгоритм повторного развертывания Late-Stage будет выполняться на пиксель или через плоскость стабилизации.

На основе глубины в пикселях

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

Плоскость стабилизации

Если невозможно создать точный буфер глубины для совместного использования с платформой, другая форма LSR использует плоскость стабилизации. Все голограммы в сцене получат некоторую стабилизацию, но голограммы, входящие в нужную плоскость, получат максимальную аппаратную стабилизацию. Точку и норму плоскости можно передавать на платформу через HolographicSettings.SetFocusPointForFrameAPI, предоставляемый Unity.

Формат буфера глубины

При выборе HoloLens для разработки настоятельно рекомендуется использовать 16-разрядный формат буфера глубины по сравнению с 24-разрядным. Это может значительно сократить производительность, хотя значения глубины будут иметь меньшую точность. Чтобы компенсировать низкую точность и избежать z-боев, рекомендуется уменьшить дальнюю плоскость клипа из значения по умолчанию 1000 м, заданного Unity.

Примечание

Если используется 16-разрядный формат глубины, требуемые эффекты буфера трафаретов не будут работать, так как Unity не создает буфер трафарета в этом параметре. При выборе 24-разрядного формата глубины обычно создается 8-разрядный буфер трафарета, если применимо к графической платформе конечной точки.

Общий доступ к буферу глубины в Unity

Чтобы использовать LSR на основе глубины, необходимо выполнить два важных шага, необходимых разработчикам.

  1. В разделе edit>Project Параметры>PlayerXR>Параметры>Пакеты SDK> для реальностиVirtual обеспечивают общий доступ к буферу глубины
    1. При выборе целевого HoloLens рекомендуется также выбрать 16-разрядный формат глубины.
  2. При отрисовке цвета на экране также глубину отрисовки

Непрозрачные gameObjects в Unity обычно записываются в глубину автоматически. Однако прозрачные & текстовые объекты обычно не записываются в глубину по умолчанию. При использовании стандартного шейдера MRTK или текстового Mesh Pro это можно легко исправить.

Примечание

Чтобы быстро определить, какие объекты в сцене не записываются в буфер глубины визуально, можно использовать служебную программу буфера глубины отрисовки в редакторе Параметры в профиле конфигурации MRTK.

Прозрачный шейдер MRTK standard

Для прозрачных материалов с помощью шейдера MRTK standard выберите материал, чтобы просмотреть его в окне Инспектора . Затем нажмите кнопку "Исправить" , чтобы преобразовать материал для записи в глубину (т. е. Z-Write On).

До

Depth Buffer Before Fix MRTK Standard Shader

После

Depth Buffer Fixed MRTK Standard Shader

Текстовые Mesh Pro

Для объектов Text Mesh Pro выберите объект TMP GameObject, чтобы просмотреть его в инспекторе. Под компонентом материала переключите шейдер для назначенного материала, чтобы использовать шейдер MRTK TextMeshPro.

Text Mesh Pro Depth Buffer Fix

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

При написании пользовательского шейдера добавьте флаг ZWrite в начало определения блока Pass , чтобы настроить шейдер для записи в буфер глубины.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Непрозрачные резервные копии

Если приведенные выше методы не работают для заданного сценария (т. е. с помощью пользовательского интерфейса Unity), можно записать другой объект в буфер глубины. Распространенный пример — использование текста пользовательского интерфейса Unity на плавающей панели в сцене. Делая панель непрозрачной или по крайней мере запись в глубину, то оба текста & панели будут стабилизироваться платформой, так как их z-значения настолько близки друг к другу.

WorldAnchors (HoloLens)

Наряду с обеспечением правильной конфигурации для обеспечения стабильности визуальных элементов важно обеспечить стабильность голограмм в правильном физическом расположении. Чтобы сообщить платформе о важных местах в физическом пространстве, разработчики могут использовать WorldAnchors в GameObjects, которые должны оставаться в одном месте. WorldAnchor — это компонент, добавленный в GameObject, который принимает абсолютный контроль над преобразованием этого объекта.

Такие устройства, как HoloLens, постоянно сканируют и изучают среду. Таким образом, по мере того как HoloLens отслеживает позицию перемещения & в пространстве, ее оценки будут обновлены и скорректирована система координат Unity. Например, если GameObject помещается на 1 м с камеры в начале, так как HoloLens отслеживает среду, она может реализовать физическую точку, в которой находится GameObject, на самом деле 1,1 млн. Это приведет к смещению голограммы. Применение WorldAnchor к GameObject позволит привязке управлять преобразованием объекта, чтобы объект оставался в правильном физическом расположении (т. е. обновите до 1,1 млн вместо 1 млн во время выполнения). Чтобы сохранить WorldAnchors в сеансах приложений, разработчики могут использовать WorldAnchorStore для сохранения и загрузки WorldAnchors.

Примечание

После добавления компонента WorldAnchor в GameObject невозможно изменить преобразование GameObject (т. е. transform.position = x). Чтобы изменить преобразование, разработчик должен удалить WorldAnchor.

WorldAnchor m_anchor;

public void AddAnchor()
{
    this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}

public void RemoveAnchor()
{
    DestroyImmediate(m_anchor);
}

Если вы хотите использовать альтернативу работе с привязками вручную, ознакомьтесь со средствами microsoft World Locking Tools.

См. также статью