본문 바로가기

커스텀 머티리얼과의 통합

나이아가라에서 계산한 파티클 속성을 커스텀 머티리얼에 전달해 속도에 따라 발광 강도가 달라지는 표현을 구현합니다.

기본 머티리얼 설정과 적용에서는 Particle Color로 입자의 색과 알파를 머티리얼에 넘겼습니다. 그런데 머티리얼에 넘기고 싶은 값은 색만이 아닙니다. 빠르게 날아가는 입자일수록 밝게 빛나게 하거나, 충돌에서 계산한 값으로 무늬를 바꾸거나, 입자마다 다른 난수로 노이즈의 모양을 바꾸고 싶을 수 있습니다. 이 글에서는 입자의 속력이나 수명 비율, 직접 정한 값을 머티리얼로 넘기는 경로를 살펴보고, 속력에 비례해 밝아지는 발광 효과를 만들어 봅니다.


나이아가라에서 머티리얼로 값을 넘기는 경로

먼저 흔한 오해부터 짚고 갑니다. 머티리얼 안에 Particles. 뒤에 아무 이름이나 적으면 그 속성을 읽어 주는 공통 노드가 있다고 생각하기 쉽지만, 그런 노드는 없습니다. 값을 넘기려면 정해진 경로를 거쳐야 하며, 이 글에서는 동적 머티리얼 파라미터(Dynamic Material Parameter)와 렌더러 바인딩을 씁니다.

경로는 네 단계로 이어집니다. 첫째, 나이아가라 모듈에서 넘길 값을 계산합니다. 직접 정한 속성이 필요하다면 먼저 만들어 값을 써야 하며, CustomFloat 같은 속성이 모든 이미터에 처음부터 있는 것은 아닙니다. 둘째, 계산한 값을 Particles.DynamicMaterialParameter의 네 성분에 씁니다. 이 속성은 Float 네 개를 한 묶음으로 담으므로, 벡터나 색을 넘길 때는 각 성분에 무엇을 담을지 정해 둡니다. 셋째, Sprite Renderer의 Dynamic Material Binding이 이 속성을 읽는지 확인합니다. 묶음이 더 필요하면 Dynamic Material 1, 2, 3 Binding과 그에 맞는 인덱스를 씁니다. 넷째, 머티리얼에 DynamicParameter 노드를 추가하고 같은 Parameter Index를 고릅니다. 아래 실습은 인덱스 0의 첫 번째 출력(Param1, R)을 씁니다. 출력의 표시 이름을 바꾸는 것만으로 다른 나이아가라 속성이 저절로 연결되지는 않습니다.


속력에 비례해 밝아지는 발광

이제 입자가 빠를수록 밝게 빛나는 효과를 만들어 봅니다. NS_BasicSpawn을 복제해 쓰고, 새로 만들 머티리얼의 이름은 M_VelocityGlow로 정합니다.

나이아가라 쪽 설정

먼저 입자의 기본값을 정합니다. Emitter State를 켜진 상태로 두고, Emitter Update의 Spawn Rate를 100으로 둡니다. Particle Spawn의 Initialize Particle에서 Lifetime은 1초에서 2초 사이, 스프라이트 크기는 50, Color는 RGBA (1, 1, 1, 1)로 정합니다.

다음으로 속도를 줍니다. Particle Spawn의 Add Velocity에서 X와 Y는 0, Z는 200cm/s에서 500cm/s 사이의 값으로 둡니다. 초기 속도를 Particle Update에서 틱마다 더하지 않도록 주의합니다. Particle Update에는 Particle State와 Solve Forces and Velocity를 두고, 수명이 다하면 입자가 사라지게 합니다.

