안동민 개발노트

본문 시작

파티클과 조명 상호작용 기본 이해

Lit 셰이딩·그림자·이미시브 머티리얼·Light Renderer가 파티클과 주변 조명에 미치는 시각 효과와 비용을 비교합니다.

파티클이 밝아 보이는 것, 외부 조명을 받는 것, 주변 물체를 밝히는 것은 서로 다른 기능입니다. 효과의 목적에 맞춰 이 세 경로를 분리해 설정합니다.

셰이딩 모델과 조명 반응

  • Unlit: Emissive로 색을 표현하며 표면의 직접 조명을 계산하지 않습니다. 자체 발광을 표현하기 쉽지만 노출·톤매핑·안개 등은 여전히 화면에 영향을 줄 수 있습니다.
  • Default Lit: Base Color, Roughness, Normal 등으로 표면이 빛에 반응하도록 합니다. 파편·먼지·눈처럼 환경과 섞여야 하는 효과에 활용합니다. Sprite에도 사용할 수 있으나 반투명 Lighting Mode와 렌더링 경로에 따라 지원과 품질이 다릅니다.
  • Light Renderer: 파티클 위치에 조명을 만들어 주변 표면을 비춥니다. 파티클 표면의 셰이딩 모델과는 별도입니다. Emissive와 Bloom만 조절한 결과를 이 조명과 혼동하지 않습니다.

Unlit/Lit은 셰이딩 모델이고 Additive/Translucent는 블렌드 모드입니다. 같은 축의 선택지가 아니므로 각각 결정합니다.

그림자를 받기와 드리우기

그림자가 표면에 보이는 것과 파티클의 형상이 빛을 가려 다른 표면에 그림자를 드리우는 것을 구분해야 합니다. Unlit이라고 모든 그림자 투영이 불가능한 것은 아닙니다. Opaque/Masked 형상의 차폐와 반투명 그림자의 지원 조건도 다릅니다.

우선 소수의 Mesh 파티클과 Opaque 또는 Masked 머티리얼, 그림자를 만드는 광원으로 테스트 장면을 구성합니다.

Niagara 컴포넌트와 Renderer의 해당 그림자 설정, 광원의 Cast Shadows를 확인합니다. 옵션 노출 위치와 지원은 엔진 버전 및 렌더링 경로에 따라 다릅니다.

파티클 형상이 주변 바닥을 가리는지 확인합니다. 반투명 Sprite는 동일한 설정만으로 불투명 메시와 같은 그림자를 얻는다고 가정하지 않습니다. 그림자 종류와 머티리얼 지원을 따로 확인합니다.

필요한 실루엣에만 그림자를 사용하고, 입자 수·화면 범위·지속 시간을 늘리기 전에 비용을 비교합니다.

Light Renderer의 조절값

  • Color Binding / Color Add: 파티클 색을 읽고 고정 색상 값을 더합니다. 밝기 조절은 전달하는 RGB 범위 및 감쇠와 함께 봅니다.
  • Radius Binding / Radius Scale: 파티클별 반경과 배율을 정합니다. 기본 반경 바인딩은 Particles.LightRadius입니다.
  • Alpha Scales Brightness: 색상의 Alpha를 조명 밝기의 배율로 사용합니다.
  • Light Rendering Enabled Binding: 어떤 파티클에서 조명을 만들지 제어합니다.

Point Light 컴포넌트의 모든 속성이 Niagara Light Renderer에도 같은 이름으로 있다고 가정하지 않습니다. 예를 들어 UE 5.8 API의 MegaLights Cast Shadows는 Allow MegaLights가 켜진 경로의 옵션입니다. 사용하는 버전의 지원을 확인하고, 아래 기본 실습은 그림자를 요구하지 않습니다. Light Renderer API

직접 해보기: 수명에 따라 꺼지는 빛

NS_BasicSpawn의 복사본에 Light Renderer를 추가합니다. Sprite Renderer는 파티클 자체를 보이게 하는 역할로 유지합니다.

Emitter Update의 Spawn Rate를 5개/초 정도로 낮춥니다. Particle Spawn의 Initialize Particle에서 Lifetime을 1초, Color를 RGBA (1,0.5,0,1)로 정합니다. 초기 Add Velocity와 Particle Update의 Particle State·Solve Forces and Velocity가 있어 이동과 수명 제거가 이루어지는지 확인합니다.

Render 섹션에 Light Renderer를 추가합니다. Color Binding은 Particles.Color, Radius Binding은 Particles.LightRadius로 설정합니다. Particle Spawn에서 LightRadius Float를 200 cm로 기록하고 Radius Scale은 1로 둡니다. Color Add는 (0,0,0)부터 시작합니다.

Alpha Scales Brightness를 켭니다. 버전에서 제공하는 추가 그림자 경로는 이 실습에서 사용하지 않습니다. 기본 Light Renderer의 값을 Point Light의 Intensity 1000 설정으로 대신 설명하지 않습니다.

Particle Update의 Scale Color에서 RGB 배율은 1로 유지하고 Alpha 배율에 Float From Curve를 연결합니다. 커브 입력은 Particles.NormalizedAge, 키는 (0,1)과 (1,0), 보간은 Linear로 설정합니다. Particle State 뒤에 두고 다른 Color 기록이 이 결과를 덮어쓰지 않게 합니다.

Lit 머티리얼을 쓰는 바닥과 벽이 있는 장면에서 재생합니다. Sprite의 머티리얼은 Particle Color의 Alpha도 읽도록 합니다. Light Renderer를 켰을 때와 껐을 때 주변 표면의 차이를 비교합니다.

예상 결과는 생성 직후 밝고 수명 종료에 가까워질수록 약해지는 조명입니다. 빛이 잘 보이지 않으면 바인딩, 대상 표면의 Lit 여부, 거리와 노출을 먼저 확인합니다. 라이트 수·반경·그림자 경로가 비용을 크게 바꾸므로 색상의 밝기만 낮추는 것을 성능 최적화로 보지 않습니다.