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

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

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

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

Стабильная голографическая отрисовка в значительной степени зависит от отслеживания положения головы устройством платформы & . 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 использует плоскость стабилизации. Все голограммы в сцене получат некоторую стабилизацию, но голограммы, входящие в нужную плоскость, получат максимальную аппаратную стабилизацию. Точку и нормальное состояние плоскости можно предоставить платформе с помощью API HolographicSettings.SetFocusPointForFrame, предоставляемого Unity.

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

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

Примечание

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

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

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

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

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

Примечание

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

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

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

До

Depth Buffer Before Fix MRTK Standard Shader

После

Depth Buffer Fixed MRTK Standard Shader

Текстовые Mesh Pro

Для объектов Text Mesh Pro выберите объект GameObject TMP, чтобы просмотреть его в инспекторе. В компоненте материала переключите шейдер для назначенного материала, чтобы использовать шейдер 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.

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