그다음 발광 배율을 계산하는 모듈을 만듭니다. Solve Forces and Velocity 뒤에 Particle Update용 스크래치 패드 모듈을 추가하고, Map Get으로 Particles.Velocity를 읽어 Length로 속력을 구한 뒤 0.01을 곱합니다. 즉 이 실습의 발광 배율은 속력(cm/s) × 0.01입니다. 이 값을 Map Set으로 Particles.DynamicMaterialParameter에 (발광 배율, 1, 1, 1)로 쓰고, 입력 맵을 Map Set을 거쳐 Output Module로 잇습니다. 입자가 생긴 직후에도 값이 분명하도록, Particle Spawn에서 이 Vector4를 (1, 1, 1, 1)로 초기화해 둡니다. 같은 속성을 쓰는 다른 모듈이 있다면 이 결과를 덮어쓰지 않게 합니다.

머티리얼 쪽 설정

새 머티리얼 M_VelocityGlow를 만들고 Blend Mode를 Additive, Shading Model을 Unlit으로 둡니다. 그래프에 Particle Color와 Parameter Index가 0인 DynamicParameter, 그리고 Multiply 노드를 추가하고, DynamicParameter의 첫 번째 출력을 발광 배율로 씁니다. Particle Color의 RGB에 발광 배율을 곱한 결과를 Emissive Color에, Particle Color의 Alpha를 Opacity에 연결합니다. 한 장짜리 텍스처를 쓰고 싶다면 앞 글처럼 RGB와 Alpha에 각각 텍스처의 채널을 곱합니다.

머티리얼을 저장해 Sprite Renderer에 지정한 뒤, Dynamic Material Binding이 Particles.DynamicMaterialParameter인지, Color Binding이 Particles.Color인지 확인합니다.

결과 예상하기

힘이나 저항이 없다면 입자는 초기 속력을 계속 유지하므로, 살아 있는 동안 밝기도 일정할 것으로 예상됩니다. 초기 Z 속력이 다른 입자끼리는 배율이 다르므로 서로 밝기가 다릅니다. 위로 올라가니 꼭대기에서 느려지리라는 생각은 중력이 있을 때의 이야기이며, 중력이 없으면 그런 변화는 생기지 않습니다.

선택 실습으로 Solve Forces and Velocity 앞에 Gravity Force를 넣어 아래쪽 가속도를 주어 봅니다. 그러면 위로 올라가다 꼭대기 근처에서 속력이 작아져 어두워지고, 떨어지며 속력이 커지면 다시 밝아질 것으로 예상됩니다. 발광이 지나치게 밝다면 단위는 그대로 둔 채 배율과 원하는 상한을 조절합니다.


속력에서 발광까지 따라가기

속력의 계산과 머티리얼 채널 바인딩

본문의 별도 계산 예제인 solver 뒤 Velocity=(300,400,0) cm/s와 Particle Color RGB=(1,0.5,0.2)를 선택한다. Length 500→배율 5→Vector4(5,1,1,1) 기록→Renderer 바인딩→Index 0 첫 출력 5→Emissive 입력 (5,2.5,1)을 추적한다. 힘·저항이 없는 조건이면 같은 입자의 속력이 유지되며 화면 밝기·광원 생성은 별도이다.

속력의 계산과 머티리얼 채널 바인딩

NIAGARA · CH6-2

속력 배율을 렌더러 바인딩으로 전달합니다

solver 뒤에서 속력(cm/s)을 구해 0.01을 곱하고 Vector4 첫 성분에 기록합니다. 머티리얼의 Index 0·첫 출력이 이 배율을 읽습니다.

