Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Керуйте тисячами риб за допомогою частинок
Проблема з MeshInstance3D полягає в тому, що оновлювати їх масив трансформації дорого. Це чудово підходить для розміщення багатьох статичних об’єктів навколо сцени. Але все одно важко переміщати предмети по сцені.
Щоб кожен екземпляр рухався цікавим способом, ми будемо використовувати вузол GPUParticles3D. Частинки використовують переваги прискорення GPU, обчислюючи та встановлюючи інформацію для кожного екземпляра в Shader.
Спочатку створіть вузол Particles. Потім у розділі «Пропуски малювання» встановіть параметр «Прохід малювання 1» для вашої Mesh. Потім у розділі «Process Material» створіть новий ShaderMaterial.
Встановіть shader_type на particles.
shader_type particles
Потім додайте такі дві функції:
float rand_from_seed(in uint seed) {
int k;
int s = int(seed);
if (s == 0)
s = 305420679;
k = s / 127773;
s = 16807 * (s - k * 127773) - 2836 * k;
if (s < 0)
s += 2147483647;
seed = uint(s);
return float(seed % uint(65536)) / 65535.0;
}
uint hash(uint x) {
x = ((x >> uint(16)) ^ x) * uint(73244475);
x = ((x >> uint(16)) ^ x) * uint(73244475);
x = (x >> uint(16)) ^ x;
return x;
}
Ці функції походять із стандартного ParticleProcessMaterial. Вони використовуються для генерації випадкового числа з RANDOM_SEED кожної частинки.
Унікальна особливість частинкових шейдерів полягає в тому, що деякі вбудовані змінні зберігаються між кадрами. Доступ до TRANSFORM, COLOR і CUSTOM можна отримати в шейдері сітки, а також у шейдері частинок під час наступного запуску.
Далі налаштуйте свою функцію start(). Частинні шейдери містять функції start() і process().
Код у функції start() запускається лише під час запуску системи частинок. Код у функції process() завжди виконуватиметься.
Нам потрібно згенерувати 4 випадкові числа: 3 для створення випадкової позиції та одне для випадкового зміщення циклу плавання.
По-перше, згенеруйте 4 зерна у функції start() за допомогою функції hash(), наданої вище:
uint alt_seed1 = hash(NUMBER + uint(1) + RANDOM_SEED);
uint alt_seed2 = hash(NUMBER + uint(27) + RANDOM_SEED);
uint alt_seed3 = hash(NUMBER + uint(43) + RANDOM_SEED);
uint alt_seed4 = hash(NUMBER + uint(111) + RANDOM_SEED);
Потім використовуйте ці початкові числа для генерації випадкових чисел за допомогою rand_from_seed:
CUSTOM.x = rand_from_seed(alt_seed1);
vec3 position = vec3(rand_from_seed(alt_seed2) * 2.0 - 1.0,
rand_from_seed(alt_seed3) * 2.0 - 1.0,
rand_from_seed(alt_seed4) * 2.0 - 1.0);
Нарешті, призначте position TRANSFORM[3].xyz, який є частиною перетворення, яка містить інформацію про місцезнаходження.
TRANSFORM[3].xyz = position * 20.0;
Пам’ятайте, що весь цей код досі міститься у функції start().
Вершиний шейдер для вашої сітки може залишатися таким же, як і в попередньому посібнику.
Тепер ви можете переміщувати кожну рибу окремо в кожному кадрі, додаючи безпосередньо до TRANSFORM або записуючи VELOCITY.
Давайте перетворимо рибу, встановивши її VELOCITY у функції start().
VELOCITY.z = 10.0;
Це найпростіший спосіб встановити ШВИДКІСТЬ, кожна частинка (або риба) матиме однакову швидкість.
Просто встановивши VELOCITY, ви можете змусити рибу плисти як завгодно. Наприклад, спробуйте код нижче.
VELOCITY.z = cos(TIME + CUSTOM.x * 6.28) * 4.0 + 6.0;
Це надасть кожній рибі унікальну швидкість від 2 до 10.
Ви також можете дозволити кожній рибі змінювати свою швидкість з часом, якщо встановите швидкість у функції process().
Якщо ви використовували CUSTOM.y в минулому підручнику, ви також можете встановити швидкість анімації плавання на основі VELOCITY. Просто використовуйте CUSTOM.y.
CUSTOM.y = VELOCITY.z * 0.1;
Цей код дає вам таку поведінку:
Використовуючи ParticleProcessMaterial, ви можете зробити поведінку риби настільки простою чи складною, як вам подобається. У цьому підручнику ми встановлюємо лише швидкість, але у ваших власних шейдерах ви також можете встановити COLOR, обертання, масштаб (за допомогою TRANSFORM). Будь ласка, зверніться до Particles Shader Reference для отримання додаткової інформації про шейдери частинок.