Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Подсистема отображения XR SDK

XRОбщий термин, охватывающий приложения виртуальной реальности (VR), дополненной реальности (AR) и смешанной реальности (MR). . Устройства, поддерживающие эти формы интерактивных приложений, можно назвать устройствами XR. Подробнее
См. в Словарь
Подсистема отображения SDK предоставляет интерфейс для распределения текстур, жизненного цикла кадров, и блокировка каденса.

Распределение текстуры

Для некоторых SDK устройств требуется, чтобы текстура выделялась через сам SDK, а не через обычные графические API. Если вы используете подсистему отображения XR SDK, вам больше не нужно полагаться на внешние плагинынабор кода, созданный вне Unity, который создает функциональность в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
См. в Словарь
до blitСокращенный термин для «передачи битового блока». Блит-операция — это процесс передачи блоков данных из одного места в памяти в другое.
Посмотрите в Словарь
или скопируйте в текстуру SDK.

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

В следующих случаях Unity не может выполнить рендеринг непосредственно в текстуру, а вместо этого выполняет рендеринг в промежуточные текстуры, а затем блики или копии в вашу текстуру:

  • Если используются эффекты изображения, ваша текстура будет последней в цепочке.
  • На ПК с MSAA Unity выполняет рендеринг в мультисэмплированную текстуру, а затем преобразует ее в вашу текстуру в конце камерыA компонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
    См. в стопке Словарь
    .
  • На мобильных устройствах с расширением автоматического разрешения нескольких образцов текстура будет неявно разрешена, когда текстура сбрасывается или используется в качестве источника или назначения для любой операции, кроме отрисовки. См. расширение EXT_multisampled_render_to_texture.
  • Отложенный рендеринг, HDRширокий динамический диапазон
    См. в Словарь
    , и командные буферы заставляют Unity отображать промежуточные текстуры.
  • При рендеринге на часть экрана Unity выполняет рендеринг на промежуточные текстуры.
  • Если «макет текстуры» не соответствует тому, что выполняет рендеринг в Unity (например, Unity рендерит каждый глаз в отдельные текстуры, но RenderPass настроен на рендеринг в массив текстур или в одну текстуру).
  • Если установлен флаг kUnityXRRenderTextureFlagsLockedWidthHeight и renderScale не равен 1,0.
  • Если установлен флаг kUnityXRRenderTextureFlagsWriteOnly и Unity необходимо выполнить обратное чтение из текстуры.

MSAA

Как на ПК, так и на мобильных устройствах движок всегда разрешает текстуру поставщика. Движок выполняет неявное разрешение (на мобильных устройствах с расширением рендеринга нескольких образцов в текстуру) или явное разрешение.

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

sRGB

Используйте UnityXRFrameSetupHints.appSetup.sRGB, чтобы проверить, ожидает ли Unity визуализацию текстур в форматах sRGB. Поставщик в конечном итоге выбирает выходной формат текстурыФормат файла для обработки текстур во время рендеринга в реальном времени с помощью оборудования для трехмерной графики, такого как видеокарта или мобильное устройство. Подробнее
См. в Словарь
из colorFormat поля UnityXRRenderTextureDesc. Если используется формат sRGB, Unity включает или выключает запись sRGB в зависимости от цветового пространства, выбранного активным проектом. Вы всегда должны сэмплировать любые текстуры sRGB с преобразованием sRGB в линейное в вашем компоновщике.

Текстуры глубины

Если вашему SDK требуется информация о глубине, вы можете получить буфер глубиныхранилище памяти, в котором хранится глубина z-значения каждого пикселя в изображении, где z-значение — это глубина каждого отображаемого пикселя от плоскости проекции. Подробнее
См. в Словарь
так же, как цветовой буфер выше. Значение nativeDepthTex в UnityXRRenderTextureDesc указывает собственный ресурс. По умолчанию Unity пытается совместно использовать буфер глубины между текстурами с похожим описанием, если для nativeDepthTex задано значение kUnityXRRenderTextureIdDontCare.

Если вашему SDK не требуется информация о глубине, вы должны установить для UnityXRRenderTextureDesc::depthFormat значение kUnityXRDepthTextureFormatNone, чтобы избежать ненужных разрешений.

Обработка двойной и тройной буферизации

Во время отправки (см. раздел Отправка кадров в процессе обработки ниже) вы можете указывать разные ID текстуры для каждого кадра, чтобы обрабатывать случае, когда SDK необходимо дважды или трижды буферизовать изображения, в которые Unity выполняет рендеринг. Подключаемый модуль поставщика отвечает за управление набором UnityXRRenderTextureId.

Жизненный цикл кадра

За жизненный цикл кадра отвечают два метода: PopulateNextFrameDesc, который выполняется непосредственно перед началом рендеринга, и SubmitCurrentFrame , что происходит сразу после завершения рендеринга. Оба метода вызываются в графическом потоке.

Во время PopulateNextFrameDesc поставщик отображения должен выполнить следующие действия:

  • Дождитесь каденции (подождите, пока Unity снова начнет отправлять команды рендеринга). Кроме того, это можно сделать в SubmitCurrentFrame.
  • Получить следующее изображение и сообщить Unity, какие идентификаторы текстур следует отрисовывать, с помощью параметра nextFrame.

Во время выполнения метода SubmitCurrentFrame поставщик отображения должен выполнить следующие действия:

  • Отправьте последний кадр в полете (например, текстуры глаз или текстуры глубины) для отображения на экране.
  • Дождитесь каденса в качестве альтернативы ожиданию во время PopulateNextFrameDesc.