속력의 계산과 머티리얼 채널 바인딩Niagara가 속력 배율을 Vector4의 첫 성분에 기록하고 Renderer가 전달합니다. 머티리얼의 DynamicParameter 첫 출력이 발광 배율이 됩니다.
Niagara 계산Length(Velocity) × 0.01DynamicMaterialParameter.x 기록
연결 관계Niagara 계산 · Length(Velocity) × 0.01 · DynamicMaterialParameter.x 기록 → Sprite Renderer · Dynamic Material Binding
Sprite RendererDynamic Material Binding
연결 관계Sprite Renderer · Dynamic Material Binding → Material · Index 0 · DynamicParameter 첫 출력
Material · Index 0DynamicParameter 첫 출력
연결 관계Material · Index 0 · DynamicParameter 첫 출력 → RGB × 전달된 배율 · Emissive Color
RGB × 전달된 배율Emissive Color
속력 계산에서 바인딩을 거쳐 발광 입력을 읽는다원desktop4노드3간선과동일하다. solver뒤LengthVelocity×0.01을DynamicMaterialParameter첫성분에기록하고SpriteRendererBinding→MaterialIndex0첫출력→RGB배율Emissive로전달한다. 자동광원생성이나파티클제거의관계가아니다.
Niagara 계산Length(Velocity) × 0.01DynamicMaterialParameter.x 기록
연결 관계Niagara 계산 · Length(Velocity) × 0.01 · DynamicMaterial · Parameter.x 기록 → Sprite Renderer · Dynamic Material · Binding
Sprite RendererDynamic MaterialBinding
연결 관계Sprite Renderer · Dynamic Material · Binding → Material · Index 0 · DynamicParameter · 첫 출력
Material · Index 0DynamicParameter첫 출력
연결 관계Material · Index 0 · DynamicParameter · 첫 출력 → RGB × 전달된 배율 · Emissive Color
RGB × 전달된 배율Emissive Color

단위와 채널

200cm/s → 배율2, 500cm/s → 배율5입니다. 속도벡터의 Length이며 성분별 Abs와 구분합니다.

본문은 DynamicMaterialParameter=(배율,1,1,1)을 씁니다. 생성 시에는(1,1,1,1)로 초기화합니다.

소비 연결

Sprite Renderer의 Dynamic Material Binding, Material Parameter Index 0, 첫 채널을 서로 맞춥니다.

힘이 없는 기준 실습

초기 속력을 유지하므로 같은 입자의 배율도 일정합니다. 중력을 추가한 선택 실습에서는 속력 변화에 따라 배율이 달라집니다.

배율은 Emissive 입력의 계산값입니다. 화면 밝기는 재질·노출·톤매핑 등에 영향받으며 자동 광원 생성이나 주변 조명 성공을 뜻하지 않습니다.

채널의 의미와 인덱스를 양쪽에서 맞춥니다. 이름만 같은 임의의 파티클 속성이 머티리얼에 자동 전달되는 구조가 아닙니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
원 도표의 제목·노드·관계·조건·주석
범위원문
본문·주석solver 뒤에서 속력 (cm/s)을 구해 0.01을 곱하고 Vector4 첫 성분에 기록합니다. 머티리얼의 Index 0·첫 출력이 이 배율을 읽습니다.
관계·조건 설명원 도표와 같은 4개 노드·3개 간선이다. solver 뒤 Velocity의 Length×0.01을 DynamicMaterialParameter 첫 성분에 기록하고, Sprite Renderer 바인딩→머티리얼 Index 0 첫 출력→RGB에 배율을 곱한 Emissive 입력으로 전달한다. 자동 광원 생성이나 파티클 제거를 나타내는 관계가 아니다.
본문·주석200 cm/s → 배율 2, 500 cm/s → 배율 5입니다. 속도 벡터의 Length이며 성분별 Abs와 구분합니다.
본문·주석본문은 DynamicMaterialParameter=(배율,1,1,1)을 씁니다. 생성 시에는 (1,1,1,1)로 초기화합니다.
본문·주석배율은 Emissive 입력의 계산값입니다. 화면 밝기는 재질·노출·톤매핑 등에 영향을 받으며 자동 광원 생성이나 주변 조명 성공을 뜻하지 않습니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
solver 뒤 계산

Velocity=(300,400,0) cm/s의 Length 500에 0.01을 곱해 배율 5를 얻는다.

  • 선택 Velocity: (300,400,0) cm/s
  • Length: √(300²+400²)=500 cm/s
  • 배율: 500×0.01=5
  • solver 뒤 현재 Velocity를 읽으므로 Z 성분의 부호나 성분별 Abs를 배율로 쓰지 않는다. 이 입력은 본문의 별도 계산 예제이다.
