Unity 6.3
0 онлайн 42 гостей 3 в системе
Вход

Введение в векторы движения в URP

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

Unity запускает проход рендеринга вектора движения только тогда, когда в кадре есть активные элементы с проходами рендеринга, которые его требуют. Например, следующие элементы URP требуют проход рендеринга вектора движения: временное сглаживание и размытие движения. Информацию о том, как требовать проход рендеринга вектора движения в пользовательских проходах, см. в разделе Использование текстуры вектора движения в проходах.

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

URP поддерживает векторы движения только для непрозрачных материалов, включая материалы с альфа-обрезкой. URP не поддерживает векторы движения для прозрачных материалов.

Детали осуществления

В этом разделе описывается, как URP реализует векторы движения.

Вектор движения

Вектор движения представляет собой вектор 2D, представляющий движение фрагмента поверхности относительно камеры с последнего кадра, проецированного на близкую к камере плоскость обрезки. Текстура вектора движения использует 2 канала (R и G). Каждый тексель хранит смещение UV каждого видимого фрагмента поверхности. Если вы вычтете вектор движения для данного текселя из его текущей координаты UV, вы получите координату UV того места, где этот тексель находился бы на последнем кадре экрана. Вычисленная координата последнего кадра UV может находиться за пределами границ экрана.

Векторы движения объекта и векторы движения только камеры

Существуют две категории векторов движения:

  • Camera векторы движения: векторы движения, вызванные только движением самой камеры.

  • Векторы движения объекта: векторы движения, вызванные комбинацией движения камеры и движения в пространстве-времени объекта, к которому принадлежит фрагмент.

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

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

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

Случаи, когда Unity отображает векторы движения по объектам

Unity отображает векторы движения объекта для сетки в кадре, когда выполнены следующие три условия:

  1. Шейдер, связанный с сеткой, имеет MotionVectors проход в активном блоке SubShader.

  2. Сетка отображается с помощью любого из следующих рендеров:

    1. SkinnedMeshRenderer.

    2. MeshRenderer, когда его Векторы движения свойство не установлено Camera Motion Only.

    3. Используя следующий APIs: Graphics.RenderMesh, Graphics.RenderMeshInstanced или Graphics.RenderMeshIndirect, с указанием MotionVectorMode член Совета RenderParams структура, не заданная как Camera.

  3. Если выполнено любое из следующих условий:

    1. MotionVectorGenerationMode свойство установлено на ForceNoMotion по вопросу MeshRenderer или RenderParams.MotionVectorMode член-структура Grphics.Render... APIs.

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

    2. MotionVectors — это проход, который включён для материала (например, когда материал содержит вершинную анимацию в Shader Graph или анимацию Alembic).

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

MotionVectors пропускает в URP предварительно встроенные шейдеры

Когда пропуск MotionVectors включен для предустановленных шейдеров, Unity рендирует векторы движения объектов для сеточных рендеров, даже если они не движутся.

Unity включает проходы MotionVectors в предварительно построенных шейдерах URP, когда выполнены следующие условия:

  • URP ShaderLab шейдеры: на Материале, Векторы движения свойство включено в Дополнительные параметры раздел.

  • URP Включенные и выключенные Shader Graph шейдеры: в Графе Inspectorустановлено любое из следующих свойств:

    • Алембические векторы движения включены.
    • Дополнительные векторы движения Свойство имеет значение TimeBased или Пользовательское.