Шейдеры частиц (particle)

Шейдеры частиц - это особый тип шейдеров, которые запускаются до отрисовки объекта. Они используются для вычисления свойств материала, таких как цвет, положение и вращение. Они рисуются вместе с любым обычным материалом для CanvasItem или Spatial, в зависимости от того, являются ли они 2D или 3D.

Шейдеры частиц уникальны тем, что они не используются для отрисовки самого объекта, а служат для расчета свойств частиц, которые затем используются шейдером CanvasItem или Spatial. Они содержат две функции процессора: start() и process().

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

Примечание

Шейдеры частиц доступны только для узлов частиц на базе GPU (GPUParticles2D и GPUParticles3D).

Узлы частиц на базе CPU (CPUParticles2D и CPUParticles3D) отрисовываются на GPU (что означает, что они могут использовать пользовательские шейдеры CanvasItem или Spatial), но их движение симулируется на CPU.

Режимы визуализации

Режим рендеринга

Описание

kеep_data

Не удаляет предыдущие данные при перезапуске.

disаble_force

Отключить силу притяжения.

disаble_velocity

Игнорировать значение VELOCITY.

collision_use_scale

Масштабирует размер частицы для столкновений.

Встроенные функции

Значения, отмеченные как in, доступны только для чтения. Значения, отмеченные как out, могут быть записаны и не обязательно содержат осмысленные значения. Значения, отмеченные как inout, предоставляют осмысленное значение по умолчанию и могут быть записаны. Сэмплеры не могут быть записаны, поэтому они не отмечены.

Глобальные встроенные функции

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

Встроенный

Описание

в плавающем TIME

Глобальное время с момента запуска движка, в секундах. Оно повторяется каждые 3600 секунд (это можно изменить с помощью параметра rollover). На него влияет параметр time_scale, но не пауза. Если вам нужна переменная TIME, не зависящая от масштаба времени, добавьте свою собственную переменную global shader uniform и обновляйте её в каждом кадре.

в float PI

Константа PI (3.141592). Отношение длины окружности к её диаметру и количеству радиан в полуобороте.

в float TAU

Константа TAU (6.283185). Эквивалент PI * 2 и количество радианов в полном обороте.

В float E

Константа E (2,718281). Число Эйлера и основание натурального логарифма.

Встроенные Start и Process

Доступ к этим свойствам можно получить как из функций start(), так и из process().

Функция

Описание

in float LIFETIME

Время жизни частицы.

in float DELTA

Дельта времени процесса.

in uint NUMBER

Уникальный номер с момента начала эмиссии.

in uint INDEX

Индекс частиц (от общего количества частиц).

in mat4 EMISSION_TRANSFORM

Преобразование эмиттера (используется для нелокальных систем).

in uint RANDOM_SEED

Случайное начальное число используемое в качестве основы для случайного числа.

inout bool ACTIVE

true, когда частица активна, может быть установлено false.

inout vec4 COLOR

Цвет частицы можно записать и получить к нему доступ в вершинной функции сетки.

inout vec3 VELOCITY

Скорость частиц, может быть изменена.

inout mat4 TRANSFORM

Преобразование частиц.

inout vec4 CUSTOM

Пользовательские данные частиц. Доступны из шейдера сетки как INSTANCE_CUSTOM.

inout float MASS

Масса частицы, предназначенная для использования с аттракторами. По умолчанию равна 1.0.

in vec4 USERDATAX

Вектор, который позволяет интегрировать дополнительные пользовательские данные в шейдер процесса частиц. USERDATAX — это шесть встроенных переменных, идентифицированных по номеру, X может быть числом от 1 до 6, например USERDATA3.

in uint FLAG_EMIT_POSITION

Флаг для использования в последнем аргументе функции emit_subparticle() для назначения позиции преобразованию новой частицы.

in uint FLAG_EMIT_ROT_SCALE

Флаг для использования в последнем аргументе функции emit_subparticle() для назначения поворота и масштаба преобразованию новой частицы.

in uint FLAG_EMIT_VELOCITY

Флаг для использования в последнем аргументе функции emit_subparticle() для назначения скорости новой частице.

in uint FLAG_EMIT_COLOR

Флаг для использования в последнем аргументе функции emit_subparticle() для назначения цвета новой частице.

in uint FLAG_EMIT_CUSTOM

Флаг для использования в последнем аргументе функции emit_subparticle() для назначения пользовательского вектора данных новой частице.

in vec3 EMITTER_VELOCITY

Скорость узла Particles2D (3D).

in float INTERPOLATE_TO_END

Значение свойства interp_to_end (3D) узла Particles.

in uint AMOUNT_RATIO

Значение свойства amount_ratio (3D) узла Particles.

Примечание

Чтобы использовать переменную COLOR в StandardMaterial3D, установите vertex_color_use_as_albedo в true. В ShaderMaterial доступ к ней осуществляется с помощью переменной COLOR.

Встроенные константы функции Start

Встроенный

Описание

in bool RESTART_POSITION

true, если частица перезапущена или испущена без заданной позиции (т.е. эта частица была создана с помощью emit_subparticle() без флага FLAG_EMIT_POSITION).

in bool RESTART_ROT_SCALE

true, если частица перезапущена или испущена без заданного вращения или масштаба (т.е. эта частица была создана с помощью emit_subparticle() без флага FLAG_EMIT_ROT_SCALE).

in bool RESTART_VELOCITY

true, если частица перезапущена или испущена без заданной скорости (т.е. эта частица была создана с помощью emit_subparticle() без флага FLAG_EMIT_VELOCITY).

in bool RESTART_COLOR

true, если частица перезапущена или испущена без пользовательского цвета (т.е. эта частица была создана с помощью emit_subparticle() без флага FLAG_EMIT_COLOR).

in bool RESTART_CUSTOM

true, если частица перезапущена или испущена без пользовательского свойства (т.е. эта частица была создана с помощью emit_subparticle() без флага FLAG_EMIT_CUSTOM).

Встроенные константы функции Process

Встроенный

Описание

in bool RESTART

true, если текущий кадр процесса является первым для частицы.

in bool COLLIDED

true, когда частица столкнулась с коллайдером частиц.

in vec3 COLLISION_NORMAL

Нормаль последнего столкновения. Если столкновение не обнаружено, оно равно (0.0, 0.0, 0.0).

in float COLLISION_DEPTH

Длина нормали последнего столкновения. Если столкновение не обнаружено, она равна 0.0.

in vec3 ATTRACTOR_FORCE

Суммарная сила аттракторов, действующих в данный момент на эту частицу.

Функции процесса

emit_subparticle() в настоящее время — единственная пользовательская функция, поддерживаемая шейдерами частиц. Она позволяет пользователям добавлять новую частицу с заданными параметрами из подэмиттера. Вновь созданная частица будет использовать только те свойства, которые соответствуют параметру flags. Например, следующий код создаст частицу с заданным положением, скоростью и цветом, но без заданных угла поворота, масштаба и настраиваемого значения:

mat4 custom_transform = mat4(1.0);
custom_transform[3].xyz = vec3(10.5, 0.0, 4.0);
emit_subparticle(custom_transform, vec3(1.0, 0.5, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(1.0), FLAG_EMIT_POSITION | FLAG_EMIT_VELOCITY | FLAG_EMIT_COLOR);

Функция

Описание

bool emit_subparticle (mat4 xform, vec3 velocity, vec4 color, vec4 custom, uint flags)

Испускает частицу из sub-emitter.