채널 기록·전달

DynamicMaterialParameter=(5,1,1,1)을 기록하고 Sprite Renderer의 지정 바인딩으로 전달한다.

  • Vector4: (5,1,1,1)
  • Binding: Particles.DynamicMaterialParameter
  • Map Set이 첫 성분 5를 기록하고 Renderer의 Dynamic Material Binding이 같은 속성을 참조해야 한다. 이름만 같은 임의 속성은 자동 전달되지 않는다.
재질 소비

Index 0 첫 출력의 5와 Particle Color RGB=(1,0.5,0.2)를 곱해 Emissive 입력 (5,2.5,1)을 만든다.

  • Index 0 첫 출력: 5
  • 선택 RGB: (1,0.5,0.2)
  • Emissive 입력: (5,2.5,1)
  • 첫 채널의 같은 배율 5를 RGB에 곱한다. 힘·저항이 없는 같은 입자의 속력은 유지되지만 화면 노출·톤 매핑·실제 광원 생성은 이 계산값으로 보장하지 않는다.

속력의 계산과 머티리얼 채널 바인딩

본문의 별도 계산 예제인 solver 뒤 Velocity=(300,400,0) cm/s와 Particle Color RGB=(1,0.5,0.2)를 선택한다. Length 500→배율 5→Vector4(5,1,1,1) 기록→Renderer 바인딩→Index 0 첫 출력 5→Emissive 입력 (5,2.5,1)을 추적한다. 힘·저항이 없는 조건이면 같은 입자의 속력이 유지되며 화면 밝기·광원 생성은 별도이다.

속력의 계산과 머티리얼 채널 바인딩

NIAGARA · CH6-2

속력 배율을 렌더러 바인딩으로 전달합니다

solver 뒤에서 속력(cm/s)을 구해 0.01을 곱하고 Vector4 첫 성분에 기록합니다. 머티리얼의 Index 0·첫 출력이 이 배율을 읽습니다.

속력의 계산과 머티리얼 채널 바인딩Niagara가 속력 배율을 Vector4의 첫 성분에 기록하고 Renderer가 전달합니다. 머티리얼의 DynamicParameter 첫 출력이 발광 배율이 됩니다.
Niagara 계산Length(Velocity) × 0.01DynamicMaterialParameter.x 기록
연결 관계Niagara 계산 · Length(Velocity) × 0.01 · DynamicMaterialParameter.x 기록 → Sprite Renderer · Dynamic Material Binding
Sprite RendererDynamic Material Binding
연결 관계Sprite Renderer · Dynamic Material Binding → Material · Index 0 · DynamicParameter 첫 출력
Material · Index 0DynamicParameter 첫 출력
연결 관계Material · Index 0 · DynamicParameter 첫 출력 → RGB × 전달된 배율 · Emissive Color
RGB × 전달된 배율Emissive Color
속력 계산에서 바인딩을 거쳐 발광 입력을 읽는다원desktop4노드3간선과동일하다. solver뒤LengthVelocity×0.01을DynamicMaterialParameter첫성분에기록하고SpriteRendererBinding→MaterialIndex0첫출력→RGB배율Emissive로전달한다. 자동광원생성이나파티클제거의관계가아니다.
Niagara 계산Length(Velocity) × 0.01DynamicMaterialParameter.x 기록
연결 관계Niagara 계산 · Length(Velocity) × 0.01 · DynamicMaterial · Parameter.x 기록 → Sprite Renderer · Dynamic Material · Binding
Sprite RendererDynamic MaterialBinding
연결 관계Sprite Renderer · Dynamic Material · Binding → Material · Index 0 · DynamicParameter · 첫 출력
Material · Index 0DynamicParameter첫 출력
연결 관계Material · Index 0 · DynamicParameter · 첫 출력 → RGB × 전달된 배율 · Emissive Color
RGB × 전달된 배율Emissive Color

단위와 채널

