icon안동민 개발노트

커브와 그래디언트 데이터


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

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

커브와 그래디언트의 개념

  1. 커브 (Curve)
  • 시간에 따른 단일 값의 변화를 나타냄
  • 예 : 크기, 투명도, 속도 등의 변화
  1. 그래디언트 (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;
}
  1. 색상 변화
  • 그래디언트 생성 : 빨강 → 노랑 → 투명
  • 적용
void UpdateParticleColor(inout float4 Color)
{
    Color = SampleColorGradient(ColorGradient, NormalizedAge);
}
  1. 속도 변화
  • 커브 생성 : 시작 (0,0) → 급증 (0.1,1) → 감소 (1,0.2)
  • 적용
void UpdateParticleVelocity(inout float3 Velocity)
{
    float SpeedFactor = SampleCurve(SpeedCurve, NormalizedAge);
    Velocity *= SpeedFactor;
}
  1. 불투명도 조절
  • 커브 생성 : 시작 (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;
}
  1. 동적 색상 및 크기 변화
  • 색상 그래디언트와 크기 커브 결합
  • 예 : 불꽃 효과
void UpdateFireParticle(inout float4 Color, inout float Size)
{
    Color = SampleColorGradient(FireGradient, NormalizedAge);
    Size *= SampleCurve(FireSizeCurve, NormalizedAge);
}
  1. 환경 반응형 파티클
  • 외부 파라미터에 따른 커브 샘플링 조정
  • 예 : 바람에 반응하는 낙엽
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;
  1. 커브 복잡도 관리
  • 필요 이상으로 복잡한 커브 피하기
  • 키 포인트 수 최적화
  1. LOD (Level of Detail) 시스템 구현
  • 거리에 따라 커브 샘플링 빈도 조절
float SampleRate = CalculateLODSampleRate(DistanceFromCamera);
if (frac(NormalizedAge * SampleRate) < 0.01)
{
    UpdatedColor = SampleColorGradient(ColorGradient, NormalizedAge);
}
  1. 그래디언트 텍스처 활용
  • 복잡한 그래디언트를 미리 계산된 텍스처로 변환
  • 텍스처 샘플링으로 성능 향상

실제 적용 예시 : 마법 포털 효과

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

  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;
}
  1. 포털 외곽 효과
  • 불투명도 커브 : 시작 (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);
}
  1. 포털 소용돌이 효과
  • 회전 속도 커브 : 시작 (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;
}

 이러한 커브와 그래디언트 조합을 통해 복잡하고 역동적인 마법 포털 효과를 만들 수 있습니다. 에너지 파티클의 크기와 색상 변화, 포털 외곽의 불투명도와 두께 변화, 그리고 소용돌이 효과의 회전 속도 변화 등이 조화롭게 어우러져 시각적으로 인상적인 효과를 만들어냅니다.

 커브와 그래디언트 데이터는 나이아가라 시스템에서 파티클의 동적인 변화를 만드는 데 필수적인 도구입니다. 이를 효과적으로 활용하면 복잡하고 자연스러운 파티클 효과를 만들 수 있으며, 동시에 성능 최적화를 고려하여 효율적인 시스템을 구축할 수 있습니다. 다양한 커브와 그래디언트를 실험하고 조합하여 독창적이고 인상적인 파티클 효과를 만들어보세요.