본문 바로가기

글로벌 일루미네이션과 파티클

Lumen을 비롯한 전역 조명에서 파티클이 간접광을 받거나 이미시브·Light Renderer로 주변을 밝히는 조건을 익힙니다.

파티클과 조명 상호작용 기본 이해에서 입자가 빛을 받는 것과 빛을 내는 것을 구분했습니다. 그런데 실제 장면의 빛은 광원에서 곧장 오는 직접광만이 아니라, 벽이나 바닥에 부딪혀 다시 퍼지는 간접광도 함께 만듭니다. 이 간접광을 다루는 것이 글로벌 일루미네이션(Global Illumination, GI)이며, 루멘이나 구운 GI 같은 방식을 프로젝트에서 켜고 설정하는 방법은 글로벌 일루미네이션과 반사 설정에서 다룹니다. 이 글에서는 GI 방식마다 입자가 간접광을 받는 조건이 어떻게 다른지 살펴보고, 입자의 발광이나 Light Renderer가 주변에 빛을 더하는 경로와 그 한계를 정리한 뒤, 보이는 발광과 실제 조명을 나누어 비교하는 실습을 합니다.


GI 방식과 지원 조건

언리얼 엔진에서 쓰는 GI 방식은 크게 세 가지이며, 입자가 간접광을 받는 조건도 방식마다 다릅니다.

루멘(Lumen)은 움직이는 장면에서도 간접광과 반사를 계산하는 방식입니다. 조명을 받는 반투명(Lit Translucency)에도 낮은 품질의 GI를 제공하지만, 모든 나이아가라 입자가 같은 방식으로 영향을 받는 것은 아닙니다. 또 Unlit 표면은 Lit처럼 들어오는 빛을 받지 않습니다.

화면 공간 GI(Screen Space Global Illumination, SSGI)는 화면에 보이는 정보로 간접광을 계산하므로, 가려지거나 화면 밖에 있는 광원의 정보는 잃을 수 있습니다. 비용이 루멘보다 늘 낮다고 단정하지 말고, 목표 품질과 해상도에서 비교합니다.

구운 GI(Baked GI)는 움직이지 않는 환경의 조명을 미리 계산해 둡니다. 움직이는 Lit 물체는 지원되는 경우 볼류메트릭 라이트맵(Volumetric Lightmap) 같은 간접광 정보를 쓸 수 있지만, 움직이는 입자마다 라이트맵을 굽거나 실시간으로 빛을 다시 굽는 것은 아닙니다.

그래서 프로젝트의 GI 방식과 플랫폼, 품질 설정을 정할 때 입자 머티리얼의 블렌드 모드와 셰이딩 모델도 함께 정합니다.


입자가 간접광을 받게 하기

입자가 주변의 간접광을 받게 하려면, 먼저 파편처럼 형태가 분명한 Mesh 입자에 Default Lit 머티리얼을 쓰고 Base Color와 Roughness, Normal을 설정합니다. 입자마다의 색은 Particle Color로, 그 밖의 제어 값은 커스텀 머티리얼과의 통합에서 다룬 DynamicParameter 바인딩으로 넘깁니다. 그런 다음 밝은 표면 옆과 어두운 공간에서 입자가 어떻게 달라 보이는지 비교합니다. 반투명 스프라이트라면 그 반투명 Lighting Mode와 GI 방식이 이를 지원하는지 확인해야 하며, Default Lit을 고른 것만으로 모든 종류의 GI를 받는다고 볼 수는 없습니다.

빛을 받아야 하는 먼지나 눈, 파편과, 스스로 빛나는 것이 중심인 마법이나 불꽃은 필요한 표현이 다릅니다. 같은 효과 안에서도 서로 다른 머티리얼을 쓸 수 있으며, 각각의 비용은 따로 측정합니다.


발광과 Light Renderer가 주변에 주는 빛

루멘은 지원되는 장면 표현에서 Emissive 표면을 간접광의 광원으로 다룰 수 있습니다. 그렇다고 밝은 나이아가라 스프라이트를 하나 더한 것만으로 안정적인 광원이 되지는 않습니다. 블렌드 모드와 장면 표현, 화면 추적, 플랫폼에 따라 지원 여부가 다르기 때문입니다.