200cm/s → 배율2, 500cm/s → 배율5입니다. 속도벡터의 Length이며 성분별 Abs와 구분합니다.

본문은 DynamicMaterialParameter=(배율,1,1,1)을 씁니다. 생성 시에는(1,1,1,1)로 초기화합니다.

소비 연결

Sprite Renderer의 Dynamic Material Binding, Material Parameter Index 0, 첫 채널을 서로 맞춥니다.

힘이 없는 기준 실습

초기 속력을 유지하므로 같은 입자의 배율도 일정합니다. 중력을 추가한 선택 실습에서는 속력 변화에 따라 배율이 달라집니다.

배율은 Emissive 입력의 계산값입니다. 화면 밝기는 재질·노출·톤매핑 등에 영향받으며 자동 광원 생성이나 주변 조명 성공을 뜻하지 않습니다.

채널의 의미와 인덱스를 양쪽에서 맞춥니다. 이름만 같은 임의의 파티클 속성이 머티리얼에 자동 전달되는 구조가 아닙니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.

관계도의 보충 설명

원 도표의 제목·노드·관계·조건·주석
범위원문
본문·주석solver 뒤에서 속력 (cm/s)을 구해 0.01을 곱하고 Vector4 첫 성분에 기록합니다. 머티리얼의 Index 0·첫 출력이 이 배율을 읽습니다.
관계·조건 설명원 도표와 같은 4개 노드·3개 간선이다. solver 뒤 Velocity의 Length×0.01을 DynamicMaterialParameter 첫 성분에 기록하고, Sprite Renderer 바인딩→머티리얼 Index 0 첫 출력→RGB에 배율을 곱한 Emissive 입력으로 전달한다. 자동 광원 생성이나 파티클 제거를 나타내는 관계가 아니다.
본문·주석200 cm/s → 배율 2, 500 cm/s → 배율 5입니다. 속도 벡터의 Length이며 성분별 Abs와 구분합니다.
본문·주석본문은 DynamicMaterialParameter=(배율,1,1,1)을 씁니다. 생성 시에는 (1,1,1,1)로 초기화합니다.
본문·주석배율은 Emissive 입력의 계산값입니다. 화면 밝기는 재질·노출·톤매핑 등에 영향을 받으며 자동 광원 생성이나 주변 조명 성공을 뜻하지 않습니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
solver 뒤 계산

Velocity=(300,400,0) cm/s의 Length 500에 0.01을 곱해 배율 5를 얻는다.

  • 선택 Velocity: (300,400,0) cm/s
  • Length: √(300²+400²)=500 cm/s
  • 배율: 500×0.01=5
  • solver 뒤 현재 Velocity를 읽으므로 Z 성분의 부호나 성분별 Abs를 배율로 쓰지 않는다. 이 입력은 본문의 별도 계산 예제이다.
채널 기록·전달

DynamicMaterialParameter=(5,1,1,1)을 기록하고 Sprite Renderer의 지정 바인딩으로 전달한다.

  • Vector4: (5,1,1,1)
  • Binding: Particles.DynamicMaterialParameter
  • Map Set이 첫 성분 5를 기록하고 Renderer의 Dynamic Material Binding이 같은 속성을 참조해야 한다. 이름만 같은 임의 속성은 자동 전달되지 않는다.
재질 소비

Index 0 첫 출력의 5와 Particle Color RGB=(1,0.5,0.2)를 곱해 Emissive 입력 (5,2.5,1)을 만든다.

  • Index 0 첫 출력: 5
  • 선택 RGB: (1,0.5,0.2)
  • Emissive 입력: (5,2.5,1)
  • 첫 채널의 같은 배율 5를 RGB에 곱한다. 힘·저항이 없는 같은 입자의 속력은 유지되지만 화면 노출·톤 매핑·실제 광원 생성은 이 계산값으로 보장하지 않는다.

