PART 2 · 강의 1/3

스크래치패드 모듈

Niagara의 Scratch Pad에서 커스텀 모듈을 시각적으로 제작하고 HLSL을 활용하는 방법을 학습합니다.

01

Scratch Pad란 무엇인가

로컬 커스텀 모듈 제작 환경

Scratch Pad는 Niagara 에디터 내에서 커스텀 모듈을 만들 수 있는 노드 그래프 편집기입니다. C++ 프로그래밍 없이 시각적으로 모듈 로직을 설계하고, 필요하면 Custom HLSL 노드로 직접 셰이더 코드를 작성할 수도 있습니다.

특성 Scratch Pad 모듈 일반 Module Script
저장 위치 Emitter/System 내부에 임베드 콘텐츠 브라우저에 독립 에셋
재사용 해당 Emitter/System 전용 모든 곳에서 재사용 가능
제작 속도 빠름 (인라인 편집) 별도 에셋 관리 필요
프로모션 독립 에셋으로 승격(Promote) 가능 이미 독립 에셋
모범 사례

프로토타이핑 단계에서는 Scratch Pad로 빠르게 모듈을 만들고, 여러 곳에서 재사용이 필요하면 Promote to Asset을 통해 독립 에셋으로 승격하세요.

02

Scratch Pad 워크플로

커스텀 모듈 생성부터 적용까지

커스텀 모듈 생성 절차

  1. 스택에서 + 버튼 클릭 → Scratch Pad Module 선택하여 새 모듈 추가
  2. 하단 Scratch Pad 탭에서 노드 그래프 편집기가 열림
  3. Map Get 노드로 입력 파라미터를 읽고, 로직을 구성
  4. Map Set 노드로 결과를 Parameter Map에 기록
  5. Apply 버튼을 눌러 변경사항 적용

핵심 노드 타입

노드 역할 사용 예
Map Get Parameter Map에서 값 읽기 Particles.Position, Particles.Velocity 읽기
Map Set Parameter Map에 값 쓰기 계산 결과를 Particles.Color에 기록
Input Map 모듈 외부에서 설정 가능한 입력 Selection 패널에서 사용자가 조절하는 값
Custom HLSL 인라인 HLSL 코드 실행 복잡한 수학 연산, 커스텀 알고리즘
Math 노드들 덧셈, 곱셈, Lerp, Clamp 등 값 변환, 보간, 범위 제한
예제: 속도 조건 모듈 (Scratch Pad)
// 목표: 속도가 임계값 이상인 파티클만 색상을 빨간색으로 변경 // 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
03

Custom HLSL 노드 활용

인라인 셰이더 코드로 고급 로직 구현

Custom HLSL 노드를 사용하면 Scratch Pad 그래프 내에서 직접 HLSL(High Level Shading Language) 코드를 작성할 수 있습니다. 노드 그래프로 표현하기 어려운 복잡한 수학 연산이나 루프 등에 유용합니다.

Custom HLSL - 소용돌이(Vortex) 힘 계산
// 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;
Custom HLSL 주의사항

1) 입력 파라미터 이름에 In 접두사를 붙여 고유하게 만드세요. 같은 이름의 변수가 다른 곳에 존재하면 충돌이 발생합니다. 2) GPU Sim에서는 모든 HLSL 코드가 Compute Shader로 컴파일됩니다. CPU Sim과 GPU Sim 간 호환되지 않는 함수가 있을 수 있습니다.

Custom HLSL - Noise 기반 위치 오프셋
// 입력: 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;
04

모듈 입출력 설계

Input Map, Default Values, StackContext

잘 설계된 커스텀 모듈은 사용자가 Selection 패널에서 쉽게 파라미터를 조절할 수 있어야 합니다.

Module Input 추가

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.AgeSystem.Age
Emitter Update Emitter StackContext.AgeEmitter.Age
Particle Spawn/Update Particles StackContext.AgeParticles.Age
재사용 가능한 모듈 설계

StackContext를 사용하면 하나의 모듈을 여러 그룹(Emitter Update, Particle Update 등)에서 재사용할 수 있습니다. 특정 네임스페이스(예: Particles.)를 하드코딩하지 마세요.

SUMMARY

핵심 요약

  • Scratch Pad는 Emitter/System 내부에 임베드되는 로컬 커스텀 모듈 편집기입니다.
  • Map Get/Set 노드로 Parameter Map을 읽고 쓰며, Input Map으로 외부 입력을 노출합니다.
  • Custom HLSL 노드로 복잡한 수학 연산과 알고리즘을 직접 구현할 수 있습니다.
  • HLSL 입력 파라미터에는 In 접두사를 붙여 이름 충돌을 방지하세요.
  • StackContext 네임스페이스를 사용하면 모듈을 여러 실행 컨텍스트에서 재사용할 수 있습니다.
  • 완성된 Scratch Pad 모듈은 Promote to Asset으로 독립 에셋으로 승격할 수 있습니다.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 기본 스크래치패드 모듈 작성

Scratch Pad에서 새 모듈을 만들고, Particles.Position의 Z값에 sin(Particles.Age * Speed) * Amplitude를 더하여 파티클이 위아래로 진동하는 커스텀 모듈을 작성하세요.

실습 2: 스크래치패드에서 Attribute 읽기/쓰기

Map Get으로 Particles.Velocity를 읽고, 속도에 비례하여 Particles.Color를 변경하는 모듈을 만드세요. 느린 파티클은 파란색, 빠른 파티클은 빨간색으로 표시되도록 구현하세요.

심화 과제: 재사용 가능한 모듈 에셋으로 승격

스크래치패드에서 만든 모듈을 독립 에셋(NiagaraScript)으로 승격하세요. Module Input으로 Speed, Amplitude, Axis를 노출하고, 다른 이미터에서도 사용할 수 있도록 범용화하세요.