스크래치패드 모듈
Niagara의 Scratch Pad에서 커스텀 모듈을 시각적으로 제작하고 HLSL을 활용하는 방법을 학습합니다.
Scratch Pad란 무엇인가
로컬 커스텀 모듈 제작 환경
Scratch Pad는 Niagara 에디터 내에서 커스텀 모듈을 만들 수 있는 노드 그래프 편집기입니다. C++ 프로그래밍 없이 시각적으로 모듈 로직을 설계하고, 필요하면 Custom HLSL 노드로 직접 셰이더 코드를 작성할 수도 있습니다.
| 특성 | Scratch Pad 모듈 | 일반 Module Script |
|---|---|---|
| 저장 위치 | Emitter/System 내부에 임베드 | 콘텐츠 브라우저에 독립 에셋 |
| 재사용 | 해당 Emitter/System 전용 | 모든 곳에서 재사용 가능 |
| 제작 속도 | 빠름 (인라인 편집) | 별도 에셋 관리 필요 |
| 프로모션 | 독립 에셋으로 승격(Promote) 가능 | 이미 독립 에셋 |
프로토타이핑 단계에서는 Scratch Pad로 빠르게 모듈을 만들고, 여러 곳에서 재사용이 필요하면 Promote to Asset을 통해 독립 에셋으로 승격하세요.
Scratch Pad 워크플로
커스텀 모듈 생성부터 적용까지
커스텀 모듈 생성 절차
- 스택에서 + 버튼 클릭 → Scratch Pad Module 선택하여 새 모듈 추가
- 하단 Scratch Pad 탭에서 노드 그래프 편집기가 열림
- Map Get 노드로 입력 파라미터를 읽고, 로직을 구성
- Map Set 노드로 결과를 Parameter Map에 기록
- Apply 버튼을 눌러 변경사항 적용
핵심 노드 타입
| 노드 | 역할 | 사용 예 |
|---|---|---|
Map Get |
Parameter Map에서 값 읽기 | Particles.Position, Particles.Velocity 읽기 |
Map Set |
Parameter Map에 값 쓰기 | 계산 결과를 Particles.Color에 기록 |
Input Map |
모듈 외부에서 설정 가능한 입력 | Selection 패널에서 사용자가 조절하는 값 |
Custom HLSL |
인라인 HLSL 코드 실행 | 복잡한 수학 연산, 커스텀 알고리즘 |
Math 노드들 |
덧셈, 곱셈, Lerp, Clamp 등 | 값 변환, 보간, 범위 제한 |
// 목표: 속도가 임계값 이상인 파티클만 색상을 빨간색으로 변경
// Map Get 노드에서 읽기:
Input: Particles.Velocity // 현재 속도
Input: SpeedThreshold // 임계값 (Module Input)
Input: Particles.Color // 현재 색상
// 로직 구성:
VectorLength(Velocity) → CurrentSpeed
CurrentSpeed > SpeedThreshold → IsAboveThreshold // bool
Select(IsAboveThreshold, Particles.Color, Red) → NewColor
// Map Set 노드에 쓰기:
Output: Particles.Color = NewColor
Custom HLSL 노드 활용
인라인 셰이더 코드로 고급 로직 구현
Custom HLSL 노드를 사용하면 Scratch Pad 그래프 내에서 직접 HLSL(High Level Shading Language) 코드를 작성할 수 있습니다. 노드 그래프로 표현하기 어려운 복잡한 수학 연산이나 루프 등에 유용합니다.
// Custom HLSL 노드의 코드
// 입력: InPosition (Vector3), InCenter (Vector3),
// InStrength (float), InRadius (float)
// 출력: OutForce (Vector3)
float3 Offset = InPosition - InCenter;
float Distance = length(Offset);
float Falloff = saturate(1.0 - Distance / InRadius);
// 접선 방향 계산 (Y-up 기준)
float3 Tangent = normalize(cross(Offset, float3(0, 0, 1)));
OutForce = Tangent * InStrength * Falloff * Falloff;
1) 입력 파라미터 이름에 In 접두사를 붙여 고유하게 만드세요. 같은 이름의 변수가 다른 곳에 존재하면 충돌이 발생합니다. 2) GPU Sim에서는 모든 HLSL 코드가 Compute Shader로 컴파일됩니다. CPU Sim과 GPU Sim 간 호환되지 않는 함수가 있을 수 있습니다.
// 입력: InPosition (Vector3), InTime (float),
// InFrequency (float), InAmplitude (float)
// 출력: OutPosition (Vector3)
float3 NoiseInput = InPosition * InFrequency + InTime;
// 각 축에 대해 서로 다른 오프셋의 노이즈 적용
float NoiseX = sin(NoiseInput.x * 1.3 + NoiseInput.y * 0.7);
float NoiseY = sin(NoiseInput.y * 1.1 + NoiseInput.z * 0.9);
float NoiseZ = sin(NoiseInput.z * 0.8 + NoiseInput.x * 1.2);
OutPosition = InPosition + float3(NoiseX, NoiseY, NoiseZ) * InAmplitude;
모듈 입출력 설계
Input Map, Default Values, StackContext
잘 설계된 커스텀 모듈은 사용자가 Selection 패널에서 쉽게 파라미터를 조절할 수 있어야 합니다.
Module Input 추가
// Map Get 노드에서 '+' 버튼으로 Input 추가
Input Map:
Strength : float = 1.0 // 기본값
Center : Vector3 = (0,0,0) // 기본값
UseWorldSpace: bool = true // 기본값
// Parameters 탭에서 Default Mode 설정
DefaultMode: Value // 기본값 사용
DefaultMode: Binding // 다른 파라미터에 바인딩
DefaultMode: Fail if not set // 반드시 설정 필요
StackContext Namespace
StackContext는 모듈이 배치된 위치에 따라 자동으로 적절한 네임스페이스로 해석됩니다.
| 배치 위치 | StackContext 해석 | 예시 |
|---|---|---|
| System Update | System | StackContext.Age → System.Age |
| Emitter Update | Emitter | StackContext.Age → Emitter.Age |
| Particle Spawn/Update | Particles | StackContext.Age → Particles.Age |
StackContext를 사용하면 하나의 모듈을 여러 그룹(Emitter Update, Particle Update 등)에서 재사용할 수 있습니다. 특정 네임스페이스(예: Particles.)를 하드코딩하지 마세요.
핵심 요약
- Scratch Pad는 Emitter/System 내부에 임베드되는 로컬 커스텀 모듈 편집기입니다.
- Map Get/Set 노드로 Parameter Map을 읽고 쓰며, Input Map으로 외부 입력을 노출합니다.
- Custom HLSL 노드로 복잡한 수학 연산과 알고리즘을 직접 구현할 수 있습니다.
- HLSL 입력 파라미터에는
In접두사를 붙여 이름 충돌을 방지하세요. - StackContext 네임스페이스를 사용하면 모듈을 여러 실행 컨텍스트에서 재사용할 수 있습니다.
- 완성된 Scratch Pad 모듈은 Promote to Asset으로 독립 에셋으로 승격할 수 있습니다.
도전 과제
배운 내용을 직접 실습해보세요
Scratch Pad에서 새 모듈을 만들고, Particles.Position의 Z값에 sin(Particles.Age * Speed) * Amplitude를 더하여 파티클이 위아래로 진동하는 커스텀 모듈을 작성하세요.
Map Get으로 Particles.Velocity를 읽고, 속도에 비례하여 Particles.Color를 변경하는 모듈을 만드세요. 느린 파티클은 파란색, 빠른 파티클은 빨간색으로 표시되도록 구현하세요.
스크래치패드에서 만든 모듈을 독립 에셋(NiagaraScript)으로 승격하세요. Module Input으로 Speed, Amplitude, Axis를 노출하고, 다른 이미터에서도 사용할 수 있도록 범용화하세요.