Custom Vertex Streams в Unity. Принцип работы и возможности

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

Однако иногда этих настроек не хватает, чтобы полноценно реализовать идею художника по эффектам. Например, когда нужно заанимировать какой-то параметр в материале, но для каждой частички индивидуально, в зависимости от времени ее жизни. Для таких случаев в системе частиц Shuriken в движке Unity существует модуль Custom Data и настройка Custom Vertex Streams, о которых мы и поговорим в этой статье.

Принцип работы

Стандартные настройки системы частиц влияют на данные, которые хранятся в вершинах меша частичек. Они меняют позицию и цвет, а также UV-координаты, в случае когда используется модуль Texture Sheet Animation. Это изменение касается первых двух элементов вектора UV-координат: texcoord0.xy.
При использовании Custom Data данные помещаются в элементы вектора texcoord0.zw, а если их больше двух, то следующие данные идут во второй канал координат — в texcoord1.xyzw, следующие — в texcoord2.xyzw и так далее. Всего можно задать до 8 разных значений: два вектора с 1 до 4 элементов в каждом, которые можно также представить в виде цвета RGBA. В системе частиц они именуются Custom1 и Custom2.

illust_1.jpg

illust_2.jpg

Далее в модуле Renderer необходимо обозначить, какие из этих данных будут передаваться в свободные текстурные координаты шейдера. Их можно указать в любом порядке, в том числе и дублировать, и от этого порядка будет зависеть, в какую именно координату запишется значение.

illust_3.jpg

illust_4.jpg

Эти данные можно использовать в своих целях, если позволяет шейдер.
Чтобы шейдер мог взаимодействовать с Custom Data системы частиц, в его коде должно быть предусмотрено использование выше описанных текстурных координат. Например, если мы хотим влиять с помощью Custom Vertex Streams на яркость частицы (умножать ее цвет — color — на некий коэффициент), то во фрагментном шейдере будет находиться следующая строчка:

color = color * texcoord0.z;

При этом в шейдере нужно заранее указать в структуре входных данных вершины, что texcoord0 имеет размерность 3 или 4, чтобы новым данным было куда записываться.

Теперь рассмотрим, как с помощью Custom Vertex Streams создать эффект с использованием систем частиц с различными хитрыми шейдерами, в которых дополнительные UV-координаты влияют на параметры.

Разбор эффекта «Три стихии»

1.gif

Этот эффект полностью состоит из систем частиц, каждая из которых использует Custom Vertex Streams.

Стихия льда

Элементы этой части эффекта — появляющиеся снежинки, изморозь, клубящиеся облака пара, кристаллические частицы, а также точки и линии.

Снежинки


Текстура снежинок проявляется, а затем плавно растворяется из центра. За эти действия в шейдере отвечает один параметр с диапазоном 0–1, где текстура начинает проявляться изнутри к внешнему краю, если значение начинается в единице и движется к нулю. Полностью текстура проявляется где-то на значении 0,5. Этот параметр привязан к texcoord0.z, поэтому им можно управлять с помощью Custom Data в системе частиц. Построив линейный график вида x = –y (где x — значение параметра, y — время жизни частицы)

illust_6.jpg

и указав эти данные в Custom Vertex Streams как texcoord0.z,

illust_7.jpg

мы привяжем этот параметр к жизни частиц.

2.gif

Изморозь

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

3.gif

Облака пара

В материале этого элемента две текстуры смешиваются и образуют уникальный узор.

4.gif

Для рандомного смещения текстур их координаты привязаны ко второму каналу UV-координат системы частиц.

Графики зависимости значений от жизни частицы в модуле Custom Data представляют собой две линейные кривые, и берется случайное значение между ними.

illust_11.jpg

Затем 4 таких значения привязываются к texcoord1.xyzw в настройке Custom Vertex Streams.

illust_12.jpg

Обратите внимание, что первые два значения заполняют последние две переменные вектора первого канала координат. Поэтому, чтобы наши значения для смещений полностью ушли во второй канал, мы создали другой набор из двух пустых значений (Custom1.xy) и привязали их первыми, чтобы они заполнили неиспользуемые нами координаты.

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

5.gif

Кристаллические частицы

Их материал настроен таким образом, что перелив идет с одной стороны к другой и управляется параметром, который также привязан к texcoord0.z линейной зависимостью, как в случае со снежинками.

6.gif

Для некоего разнообразия в текстуре узор, по которому идет перелив, может смещаться, и это смещение привязывается к первым двум координатам второго канала texcoord1.xy. Значение у каждой частицы берется случайно от 0 до 1, что обеспечивает каждый раз случайный узор.

7.gif

Точки и линии

У точек к Custom Data привязана яркость, которая может быть больше 1. Это делает их динамику более интересной, чем если бы это было просто изменение прозрачности.

График выглядит следующим образом:

illust_16.jpg

Как видно из графика, во время вспышек яркость достигает достаточно высоких значений.

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

8.gif

Стихия огня

В этой части эффекта линии, дым и точки реализованы по тому же принципу, что и в предыдущей части (стихии льда). Но есть и новые элементы.

Огненные линии

Огненные линии реализованы с помощью системы частиц, использующей 3D-меш в виде изогнутого цилиндра.

illust_18.jpg

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

9.gif

Также к прозрачности применен множитель Френеля, чтобы скрыть цилиндрическую форму.

Как и в случае с облаками, здесь смещение обеих текстур привязано ко второму каналу UV — texcoord1.xyzw. У первой текстуры график смещения по оси вдоль цилиндра представляет собой линейную зависимость, для того чтобы поток всегда начинался в начале жизни частицы. Смещение же второй текстуры представлено случайными значениями, что придает каждой частице уникальный узор.

illust_20.gif

Стихия молнии

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

illust_21.jpg

Заключение

Мы рассмотрели лишь несколько примеров применения Custom Vertex Streams в системе частиц, однако они показывают, насколько широко и разнообразно можно использовать эту технологию. К тому же значения можно привязывать не только к жизни частиц, но также к скорости, позиции, ID вершины, импульсу шума и так далее. Все это в совокупности открывает перед художниками по эффектам обширные возможности для реализации своих идей.

754 0 850 4
0
RENDER.RU