Частичні шейдери

Частичні шейдери — це особливий тип шейдерів, який запускається перед малюванням об’єкта. Вони використовуються для розрахунку властивостей матеріалу, таких як колір, положення та обертання. Вони малюються будь-яким звичайним матеріалом для CanvasItem або Spatial, залежно від того, 2D чи 3D.

Частичні шейдери унікальні, оскільки вони не використовуються для малювання самого об'єкта; вони використовуються для обчислення властивостей частинок, які потім використовуються шейдером CanvasItem або Spatial. Вони містять дві функції процесора: start() і process().

На відміну від інших типів шейдерів, частинкові шейдери зберігають дані, які були виведені в попередньому кадрі. Таким чином, часткові шейдери можна використовувати для складних ефектів, які відбуваються в кількох кадрах.

Примітка

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

Вузли частинок на основі процесора (CPUParticles2D і CPUParticles3D) відображаються на графічному процесорі (це означає, що вони можуть використовувати власні шейдери CanvasItem або Spatial), але їхній рух імітується на ЦП.

Режими візуалізації

Режим візуалізації

Опис

Keep_data

Не очищайте попередні дані під час перезавантаження.

Disable_force

Вимкнути силу притягання.

Disable_velocity

Ігнорувати значення VELOCITY.

Collision_use_scale

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

Вбудовані

Значення, позначені як in, доступні лише для читання. Значення, помічені як out, можуть бути записані за бажанням і не обов’язково міститимуть розумні значення. Значення, помічені як inout, забезпечують розумне значення за замовчуванням і, за бажанням, можуть бути записані. До семплерів не можна писати, тому вони не позначені.

Глобальні вбудовані функції

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

Вбудований

Опис

In float 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().

Function

Опис

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.

Запустити вбудовані модулі

Вбудований

Опис

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).

Вбудовані процеси

Вбудований

Опис

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);

Function

Опис

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

Випромінює частинку з підвипромінювача.