본문 바로가기

커스텀 머티리얼과의 통합

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

색상과 알파 외에도 파티클별 속력, 수명 비율, 사용자 정의 값을 머티리얼에 전달할 수 있습니다. 예를 들어 속력으로 발광 강도를, 충돌에서 계산한 값으로 패턴을, 파티클별 난수로 노이즈 모양을 조절합니다.

Niagara와 Material 사이의 전달 경로

머티리얼에서 임의의 Particles.* 이름을 입력하면 모든 속성을 읽어 주는 공통 노드를 가정해서는 안 됩니다. 이 실습은 Dynamic Material Parameter와 Renderer Binding을 사용합니다.

Niagara 모듈에서 표시할 값을 계산합니다. 사용자 정의 속성이 필요하다면 먼저 만들고 기록합니다. CustomFloat라는 속성이 모든 이미터에 자동으로 존재하는 것은 아닙니다.

Particles.DynamicMaterialParameter의 네 성분에 값을 기록합니다. 한 묶음은 Float 4개이며, 벡터·색상 데이터를 전달할 때 각 성분의 의미를 정합니다.

Sprite Renderer의 Dynamic Material Binding이 이 속성을 읽는지 확인합니다. 추가 묶음은 Dynamic Material 1/2/3 Binding과 대응하는 인덱스를 사용합니다.

머티리얼에 DynamicParameter 노드를 추가하고 같은 Parameter Index를 선택합니다. 아래 예제는 인덱스 0의 첫 번째 출력(Param1/R)을 사용합니다. 출력 표시 이름을 바꾸는 것만으로 임의의 Niagara 속성이 자동 바인딩되지는 않습니다.

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

본문의 별도 계산 예제인 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에 곱한다. 힘·저항이 없는 같은 입자의 속력은 유지되지만 화면 노출·톤 매핑·실제 광원 생성은 이 계산값으로 보장하지 않는다.

직접 해 보기: 속력에 비례하는 발광

NS_BasicSpawn을 복제하고 머티리얼 이름은 M_VelocityGlow로 정합니다.

나이아가라 시스템 설정

Emitter State를 활성 상태로 유지하고 Emitter Update의 Spawn Rate를 100으로 둡니다. Particle Spawn의 Initialize Particle에서 Lifetime을 1~2초, Sprite Size를 50, Color를 RGBA (1,1,1,1)로 정합니다.

Particle Spawn의 Add Velocity에서 X/Y는 0, Z는 200~500 cm/s 범위로 설정합니다. 초기 속도를 Particle Update에서 매 틱 더하지 않습니다. Particle Update에는 Particle State와 Solve Forces and Velocity를 두고 수명 종료 시 제거되게 합니다.

solver 뒤에 Particle Update용 Scratch Pad 모듈을 추가합니다. 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)로 초기화합니다. 같은 속성을 쓰는 다른 모듈은 결과를 덮어쓰지 않게 합니다.

커스텀 머티리얼 생성 및 설정

새 Material M_VelocityGlow를 만들고 Blend Mode를 Additive, Shading Model을 Unlit으로 설정합니다.

Particle Color, DynamicParameter(Index 0), 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 속력이 다른 입자끼리는 배율이 달라집니다. “위로 이동하므로 정점에서 느려진다”는 결과는 중력 없이 발생하지 않습니다.

선택 실습으로 solver 앞에 Gravity Force를 추가해 아래 방향 가속도를 적용해 보세요. 수직 운동의 정점 부근에서는 속력이 작아져 어두워지고, 낙하하며 속력이 커지면 다시 밝아지는 것이 예상됩니다. 발광이 과하면 단위를 유지한 채 배율과 의도한 상한을 조절합니다.

예시: 속력의 단위에서 발광 배율까지 따라가기

solver 뒤의 Velocity가 (300, 400, 0) cm/s라면 Length는 sqrt(300² + 400²) = 500 cm/s입니다. 0.01을 곱한 배율은 5이고 Map Set에 기록할 Vector4는 (5, 1, 1, 1)입니다. Renderer 바인딩을 거쳐 Index 0의 첫 출력이 이 5를 읽으면, Particle Color의 RGB (1, 0.5, 0.2)는 Emissive 입력 (5, 2.5, 1)이 됩니다. 0.01은 이 예에서 속력 100 cm/s당 배율 1을 만드는 환산 계수이며, 속력과 배율의 단위가 같다는 뜻은 아닙니다.

방향과 생존 상태를 분리하기

같은 모듈에서 Velocity를 (0, 0, −300) cm/s로 바꾸면 첫 출력의 배율은 무엇일까요? 이어서 속도가 0인 샘플에서도 Lifetime이 남아 있다고 가정합니다. 발광 배율 0만으로 입자가 제거되는지, 머티리얼이 다른 Index나 채널을 읽으면 계산값이 자동으로 도착하는지도 판단하세요.

길이·기록·바인딩을 구별한 풀이

길이는 300 cm/s이므로 배율은 3입니다. 낙하 방향의 음수 성분을 그대로 밝기 −3으로 읽지 않습니다. 속도 0의 배율은 0이지만 이 모듈은 Particle State나 Kill을 기록하지 않아 생존 종료가 자동으로 일어나지 않습니다. 기록한 Vector4, Renderer Binding, Material Index 0·첫 채널을 맞춰야 하며 다른 인덱스나 채널에서 같은 값을 읽는다고 가정하지 않습니다.

전달할 값과 비용 확인

  • Float는 한 채널, Vector3는 세 채널을 사용하도록 성분 배치를 문서화합니다. Color와 데이터 제어값을 혼동하지 않습니다.
  • User.* 값은 외부 입력입니다. 같은 이름을 머티리얼에 붙이는 것만으로 연결되지 않으며 Niagara 계산과 바인딩 경로를 거쳐야 합니다.
  • 머티리얼 인스턴스가 실제 Renderer에 할당됐는지, 바인딩 인덱스와 채널이 맞는지부터 확인합니다.
  • 파티클별 계산과 픽셀별 계산은 실행 빈도가 다릅니다. 필요 없는 노이즈·텍스처 샘플을 줄이고 목표 장면에서 비용을 비교합니다.

전달 규칙은 Epic의 DynamicParameter 설명과 Renderer Binding 참조를 참고합니다.