위 그림은 속력의 계산이 머티리얼의 채널에 닿기까지의 경로를 보여 줍니다. 왼쪽의 나이아가라 계산에서 Solve Forces and Velocity 뒤에 Length(Velocity) × 0.01을 구해 DynamicMaterialParameter의 첫 성분(x)에 씁니다. 그 값을 Sprite Renderer의 Dynamic Material Binding이 읽어 넘기고, 머티리얼에서는 Index 0인 DynamicParameter의 첫 출력이 이를 받아, RGB에 곱한 결과가 Emissive Color로 들어갑니다.

그림 아래의 설명은 단위와 연결 조건을 짚습니다. 200cm/s는 배율 2, 500cm/s는 배율 5가 되며, 이 값은 속도 벡터의 Length이므로 성분마다 부호를 없애는 Abs와는 다릅니다. 이 글은 DynamicMaterialParameter를 (배율, 1, 1, 1)로 쓰고 생성할 때는 (1, 1, 1, 1)로 초기화하며, 렌더러의 Dynamic Material Binding과 머티리얼의 Parameter Index 0, 첫 채널을 서로 맞춰야 합니다. 힘이 없는 기본 실습에서는 같은 입자의 배율이 일정하고, 중력을 더한 선택 실습에서만 속력에 따라 배율이 바뀝니다. 또 이 배율은 Emissive Color 입력의 계산값일 뿐이어서, 화면의 밝기는 머티리얼과 노출, 톤매핑의 영향을 받고 주변을 비추는 광원이 저절로 생기지도 않습니다. 단계 그림은 이 경로를 나이아가라의 계산, 렌더러 바인딩, 머티리얼의 채널 순서로 나누어 보여 줍니다.

숫자로 한 번 따라가 봅니다. Solve Forces and Velocity 뒤의 속도가 (300, 400, 0)cm/s라면 길이는 sqrt(300² + 400²) = 500cm/s입니다. 여기에 0.01을 곱한 배율은 5이므로, Map Set으로 쓸 Vector4는 (5, 1, 1, 1)입니다. 렌더러 바인딩을 거쳐 Index 0의 첫 출력이 이 5를 읽으면, Particle Color의 RGB가 (1, 0.5, 0.2)일 때 Emissive Color 입력은 (5, 2.5, 1)이 됩니다. 여기서 0.01은 속력 100cm/s마다 배율 1이 되게 하는 환산 계수이며, 속력과 배율의 단위가 같다는 뜻은 아닙니다.


넘길 값과 비용 확인하기

값을 넘길 때는 몇 가지를 정리해 둡니다. Float 하나는 한 채널을, Vector는 세 채널을 쓰므로, 어느 성분에 무엇을 담았는지 문서로 남깁니다. 색과 데이터 제어 값을 같은 채널에 섞어 헷갈리지 않게 합니다. User.로 시작하는 값은 바깥에서 넣는 입력이어서, 머티리얼에 같은 이름을 붙인다고 연결되지 않으며 나이아가라의 계산과 바인딩 경로를 거쳐야 합니다.

결과가 이상할 때는 머티리얼 인스턴스가 실제 렌더러에 지정되어 있는지, 바인딩의 인덱스와 채널이 맞는지부터 확인합니다. 비용도 따져 봅니다. 입자마다 하는 계산과 픽셀마다 하는 계산은 실행되는 횟수가 크게 다르므로, 필요 없는 노이즈나 텍스처 샘플을 줄이고 목표 장면에서 비용을 비교합니다.


정리

  • 머티리얼에는 아무 입자 속성이나 읽어 주는 공통 노드가 없으며, 색 말고 다른 값은 동적 머티리얼 파라미터와 렌더러 바인딩으로 넘깁니다.
  • 나이아가라에서 계산한 값을 Particles.DynamicMaterialParameter의 네 성분에 쓰고, 렌더러의 Dynamic Material Binding이 이를 읽습니다.
  • 머티리얼의 DynamicParameter 노드는 렌더러 바인딩과 같은 Parameter Index와 채널을 골라야 값을 받을 수 있습니다.
  • 속력 발광은 Length(Velocity) × 환산 계수로 배율을 구해 첫 성분에 쓰고, 머티리얼에서 RGB에 곱해 Emissive Color에 연결합니다.
  • 배율은 머티리얼 입력의 값이며 화면 밝기나 주변 조명을 보장하지 않고, 입자마다의 계산과 픽셀마다의 계산은 비용이 다릅니다.

