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...
입자로 수천 마리의 물고기 제어
:ref:`MeshInstance3D <class_MeshInstance3D>`의 문제점은 변환 배열을 업데이트하는 데 비용이 많이 든다는 것입니다. 씬 주변에 많은 정적 개체를 배치하는 데 적합합니다. 하지만 씬 주변의 물체를 이동하는 것은 여전히 어렵습니다.
각 인스턴스를 흥미로운 방식으로 움직이게 하기 위해 GPUParticles3D 노드를 사용합니다. 입자는 :ref:`셰이더 <class_Shader>`에서 인스턴스별 정보를 계산하고 설정하여 GPU 가속을 활용합니다.
먼저 입자 노드를 만듭니다. 그런 다음 "Draw Passes"에서 입자의 "Draw Pass 1"을 :ref:`Mesh <class_Mesh>`으로 설정합니다. 그런 다음 "Process Material"에서 새로운 :ref:`ShaderMaterial <class_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;
}
이러한 함수는 기본 :ref:`ParticleProcessMaterial <class_ParticleProcessMaterial>`에서 제공됩니다. 이는 각 입자의 ``RANDOM_SEED``에서 난수를 생성하는 데 사용됩니다.
입자 셰이더의 독특한 점은 일부 내장 변수가 프레임 전체에 걸쳐 저장된다는 것입니다. TRANSFORM, COLOR 및 ``CUSTOM``는 모두 메시의 셰이더에서 액세스할 수 있으며 다음에 실행될 때 파티클 셰이더에서도 액세스할 수 있습니다.
다음으로 start() 기능을 설정하세요. 입자 셰이더에는 start() 기능과 process() 기능이 포함되어 있습니다.
start() 함수의 코드는 파티클 시스템이 시작될 때만 실행됩니다. process() 함수의 코드는 항상 실행됩니다.
우리는 4개의 난수를 생성해야 합니다. 3개는 무작위 위치를 생성하고 하나는 수영 주기의 무작위 오프셋을 생성합니다.
먼저 위에 제공된 hash() 함수를 사용하여 start() 함수 내에서 4개의 시드를 생성합니다.
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``에 작성하여 각 프레임마다 각 물고기를 개별적으로 이동할 수 있습니다.
start() 함수에서 ``VELOCITY``를 설정하여 물고기를 변형해 보겠습니다.
VELOCITY.z = 10.0;
이것은 모든 입자(또는 물고기)가 동일한 속도를 갖도록 ``VELOCITY``를 설정하는 가장 기본적인 방법입니다.
``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``를 통해)을 설정할 수도 있습니다. 파티클 셰이더에 대한 자세한 내용은 :ref:`파티클 셰이더 참조 <doc_particle_shader>`를 참조하세요.