작고 아주 밝은 Emissive는 노이즈를 일으킬 수 있고, 작은 메시가 루멘 장면(Lumen Scene)에서 빠지면 화면 추적에만 기대게 됩니다. 그러면 카메라가 돌아가거나 효과가 가려질 때 결과가 달라질 수 있으므로 이를 확인합니다. Emissive 값을 100배로 올리는 식의 방법은 지원 문제를 해결하지 못하고 노출과 색만 망가뜨릴 수 있습니다.

Light Renderer가 벽을 직접 비추는 것과, 그 빛이 다시 반사되어 다른 표면을 밝히는 것도 다릅니다. 모든 나이아가라 Light Renderer에 Affect Global Illumination 같은 공통 옵션이 있다고 가정하지 않습니다. 주변 조명이 안정적으로 필요하다면, 프로젝트가 지원하는 별도의 Point Light 같은 광원을 몇 개만 두어 역할을 나누고, 그 광원이 GI에 주는 영향을 확인합니다.


보이는 발광과 실제 조명 나누어 보기

앞 글에서 Light Renderer를 더한 NS_BasicSpawn 복사본을 씁니다. 이 실습은 어떤 스위치를 켜면 반드시 성공하는 실습이 아니라, 각 경로가 실제로 무엇을 바꾸는지 비교하는 실습입니다.

먼저 루멘을 지원하는 프로젝트와 품질 설정에서 Lit 벽과 바닥이 있는 방을 준비합니다. 카메라의 노출을 고정하고, 다른 광원이 어떤 상태인지 적어 둡니다. 다음으로 Light Renderer를 끄고 스프라이트의 Emissive만 보이게 합니다. 이때 입자 자체가 밝아 보이는 것과 주변 벽의 밝기가 바뀌는 것을 구분하고, 블룸도 켰다 꺼 보며 화면이 번져 보이는 것을 실제 표면의 조명으로 오해하지 않았는지 확인합니다.

그다음 카메라를 돌리거나 효과를 다른 물체로 가려도 주변에 주던 빛이 유지되는지 봅니다. 화면에 있을 때만 나타나는 빛이나 잔상은 안정적인 장면 광원으로 다루지 않습니다. 이어서 Light Renderer를 켜고 이전 상태와 비교합니다. 조명이 직접 닿는 벽이 밝아졌다는 사실만으로 간접광까지 성공했다고 결론 내리지 않으며, 직접 비추지 않는 면의 변화와 가림 조건을 따로 비교합니다.

원하는 조명이 불안정하다면, 별도의 Point Light 몇 개를 두고 효과의 수명에 맞춰 켜고 끄는 방법과 비교합니다. 실제 프로젝트의 GI와 광원 설정에서 결과를 확인하고, 동시에 재생될 수 있는 최대 효과 수에서 GPU 비용도 측정합니다.

색과 알파, 블룸으로 분위기만 낼지, 실제로 주변을 비추는 조명까지 필요한지 먼저 정해 두면 비용을 줄이기 쉽습니다. 플랫폼마다 GI 지원이 다르므로 에디터의 한 장면에서 본 결과를 모든 실행 환경에서도 같으리라고 일반화하지 않습니다.


정리

  • 글로벌 일루미네이션은 표면 사이에서 반사되는 간접광을 다루며, 루멘과 SSGI, 구운 GI는 입자가 간접광을 받는 조건이 서로 다릅니다.
  • 입자가 간접광을 받으려면 Default Lit 같은 Lit 머티리얼이 필요하고, 반투명 스프라이트는 Lighting Mode와 GI 방식의 지원을 따로 확인합니다.
  • 루멘은 지원되는 장면 표현에서 Emissive를 간접광의 광원으로 쓸 수 있지만, 밝은 스프라이트를 더한 것만으로 안정적인 광원이 되지는 않습니다.
  • Light Renderer가 직접 비추는 것과 그 빛이 반사되어 간접광이 되는 것은 다르며, 모든 Light Renderer에 GI 옵션이 있다고 가정하지 않습니다.
  • 발광과 블룸, 직접 조명, 간접광을 나누어 비교하고, 한 장면의 결과를 모든 플랫폼으로 일반화하지 않습니다.

연습 문제