연습 문제

1. 아래로 떨어지는 속도

같은 모듈에서 속도를 (0, 0, -300)cm/s로 바꾸면 첫 출력의 배율은 얼마일까요? 이어서 속도가 0인 입자도 아직 Lifetime이 남아 있다고 할 때, 발광 배율 0만으로 입자가 사라질까요? 머티리얼이 다른 Index나 채널을 읽으면 계산한 값이 저절로 도착할까요?

해설 보기

길이는 300cm/s이므로 배율은 300 × 0.01 = 3입니다. 아래로 떨어지는 방향의 음수 성분을 그대로 밝기 -3으로 읽지 않는데, Length는 방향과 상관없이 크기만 구하기 때문입니다.

속도가 0이면 배율은 0이지만, 이 모듈은 Particle State나 Kill을 쓰지 않으므로 입자가 사라지지 않습니다. 화면에서 어두워질 뿐 수명이 다할 때까지 살아 있습니다. 또 Map Set으로 쓴 Vector4와 렌더러 바인딩, 머티리얼의 Index 0과 첫 채널을 모두 맞춰야 하며, 다른 인덱스나 채널에서 같은 값을 읽을 수 있다고 가정하지 않습니다.

2. 생기자마자 깜빡이는 입자

배율을 쓰는 모듈을 Particle Update에만 두고 Particle Spawn에서 초기화하지 않았더니, 입자가 생기는 순간 아주 어둡거나 엉뚱한 밝기로 한 번 깜빡입니다. 왜 그럴까요?

해설 보기

입자가 생긴 첫 프레임에 Particle Update의 모듈이 아직 값을 쓰기 전에 그려지면, DynamicMaterialParameter가 정하지 않은 값으로 머티리얼에 넘어갈 수 있습니다. 그 값이 0이면 아주 어둡게, 다른 값이면 엉뚱한 밝기로 보입니다.

그래서 Particle Spawn에서 이 Vector4를 (1, 1, 1, 1)처럼 분명한 값으로 초기화해 둡니다. 그러면 첫 프레임에도 정해 둔 기본 밝기로 그려지고, 그 뒤부터 Update의 계산이 배율을 바꿉니다.

3. 이름을 맞췄는데 오지 않는 값

나이아가라에서 Particles.GlowAmount라는 속성을 만들어 값을 쓰고, 머티리얼의 DynamicParameter 첫 출력 이름도 GlowAmount로 바꿨습니다. 그런데 머티리얼에는 값이 오지 않습니다. 무엇이 빠졌을까요?

해설 보기

머티리얼의 출력 이름을 바꾸는 것은 표시를 바꿀 뿐, 나이아가라 속성과 이어 주지 않습니다. 값은 Particles.DynamicMaterialParameter에 써야 렌더러의 Dynamic Material Binding을 거쳐 머티리얼로 넘어갑니다.

GlowAmount를 계속 쓰고 싶다면, 그 값을 Particles.DynamicMaterialParameter의 첫 성분에 옮겨 쓰거나 렌더러의 Dynamic Material Binding이 맞는 속성을 읽도록 설정하고, 머티리얼에서는 같은 Parameter Index와 첫 채널을 읽습니다.

값을 넘기는 규칙은 Epic의 머티리얼 파라미터 표현식 문서에 있는 DynamicParameter 설명과 나이아가라 렌더러 레퍼런스의 바인딩 항목에서 확인할 수 있습니다.

다음 글 렌더링 효과 적용에서는 Sprite와 Mesh, Ribbon, Light 렌더러의 표현과 비용을 비교하고, Mesh Renderer로 회전하며 떨어지는 폭발 파편을 만들어 봅니다.