Стабилизация голограммы — MRTK2
Производительность
Чтобы базовая платформа смешанной реальности и устройство выполняли лучшие результаты, важно достичь скорости кадров. Целевая частота кадров (например, 60 FPS или 90 FPS) зависит от платформ и устройств. Однако приложения смешанной реальности, встречая кадры, будут иметь стабильные голограммы, а также эффективное отслеживание головы, отслеживание рук и многое другое.
Отслеживание среды
Стабильная голографическая отрисовка сильно зависит от отслеживания поз головы платформы и устройства. Unity отрисовывает сцену каждого кадра из камеры, предполагаемой и предоставленной базовой платформой. Если это отслеживание не соответствует фактическому перемещению головы, голограммы будут отображаться визуально неточными. Это особенно очевидно и важно для устройств AR, таких как HoloLens, где пользователи могут связывать виртуальные голограммы с реальным миром. Производительность важна для надежного отслеживания головы, но могут быть и другие важные функции. Типы элементов среды, влияющих на взаимодействие с пользователем, будут зависеть от конкретных особенностей целевой платформы.
Windows Mixed Reality
Платформа Windows Смешанная реальность предоставляет некоторые справочные материалы для стабилизации голограмм на платформе. Существует несколько ключевых инструментов, хотя разработчики могут использовать для улучшения визуального интерфейса голограммы для пользователей.
Общий доступ к буферу глубины
Разработчики Unity могут совместно использовать буфер глубины приложения с платформой. В этом разделе содержатся сведения о том, где голограммы существуют для текущего кадра, что платформа может использовать для стабилизации голограмм с помощью аппаратного процесса, известного как репроецирование поздних этапов.
Репроецирование поздних этапов
В конце отрисовки кадра платформа Windows Смешанная реальность принимает целевые объекты цветной и глубины отрисовки, созданные приложением, и преобразует окончательные выходные данные экрана для учета любого небольшого движения головы с момента последнего прогнозирования представления головы. Для выполнения игрового цикла приложения требуется время. Например, при 60 FPS это означает, что приложение принимает около 16,667 мс для отрисовки кадра. Несмотря на то, что это может показаться минискоулным временем, позиция пользователя и ориентация головы изменится, что приведет к новым матрицам проекции для камеры в отрисовке. Перепроектирование в конце стадии преобразует пиксели в окончательном изображении, чтобы учитывать эту новую перспективу.
На пиксель и плоскость стабилизации LSR
В зависимости от конечной точки устройства и версии ОС, работающей на устройстве с Windows Смешанная реальность, алгоритм перепроектирования поздних этапов будет выполняться на пиксель или через плоскость стабилизации.
На основе глубины пикселя
Перепроектирование глубины на основе пикселей включает использование буфера глубины для изменения выходных данных изображения на пиксель и, следовательно, стабилизации голограмм на различных расстояниях. Например, в 10 м может быть перед столпом, который составляет 10 метров. Пиксели, представляющие сферу, будут иметь другое преобразование, чем далекие пиксели, представляющие столб, если пользователь наклонил голову немного. Репроецирование на пикселях учитывает эту разницу расстояния на каждом пикселе для более точного репроецирования.
Плоскость стабилизации
Если невозможно создать точный буфер глубины для совместного использования с платформой, другая форма LSR использует плоскость стабилизации. Все голограммы в сцене получат некоторую стабилизацию, но голограммы, входящие в нужную плоскость, получат максимальную стабилизацию оборудования. Точку и норму плоскости можно предоставить платформе через API HolographicSettings.SetFocusPointForFrame, предоставляемый Unity.
Формат буфера глубины
Если вы используете HoloLens для разработки, настоятельно рекомендуется использовать 16-разрядный формат буфера глубины по сравнению с 24-разрядным. Это может значительно сократить производительность, хотя значения глубины будут иметь меньшую точность. Чтобы компенсировать низкую точность и избежать z-боевых действий, рекомендуется уменьшить плоскость удаленного клипа от значения по умолчанию 1000 млн, заданного Unity.
Примечание.
Если используется 16-разрядный формат глубины, необходимые эффекты буфера элементов не будут работать, так как Unity не создает буфер набора элементов в этом параметре. При выборе 24-разрядного формата глубины обычно создается 8-разрядный буфер элементов, если применимо к графической платформе конечной точки.
Общий доступ к буферу глубины в Unity
Чтобы использовать LSR на основе глубины, необходимо выполнить два важных шага, необходимых разработчикам.
- В разделе "Изменение>параметров>>проекта>XR", пакеты> SDK для виртуальной реальности обеспечивают общий доступ к буферу глубины
- Если вы используете HoloLens, рекомендуется также выбрать 16-разрядный формат глубины.
- При отрисовке цвета на экране, глубину отрисовки также
Непрозрачные gameObjects в Unity обычно записываются в глубину автоматически. Однако прозрачные и текстовые объекты обычно не записываются в глубину по умолчанию. При использовании шейдера MRTK standard или Text Mesh Pro это можно легко исправить.
Примечание.
Чтобы быстро определить, какие объекты в сцене не записываются в буфер глубины визуально, можно использовать служебную программу буфера глубины отрисовки в разделе "Параметры редактора" в профиле конфигурации MRTK.
Прозрачный шейдер MRTK standard
Для прозрачных материалов с помощью шейдера MRTK Standard выберите материал, чтобы просмотреть его в окне инспектора. Затем нажмите кнопку "Исправить сейчас ", чтобы преобразовать материал для записи в глубину (т.е. Z-Write On).
Перед
После
Текстовые сетки Pro
Для объектов Text Mesh Pro выберите TMP GameObject, чтобы просмотреть его в инспекторе. Под компонентом материала переключите шейдер для назначенного материала, чтобы использовать шейдер MRTK TextMeshPro.
Настраиваемый шейдер
При написании пользовательского шейдера добавьте флаг 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.