파티클 시스템의 기본 개념
파티클의 수명·위치·속도·색상·크기가 Spawn·Update·Render 단계를 거쳐 시각 효과와 성능 비용을 만드는 원리를 이해합니다.
나이아가라를 처음 열면 멋진 효과를 빨리 만들고 싶은 마음이 앞서기 쉽습니다. 그런데 기본 개념 없이 숫자만 바꿔 보면, 파티클이 왜 갑자기 사라졌는지나 프레임이 왜 갑자기 떨어졌는지를 설명하기 어렵습니다. 화면에 보이는 결과만 따라가다 보면 파티클을 만드는 단계와 움직이는 단계, 그리는 단계가 각각 무슨 일을 하는지 놓치기 때문입니다. 이 글에서는 화려한 연출보다 먼저 파티클 시스템이 어떻게 동작하는지를 잡아 두고, 그 원리로 살아 있는 파티클의 수를 미리 계산해 봅니다. 원리를 알면 이후의 장에서 감에 기대지 않고 결과를 예측하며 수치를 조절할 수 있습니다.
작은 입자가 모여 하나의 효과가 된다
파티클 시스템(particle system)은 이름 그대로 아주 작은 입자(particle)들의 집합입니다. 입자 하나하나는 단순한 점이나 작은 이미지에 불과하지만, 수십에서 수천 개가 모여 각자 움직이고 변하면 불꽃이나 연기, 먼지처럼 복잡한 모습으로 보입니다. 그래서 작은 요소가 많이 모여 이루어지는 효과는 파티클로 표현하기 좋습니다.
입자마다 수명, 위치, 속도, 색, 크기 같은 속성(attribute)을 따로 가집니다. 예를 들어 불티 하나는 0.8초를 살면서 위로 떠오르고, 그동안 주황색에서 어두운 빨간색으로 바뀌며 조금씩 작아질 수 있습니다. 이 속성들이 시간에 따라 바뀌기 때문에 효과가 살아 움직이는 것처럼 보입니다.
파티클 시스템이 하는 일은 크게 네 가지로 나눌 수 있습니다.
- 파티클(Particle): 시각 효과를 이루는 가장 작은 단위로, 각자 고유한 속성 값을 가집니다.
- 생성(Spawn): 파티클이 언제, 어디서, 어떤 초기값으로 처음 나타날지를 정합니다. 불꽃놀이의 폭죽이 터지는 순간처럼 입자가 처음 생기는 위치와 방식을 결정합니다.
- 업데이트(Update): 생성된 파티클이 시간이 지나면서 어떻게 움직이고 변할지를 정합니다. 속도, 색, 크기, 회전 같은 속성의 변화와 중력이나 바람 같은 물리적인 움직임이 여기에 들어갑니다.
- 렌더링(Render): 파티클을 화면에 어떤 모양으로 그릴지를 정합니다. 2D 이미지인 스프라이트(sprite)로 그릴지, 3D 모델인 메시(mesh)로 그릴지, 이어진 띠로 그릴지 같은 것을 고릅니다.
입자의 생애와 화면 출력은 다른 관계입니다
Spawn 초기화→살아 있는 Update 반복→수명/Kill 소멸이라는 실제 생애이다. Renderer는 각 생존 상태의 속성을 읽으며 소멸 다음 단계가 아니다.
NIAGARA · CH1-1
입자의 생애와 화면 출력은 다른 관계입니다
Spawn에서 초기화한 입자는 살아 있는 동안 Update를 반복합니다. Renderer는 그 속성을 읽어 화면에 표현하며, 소멸 다음에 실행되는 단계가 아닙니다.
실선은 생애 · 점선은 속성 읽기
실선은 새 입자의 초기화·갱신·소멸 관계입니다. 점선은 렌더러가 살아 있는 입자의 계산된 속성을 읽는 관계이며, 두 선을 하나의 직렬 실행 순서로 읽지 않습니다.
살아 있는 입자 수와 화면에서 구별되는 개수는 다릅니다. 입자가 살아 있어도 위치·크기·알파·머티리얼·Bounds 등에 따라 안 보일 수 있습니다. 이 그림은 기본 개념이며 모든 Niagara 실행 단계를 펼친 것은 아닙니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
| 범위 | 원문 |
|---|---|
| 관계·조건 설명 | 그림은 4개 노드·4개 간선으로 구성된다. Spawn 초기화→살아 있는 입자 Update, 살아 있는 동안 Update 반복, 수명/Kill 조건 충족 시 소멸을 나타낸다. Update에서 Renderer로 향하는 별도 점선은 살아 있는 입자의 속성 읽기이며 소멸 뒤 렌더 실행이 아니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| Spawn 초기화 새 입자의 초기 속성과 수명을 준비한다. |
|
|
| 살아 있는 Update 생존 입자가 반복 갱신된다. |
|
|
| 수명/Kill 종료 조건에서 입자 생애가 끝난다. |
|
|
입자의 생애와 화면 출력은 다른 관계입니다
Spawn 초기화→살아 있는 Update 반복→수명/Kill 소멸이라는 실제 생애이다. Renderer는 각 생존 상태의 속성을 읽으며 소멸 다음 단계가 아니다.
NIAGARA · CH1-1
입자의 생애와 화면 출력은 다른 관계입니다
Spawn에서 초기화한 입자는 살아 있는 동안 Update를 반복합니다. Renderer는 그 속성을 읽어 화면에 표현하며, 소멸 다음에 실행되는 단계가 아닙니다.
실선은 생애 · 점선은 속성 읽기
실선은 새 입자의 초기화·갱신·소멸 관계입니다. 점선은 렌더러가 살아 있는 입자의 계산된 속성을 읽는 관계이며, 두 선을 하나의 직렬 실행 순서로 읽지 않습니다.
살아 있는 입자 수와 화면에서 구별되는 개수는 다릅니다. 입자가 살아 있어도 위치·크기·알파·머티리얼·Bounds 등에 따라 안 보일 수 있습니다. 이 그림은 기본 개념이며 모든 Niagara 실행 단계를 펼친 것은 아닙니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
| 범위 | 원문 |
|---|---|
| 관계·조건 설명 | 그림은 4개 노드·4개 간선으로 구성된다. Spawn 초기화→살아 있는 입자 Update, 살아 있는 동안 Update 반복, 수명/Kill 조건 충족 시 소멸을 나타낸다. Update에서 Renderer로 향하는 별도 점선은 살아 있는 입자의 속성 읽기이며 소멸 뒤 렌더 실행이 아니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| Spawn 초기화 새 입자의 초기 속성과 수명을 준비한다. |
|
|
| 살아 있는 Update 생존 입자가 반복 갱신된다. |
|
|
| 수명/Kill 종료 조건에서 입자 생애가 끝난다. |
|
|
위 그림은 입자 하나의 생애와 화면 출력이 서로 다른 관계라는 점을 보여 줍니다. 실선을 따라가면 Spawn에서 위치, 속도, 수명, 색, 크기를 초기화한 입자가 Update로 넘어가고, 살아 있는 동안에는 시뮬레이션을 한 단계씩 진행하는 틱(tick)마다 Update를 반복하다가, 수명이 다하거나 Kill 조건을 만나면 소멸합니다. Renderer로 이어지는 점선은 Update 쪽에서 나오는데, 이는 렌더러가 살아 있는 입자의 계산된 속성을 읽어 화면에 표현한다는 뜻입니다. 앞의 목록에서는 렌더링을 네 번째로 적었지만, 그림이 보여 주듯 렌더링은 소멸 다음에 실행되는 단계가 아니며 소멸에서 Renderer로 가는 선은 없습니다.
단계 그림은 같은 생애를 세 장면으로 나누어 보여 줍니다. 첫 장면에서는 Spawn이 새 입자의 초기 속성과 수명을 준비하고, 둘째 장면에서는 살아 있는 입자가 반복해서 갱신되며, 셋째 장면에서는 수명이나 Kill 같은 종료 조건에서 입자의 생애가 끝납니다. 그림 아래의 설명처럼 입자가 살아 있다고 해서 반드시 화면에 보이는 것은 아닙니다. 위치, 크기, 알파, 머티리얼, 바운드(Bounds)에 따라 살아 있는 입자도 보이지 않을 수 있고, 이 그림은 기본 개념을 나타낸 것이라 나이아가라의 모든 실행 단계를 펼쳐 놓은 것은 아닙니다.
살아 있는 파티클은 몇 개일까
파티클을 일정한 속도로 계속 만드는 경우에는 살아 있는 파티클의 수를 간단히 어림할 수 있습니다. 생성률이 초당 20개이고 수명이 모두 1초로 같으며, 일찍 사라지거나 생성 수를 제한하는 조건이 없다고 해 봅시다. 충분히 시간이 지나면 1초 동안 새로 들어오는 20개만큼 오래된 20개가 빠져나가므로, 살아 있는 파티클은 약 20 × 1 = 20개로 유지됩니다. 이렇게 들어오는 수와 나가는 수가 같아져 개수가 일정해진 상태를 정상 상태(steady state)라고 부릅니다. 이 개수에는 카메라 밖에 있거나 서로 겹쳐 있는 입자도 들어가므로, 화면에서 하나하나 구별되는 개수와는 다릅니다.
시작 직후에는 정상 상태 식을 그대로 쓰면 안 됩니다. 초당 30개를 계속 만들고 각 입자가 정확히 2초 뒤에 사라진다고 해 봅시다. 빈 상태에서 시작한 첫 1초에는 아직 수명을 다한 입자가 없으므로 그동안 만든 약 30개가 모두 살아 있습니다. 2초가 지나면서부터 새로 들어오는 만큼 오래된 입자가 빠져나가기 시작하고, 그 뒤로는 약 30 × 2 = 60개가 유지됩니다.
| 시점 | 지금까지 만든 수 | 이미 사라진 수 | 살아 있는 수 |
|---|---|---|---|
| 1초 | 약 30 | 0 | 약 30 |
| 2초 | 약 60 | 0(막 사라지기 시작) | 약 60 |
| 3초 | 약 90 | 약 30 | 약 60 |
| 4초 | 약 120 | 약 60 | 약 60 |
표처럼 일정 속도로 계속 만드는 생성은 수명만큼 시간이 지나야 정상 상태에 이릅니다. 이 계산은 한 번에 정해진 수를 한꺼번에 만드는 버스트(Burst)의 개수 계산과는 다릅니다. 버스트는 생성률이 아니라 한 번에 만드는 개수와 반복 횟수로 세기 때문입니다.
더 많이 뿌리는 것과 더 좋아 보이는 것
같은 조건에서 Spawn Rate를 20에서 200으로 올리면 살아 있는 파티클도 약 200개로 늘어 화면이 더 빽빽해집니다. 하지만 그만큼 CPU나 GPU가 계산하고 그려야 할 일도 늘어나 프레임이 떨어질 수 있습니다. 즉 파티클 시스템을 만드는 일은 파티클을 많이 뿌리는 작업이 아니라, 원하는 연출과 성능 예산 사이에서 균형을 찾는 설계 작업입니다.
그렇다고 생성량을 10배로 늘렸을 때 전체 프레임 비용이 꼭 10배가 되는 것도 아닙니다. 비용은 파티클의 수와 입자 하나에 드는 계산, 그리고 화면에서 차지하는 면적이 함께 정하기 때문입니다. 크고 반투명한 면이 여러 겹 겹치면 같은 화소를 여러 번 칠하는 오버드로우(overdraw)가 생기고, 복잡한 머티리얼은 입자가 적어도 비용을 키울 수 있습니다.
그래서 첫 효과를 만들 때는 먼저 기준을 정해 두는 편이 좋습니다. 효과가 화면에서 차지할 비율(예: 10~20%)과 테스트 장면에서 허용할 프레임 시간 예산을 정하고 시작합니다. 화면 점유율은 생성량뿐 아니라 입자의 크기와 위치, 카메라와의 거리에도 영향을 받으므로, 생성량을 올리기 전에 수명과 속도, 크기를 하나씩 바꿔 원하는 모양을 먼저 만듭니다.
효과가 보이지 않을 때는 먼저 실제로 살아 있는 파티클의 수를 확인합니다. 수가 0이라면 생성 조건을 살펴보고, 살아 있는데 보이지 않는다면 위치, 크기, 알파, 렌더러, 머티리얼, 바운드를 차례로 확인합니다. 비용이 크게 나올 때는 시뮬레이션과 렌더링을 나누어 측정해야, 계산이 무거운지 그리는 일이 무거운지를 구별할 수 있습니다.
정리
- 파티클 시스템은 수명, 위치, 속도, 색, 크기 같은 속성을 가진 작은 입자들의 집합이며, 속성이 시간에 따라 바뀌어 효과가 만들어집니다.
- Spawn은 입자의 초기값을 정하고, Update는 살아 있는 동안 반복해서 속성을 바꾸며, 수명이나 Kill 조건에서 입자가 소멸합니다.
- 렌더러는 살아 있는 입자의 속성을 읽어 화면에 그리며, 소멸 다음에 실행되는 단계가 아닙니다.
- 일정 속도로 계속 만들 때 정상 상태의 살아 있는 개수는 약
생성률 × 수명이고, 시작 직후에는 지금까지 만든 수만큼만 살아 있습니다. - 살아 있는 개수와 화면에서 구별되는 개수는 다르며, 비용은 개수뿐 아니라 입자당 계산과 화면 면적, 오버드로우, 머티리얼이 함께 정합니다.
연습 문제
1. 1초 뒤와 정상 상태
초당 12개를 계속 만들고 각 입자의 수명은 3초이며, 빈 상태에서 시작합니다. 일찍 사라지는 입자나 컬링, 생성 제한은 없다고 할 때 1초 뒤와 정상 상태의 살아 있는 개수는 각각 얼마일까요? 카메라 밖의 입자도 살아 있다면, 이 개수가 화면에 보이는 개수와 같다고 말할 수 있을까요?
해설 보기
첫 1초에는 아직 사라진 입자가 없으므로 그동안 만든 약 12개가 살아 있습니다. 3초가 지난 뒤부터는 들어오는 만큼 빠져나가므로 정상 상태의 개수는 12 × 3 = 36개입니다. 정상 상태 식을 시작 직후에 그대로 적용하면 아직 만들지 않은 입자까지 센 셈이 됩니다.
두 개수는 같지 않습니다. 카메라 밖의 입자나 서로 겹친 입자는 따로 구별해 보이지 않을 수 있으므로, 살아 있는 개수와 화면에서 세는 개수는 다릅니다. 또 이 값은 단순한 생성률과 수명으로 계산한 것이며 실제 프레임 시간을 측정한 값은 아닙니다.
2. 보이지 않는 파티클
효과를 레벨에 놓았는데 화면에 아무것도 보이지 않습니다. 무엇부터 확인해야 할까요?
해설 보기
먼저 살아 있는 파티클의 수를 확인해 문제를 둘로 나눕니다. 수가 0이라면 입자가 아예 생성되지 않은 것이므로 생성률이나 버스트 같은 Spawn 조건을 봅니다.
수가 0이 아닌데 보이지 않는다면 입자는 살아 있지만 그려지지 않거나 보이지 않는 곳에 있는 것입니다. 이때는 위치와 크기, 알파 값, 렌더러가 붙어 있는지, 머티리얼이 올바른지, 그리고 바운드가 실제 효과를 감싸는지를 차례로 확인합니다.
3. 생성량을 10배로
Spawn Rate를 10배로 올렸더니 화면이 훨씬 빽빽해졌습니다. 프레임 비용도 정확히 10배가 된다고 말할 수 있을까요?
해설 보기
그렇게 말할 수 없습니다. 살아 있는 파티클의 수는 생성률에 비례해 늘지만, 프레임 비용은 입자 하나에 드는 계산과 화면에서 차지하는 면적, 반투명 면이 겹치는 오버드로우, 머티리얼의 복잡도가 함께 정합니다.
그래서 비용이 커지면 시뮬레이션과 렌더링을 나누어 측정해 어느 쪽이 늘었는지 확인합니다. 입자 수는 적어도 크고 겹치는 반투명 면이 많다면 렌더링 쪽 비용이 더 크게 늘 수 있습니다.
나이아가라가 시스템과 이미터, 모듈로 효과를 구성하는 방식은 Epic의 나이아가라 개요에서 확인할 수 있습니다.
다음 글 캐스케이드와 나이아가라의 차이에서는 언리얼 엔진의 이전 파티클 도구인 캐스케이드와 나이아가라가 효과를 구성하는 방식을 비교합니다.