1. 같은 장면에서 확인한 것과 확인하지 못한 것

카메라 노출과 다른 광원을 고정한 가상의 비교입니다. Light Renderer를 끈 상태에서 스프라이트의 Emissive를 키우면 화면의 번짐은 커지지만 Lit 벽은 바뀌지 않습니다. 블룸을 끄면 번짐도 사라집니다. Light Renderer를 켜면 조명이 직접 닿는 벽만 밝아지고, 직접광을 가린 다른 면에서는 변화가 보이지 않았습니다. 이 결과로 발광 표현과 직접 조명, 간접광 가운데 무엇을 확인했고 무엇은 아직 확인하지 못했을까요? 한 카메라 위치의 결과로 모든 플랫폼에서 GI가 된다거나 안 된다고 판단할 수 있을까요?

해설 보기

Emissive와 블룸이 만드는 화면 표현과, Light Renderer가 직접 닿는 벽을 밝히는 것은 확인했습니다. 그러나 가려진 면에 변화가 없었으므로, 이 비교에서 간접광이 생겼다고 말할 수는 없습니다.

그렇다고 모든 설정과 플랫폼에서 GI가 불가능하다고 일반화할 수도 없습니다. 지원되는 장면 표현과 추적 방식, 머티리얼 조건을 확인하고, 가림과 카메라 위치를 바꿔 가며 간접광이 닿아야 할 면을 비교해야 합니다. 이 문제의 결과는 실제 엔진에서 잰 기록이 아니라 판단을 연습하기 위해 정한 조건입니다.

2. 100배로 올린 Emissive

마법 구체가 주변 벽을 밝히게 하려고 스프라이트의 Emissive를 100배로 올렸습니다. 벽은 여전히 거의 밝아지지 않고, 구체만 하얗게 타 버린 것처럼 보입니다. 무엇을 확인하고 어떻게 바꾸면 좋을까요?

해설 보기

Emissive 값을 키우는 것은 화면에서 구체를 더 밝게 그릴 뿐, 루멘이 그 스프라이트를 간접광의 광원으로 다루는지는 블렌드 모드와 장면 표현, 화면 추적 같은 조건에 달려 있습니다. 조건이 맞지 않으면 값을 올려도 벽은 밝아지지 않고 노출과 색만 무너집니다.

Emissive는 보기 좋은 수준으로 되돌리고, 벽을 비추는 역할은 Light Renderer나 별도의 Point Light로 나눕니다. 그리고 직접 닿는 면과 가려진 면을 비교해 원하는 조명이 나오는지 확인합니다.

3. 화면 밖으로 나가면 사라지는 빛

카메라를 돌려 효과가 화면 밖으로 나가자, 그 효과 때문에 밝아 보이던 주변의 빛도 함께 사라졌습니다. 이 빛을 장면의 안정적인 광원으로 다뤄도 될까요?

해설 보기

다루면 안 됩니다. 효과가 화면에 있을 때만 생기는 빛은 화면 정보에 기대는 추적에서 나왔을 가능성이 크고, 카메라가 돌거나 효과가 가려지면 사라집니다.

주변 조명이 안정적으로 필요하다면 Light Renderer나 별도의 Point Light처럼 화면과 상관없이 동작하는 광원으로 역할을 나누고, 카메라를 돌리거나 가렸을 때도 결과가 유지되는지 확인합니다.

루멘이 간접광을 계산하는 방식은 Epic의 루멘 글로벌 일루미네이션과 반사 문서에서, Emissive와 작은 메시가 다루어지는 조건은 루멘 기술 세부 사항에서 확인할 수 있습니다.

이것으로 6장을 마칩니다. 6장에서는 파티클용 머티리얼의 블렌드 모드와 셰이딩 모델에서 시작해, 동적 머티리얼 파라미터로 값을 넘기는 방법, 렌더러를 조합해 폭발 파편을 만드는 방법, 입자와 조명이 주고받는 빛, 그리고 글로벌 일루미네이션과 입자의 관계까지 렌더링의 기본 기법을 살펴봤습니다. 다음 장의 정적 메시와의 기본 콜리전부터는 입자가 월드의 물체와 부딪히고 튕기는 충돌과, 물리를 흉내 내는 시뮬레이션을 다룹니다.