Блокировка каденса

Чтобы поддерживать минимально возможную задержку и максимальную пропускную способность при рендеринге на дисплее HMD, необходимо обеспечить точное время при получении поз и отправке текстур. Каждый HMD имеет собственную частоту обновления, с которой работает их компоновщик. Рендеринг со скоростью, превышающей эту, приводит к неоптимальному результату из-за несоответствия времени или избыточной работы.

Unity ожидает, что поставщик дисплея будет блокировать или ожидать частоты кадров в течение жизненного цикла кадра. Unity начинает отправлять команды рендеринга вскоре после «пробуждения» после блокирующего вызова. Вы должны синхронизировать время пробуждения с вашим композитором в определенном окне. Некоторые SDK предоставляют плавающее окно времени пробуждения на основе эвристики. Oculus называет это «очередью впереди» (см. Документация для разработчиков Oculus для получения дополнительной информации). Valve называет это «разбег» (см. слайды 18 и 19 этой презентации).

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

Где ждать каденса

Поставщики могут ожидать каденции либо в PopulateNextFrameDesc, либо в SubmitCurrentFrame.

Пока Unity отправляет графические команды для кадра в графическом потоке, цикл моделирования следующего кадра выполняется в основном потоке. Он содержит физику, логику сценария и т. д. PopulateNextFrameDesc вызывается в графическом потоке после отправки всех команд рендеринга и только после имитации следующего кадра и всех запланированных графических заданий. на нем завершены. Одним из графических заданий, которых ожидает PopulateNextFrameDesc, является SubmitCurrentFrame для текущего кадра. Вот почему можно дождаться каденса в SubmitCurrentFrame. Кроме того, Unity не начнет рендеринг, пока не завершится PopulateNextFrameDesc.

Учитывая эти детали, есть некоторые компромиссы между ожиданием каденса в SubmitCurrentFrame по сравнению с PopulateNextFrameDesc. Например, ожидание каденса в SubmitCurrentFrame может вызвать проблемы с производительностью, если приложение планирует дорогостоящие графические задания во время моделирования. Поскольку запуск SubmitCurrentFrame запланирован после рендеринга, графические задания, запланированные приложением, будут выполняться после SubmitCurrentFrame, но до PopulateNextFrameDesc. В этом случае провайдер ожидает в SubmitCurrentFrame, а затем просыпается, ожидая, что Unity начнет рендеринг. Однако Unity обрабатывает графические задания, запланированные приложением, до вызова PopulateNextFrameDesc, что, в свою очередь, позволяет Unity начать отрисовку. Эта задержка между пробуждением для рендеринга и обработкой графических заданий, запланированных в методе обновления, может привести к задержке. Разработчики могут оптимизировать это, планируя свои графические задания после рендеринга, чтобы гарантировать, что графические задания запланированы до SubmitCurrentFrame.

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

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

Когда Unity вызывает SubmitCurrentFrame, текстуры, которые вы настроили в последнем кадре, были обработаны или Unity отправила графическому драйверу команды рендеринга для их рендеринга. Теперь Unity покончила с ними, и вы можете передать их своему компоновщику.

Заполнение дескриптора следующего кадра

После блокировки или получения следующего кадра для рендеринга вы должны сообщить Unity, какие текстуры рендерить в следующем кадре, и какова компоновка проходов рендеринга (см. «Проходы рендеринга» ниже).

Проходы рендеринга

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

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

Для каждого кадра поставщик отображения устанавливает UnityXRRenderPass и заполняет UnityXRRenderTextureId, которые Unity будет отображать в следующий кадр.

Случаи использования UnityXRRenderPass включают следующее:

  • Двухпроходный стереорендеринг (2 RenderPass x 1 RenderParams)
  • Однопроходный стереорендеринг (1 RenderPass x 2 RenderParams)

API поддерживает следующие дополнительные случаи (но сейчас Unity может реагировать некорректно):

  • QuadПримитивный объект, напоминающий плоскость, но его ребра имеют длину всего одну единицу, он использует только 4 вершины, а поверхность ориентированы в плоскости XY локального координатного пространства. Подробнее
    См. в Словарь
    передать стереорендеринг с широким полем зрения (4 RenderPass x 1 RenderParams)< /li>
  • Один проход + стереорендеринг с широким полем зрения (1 RenderPass x 2 RenderParams + 2 RenderPass x 1 RenderParams)
  • Визуализация с ямками:
    • Две отдельные текстуры для каждого глаза (внутреннего и внешнего)
    • Одна текстура, УФ-подгонка.
  • Сценарий внешнего вида (HoloLens BEV, третий глаз Mayo) (дополнительный RenderPass)
  • Ближний/дальний рендеринг для компоновки объектов или людей в сцене (2 RenderPass, разные проекции, разные цели)

Можно делать следующие предположения:

  • Одна текстура за проход (однопроходная — это один массив текстур)
  • При однопроходном режиме две позы/проекции за проход (или фовеальный рендеринг)

Примечание. Проект Unity и XR SDK должны использовать один и тот же параметр (включен/отключен) для однопроходного рендеринга, поскольку этот параметр влияет на пользовательские шейдерыПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь
. Чтобы проверить, включен ли однопроходный рендеринг, используйте UnityXRFrameSetupHints.appSetup.singlePassRendering.

Отбраковка проходов

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

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3