icon안동민 개발노트

커브와 그래디언트 데이터


 나이아가라 시스템에서 커브와 그래디언트 데이터는 파티클의 속성을 시간에 따라 동적으로 변화시키는 데 사용되는 강력한 도구입니다.

 이를 통해 복잡하고 자연스러운 파티클 동작을 만들 수 있습니다.

커브와 그래디언트의 개념

 1. 커브 (Curve)

  • 시간에 따른 단일 값의 변화를 나타냄
  • 예 : 크기, 투명도, 속도 등의 변화

 2. 그래디언트 (Gradient)

  • 시간에 따른 색상의 변화를 나타냄
  • 예 : 파티클 색상 변화, 발광 강도 등

커브와 그래디언트 생성 방법

  1. 나이아가라 에디터에서 새 커브/그래디언트 생성
  2. 커브 에디터/그래디언트 에디터 열기
  3. 키 포인트 추가 및 조정
  4. 보간 방식 선택 (선형, 곡선 등)

파티클 시스템에서의 적용 방법

  1. 모듈에서 커브/그래디언트 파라미터 추가
  2. HLSL 코드에서 SampleCurve 또는 SampleColorGradient 함수 사용

 예시

float ScaleFactor = SampleCurve(CurveParameter, NormalizedAge);
float4 Color = SampleColorGradient(GradientParameter, NormalizedAge);

활용 사례 및 구현 방법

 1. 시간에 따른 크기 변화

  • 커브 생성 : 시작 (0,1) → 중간 (0.5,2) → 끝 (1,0)
  • 적용
void UpdateParticleSize(inout float Size)
{
    float ScaleFactor = SampleCurve(SizeCurve, NormalizedAge);
    Size *= ScaleFactor;
}

 2. 색상 변화

  • 그래디언트 생성 : 빨강 → 노랑 → 투명
  • 적용
void UpdateParticleColor(inout float4 Color)
{
    Color = SampleColorGradient(ColorGradient, NormalizedAge);
}

 3. 속도 변화

  • 커브 생성 : 시작 (0,0) → 급증 (0.1,1) → 감소 (1,0.2)
  • 적용
void UpdateParticleVelocity(inout float3 Velocity)
{
    float SpeedFactor = SampleCurve(SpeedCurve, NormalizedAge);
    Velocity *= SpeedFactor;
}

 4. 불투명도 조절

  • 커브 생성 : 시작 (0,0) → 중간 (0.5,1) → 끝 (1,0)
  • 적용
void UpdateParticleOpacity(inout float Opacity)
{
    Opacity = SampleCurve(OpacityCurve, NormalizedAge);
}

고급 기법 : 커브와 그래디언트 조합

 1. 복합 동작 생성

  • 여러 커브를 조합하여 복잡한 움직임 패턴 생성
  • 예 : 나선 운동
void CreateSpiralMotion(inout float3 Position)
{
    float Radius = SampleCurve(RadiusCurve, NormalizedAge);
    float Angle = SampleCurve(AngleCurve, NormalizedAge);
    Position.xy += float2(cos(Angle), sin(Angle)) * Radius;
}

 2. 동적 색상 및 크기 변화

  • 색상 그래디언트와 크기 커브 결합
  • 예 : 불꽃 효과
void UpdateFireParticle(inout float4 Color, inout float Size)
{
    Color = SampleColorGradient(FireGradient, NormalizedAge);
    Size *= SampleCurve(FireSizeCurve, NormalizedAge);
}

 3. 환경 반응형 파티클

  • 외부 파라미터에 따른 커브 샘플링 조정
  • 예 : 바람에 반응하는 낙엽
void UpdateLeafMotion(inout float3 Position, float WindStrength)
{
    float SwayFactor = SampleCurve(SwayCurve, NormalizedAge);
    Position.xy += WindDirection * WindStrength * SwayFactor;
}

성능을 고려한 효율적인 사용 방법

 1. 샘플링 횟수 최소화

  • 매 프레임 샘플링 대신 결과 캐싱
float CachedScaleFactor;
if (FirstUpdate)
{
    CachedScaleFactor = SampleCurve(ScaleCurve, NormalizedAge);
}
Size *= CachedScaleFactor;

 2. 커브 복잡도 관리

  • 필요 이상으로 복잡한 커브 피하기
  • 키 포인트 수 최적화

 3. LOD (Level of Detail) 시스템 구현

  • 거리에 따라 커브 샘플링 빈도 조절
float SampleRate = CalculateLODSampleRate(DistanceFromCamera);
if (frac(NormalizedAge * SampleRate) < 0.01)
{
    UpdatedColor = SampleColorGradient(ColorGradient, NormalizedAge);
}

 4. 그래디언트 텍스처 활용

  • 복잡한 그래디언트를 미리 계산된 텍스처로 변환
  • 텍스처 샘플링으로 성능 향상

적용 예시 : 마법 포털 효과

 마법 포털 효과를 위한 커브와 그래디언트 활용

 1. 포털 에너지 파티클

  • 크기 커브 : 시작 (0,0.1) → 중간 (0.5,1) → 끝 (1,0.1)
  • 색상 그래디언트 : 청색 → 보라색 → 핑크색
  • 적용
void UpdatePortalParticle(inout float4 Color, inout float Size, inout float3 Position)
{
    Color = SampleColorGradient(PortalEnergyGradient, NormalizedAge);
    Size *= SampleCurve(PortalEnergySizeCurve, NormalizedAge);
    
    float RadialOffset = SampleCurve(RadialOffsetCurve, NormalizedAge);
    float Angle = NormalizedAge * 4.0 * PI;
    Position.xy += float2(cos(Angle), sin(Angle)) * RadialOffset;
}

 2. 포털 외곽 효과

  • 불투명도 커브 : 시작 (0,0) → 급증 (0.1,1) → 유지 (0.9,1) → 끝 (1,0)
  • 두께 커브 : 시작 (0,0.5) → 중간 (0.5,1) → 끝 (1,0.5)
  • 적용
void UpdatePortalRim(inout float Opacity, inout float Thickness)
{
    Opacity = SampleCurve(RimOpacityCurve, NormalizedAge);
    Thickness *= SampleCurve(RimThicknessCurve, NormalizedAge);
}

 3. 포털 소용돌이 효과

  • 회전 속도 커브 : 시작 (0,0) → 가속 (0.3,1) → 감속 (1,0.5)
  • 적용
void UpdatePortalVortex(inout float3 Position)
{
    float RotationSpeed = SampleCurve(VortexSpeedCurve, NormalizedAge);
    float Angle = NormalizedAge * RotationSpeed * 10.0 * PI;
    float Radius = 1.0 - NormalizedAge;
    Position.xy = float2(cos(Angle), sin(Angle)) * Radius;
}

 이러한 커브와 그래디언트 조합을 통해 복잡하고 역동적인 마법 포털 효과를 만들 수 있습니다.

 에너지 파티클의 크기와 색상 변화, 포털 외곽의 불투명도와 두께 변화 그리고 소용돌이 효과의 회전 속도 변화 등이 시각적으로 인상적인 효과를 만들어냅니다.

 커브와 그래디언트 데이터는 나이아가라 시스템에서 파티클의 동적인 변화를 만드는 데 필수적인 도구입니다.

 이를 효과적으로 활용하면 복잡하고 자연스러운 파티클 효과를 만들 수 있으며, 동시에 성능 최적화를 고려하여 효율적인 시스템을 구축할 수 있습니다.

 다양한 커브와 그래디언트를 실험하고 조합하여 독창적이고 인상적인 파티클 효과를 만들어보세요.