실시간 조명 및 사전 계산 조명
이전 절에서 조명과 그림자의 기본 원리, 다양한 광원 액터의 역할, 그리고 디버깅 방법에 대해 알아보았습니다. 이제 언리얼 엔진 조명 시스템의 핵심적인 개념인 실시간 조명(Real-time Lighting) 과 사전 계산 조명(Precomputed Lighting) 에 대해 깊이 있게 다룰 차례입니다. 이 두 가지 방식은 조명 정보를 처리하는 방식에서 큰 차이가 있으며, 각각 장단점을 가지고 있습니다. 프로젝트의 시각적 목표와 성능 요구사항에 따라 이 두 가지 방식을 적절히 조합하여 사용하는 것이 언리얼 엔진 조명 최적화의 핵심입니다. 마치 그림을 그릴 때 즉흥적인 붓터치와 정교한 스케치를 조합하듯, 언리얼 엔진에서 동적인 빛과 정적인 빛을 조화롭게 활용해 봅시다.
사전 계산 조명 / 베이크된 조명
사전 계산 조명(Precomputed Lighting) 은 게임이나 콘텐츠가 실행되기 전에 에디터에서 조명 정보를 미리 계산하여 오브젝트에 저장하는 방식입니다. 언리얼 엔진에서는 주로 라이트매스(Lightmass) 시스템을 통해 구현됩니다.
원리
- 라이트 빌드: 에디터에서
Build Lighting
과정을 통해 조명(특히Static
및Stationary
조명)의 직접광 및 간접광 정보를 계산합니다. - 라이트맵(Lightmap): 계산된 조명 정보는 주로
Lightmap
이라는 텍스처에 저장됩니다. 각 스태틱 메시(Static Mesh)는 자신만의 라이트맵 UV 채널을 사용하여 이 텍스처를 참조합니다. - 버텍스 라이팅(Vertex Lighting): 매우 낮은 해상도의 오브젝트나, 라이트맵 사용이 비효율적인 경우 버텍스 단위로 조명 정보를 저장하기도 합니다.
장점
뛰어난 성능 효율성: 조명 계산이 런타임에 거의 이루어지지 않으므로, 게임 실행 시 CPU 및 GPU 부하가 매우 낮습니다. 이는 특히 모바일이나 저사양 플랫폼에서 중요합니다.
고품질 간접광(Global Illumination): 라이트매스를 통해 복잡한 다중 반사 간접광(GI)을 매우 사실적이고 부드럽게 표현할 수 있습니다. 실시간 GI보다 훨씬 높은 품질을 적은 비용으로 구현할 수 있습니다.
부드러운 그림자: 미리 계산된 그림자는 계단 현상 없이 매우 부드럽고 사실적으로 보입니다.
단점
정적인 환경에만 적합: 빛의 위치, 색상, 강도나, 빛에 영향을 받는 오브젝트의 위치가 런타임에 변하면 베이크된 조명과 그림자가 업데이트되지 않아 어색해집니다.
긴 빌드 시간: 레벨의 크기와 복잡도, GI 품질 설정에 따라 라이트 빌드 시간이 매우 오래 걸릴 수 있습니다.
메모리 사용: 라이트맵 텍스처가 저장되어야 하므로 추가적인 메모리를 사용합니다.
라이트맵 UV 필요: 모든 Static 메시에는 겹치지 않는(Non-overlapping) 라이트맵 UV 채널이 필수적입니다. (3장 4절 '3D 모델 최적화' 참고)
활용 조명 액터
- Static (정적) 조명: 모든 빛과 그림자가 완전히 베이크됩니다.
- Stationary (정지) 조명: 간접광은 베이크되지만, 직접광의 그림자는 실시간으로 드리웁니다. (Static과 Real-time의 하이브리드)
실시간 조명 / 다이내믹 조명
실시간 조명(Real-time Lighting) 은 게임이나 콘텐츠가 실행되는 동안 매 프레임마다 조명 정보를 계산하여 렌더링하는 방식입니다.
원리
- 쉐이더 계산: 오브젝트의 재질 쉐이더가 각 프레임마다 광원의 위치, 특성, 그리고 카메라 시점에 따라 빛과 그림자를 실시간으로 계산합니다.
- 그림자 맵 / 쉐도우 캐스케이드: 실시간 그림자는 주로 그림자 맵(Shadow Map)이나 캐스케이드 그림자 맵(Cascaded Shadow Maps, CSM)과 같은 기술을 사용하여 구현됩니다.
장점
동적인 환경 지원: 빛의 위치, 색상, 강도가 실시간으로 변하거나, 오브젝트가 움직여도 조명과 그림자가 즉시 업데이트되어 매우 유연한 연출이 가능합니다. (예: 낮/밤 주기, 플레이어 손전등)
빌드 시간 불필요: 조명 빌드 과정이 없어 작업 흐름이 빠릅니다.
단점
높은 성능 요구: 매 프레임마다 복잡한 조명 및 그림자 계산을 수행해야 하므로 CPU 및 GPU에 큰 부하를 줍니다. 많은 수의 실시간 조명은 프레임 속도를 크게 떨어뜨릴 수 있습니다.
간접광 표현의 어려움: 직접광은 쉽게 표현되지만, 빛의 다중 반사로 인한 사실적인 간접광(GI)은 구현하기 어렵거나, Lumen
과 같은 고성능 실시간 GI 솔루션을 사용해야 합니다 (높은 사양 요구).
그림자 품질: 미리 계산된 그림자보다 품질이 떨어질 수 있습니다 (계단 현상, 필터링 문제 등). 이를 완화하기 위한 기술(CSM 등)도 성능 비용이 따릅니다.
활용 조명 액터
- Movable (이동 가능) 조명: 모든 빛과 그림자가 완전히 실시간으로 계산됩니다.
하이브리드 조명 시스템 및 최적화 전략
대부분의 현대 게임은 사전 계산 조명과 실시간 조명을 조합한 하이브리드(Hybrid) 방식을 사용합니다.
각 조명 모빌리티의 역할 분담
- Static (정적)
- 역할: 레벨의 기본 주변광과 정적인 오브젝트에 대한 간접광을 제공합니다.
- 활용: 건축물의 벽, 바닥, 천장 등 움직이지 않는 구조물, 고정된 환경 소품.
- 최적화: 가장 많이 사용되는 조명 모빌리티로, 성능 확보의 핵심입니다.
- Stationary (정지)
- 역할: 레벨의 주요 광원(태양 등)으로, 베이크된 간접광과 실시간 다이내믹 그림자를 제공합니다.
- 활용: Directional Light, 레벨의 주요 포인트/스포트 라이트.
- 최적화: 레벨당 최대 4개의 겹치는 Stationary 라이트만 지원하므로, 이 수를 넘지 않도록 주의해야 합니다.
- Movable (이동 가능)
- 역할: 플레이어의 손전등, 총구 화염, 폭발, 움직이는 차량 헤드라이트 등 런타임에 위치/강도가 변해야 하는 극히 일부 조명에만 사용합니다.
- 최적화: 최소한의 Movable 조명만 사용하고,
Attenuation Radius
를 최대한 줄여 영향 범위를 제한합니다.
주요 최적화 팁 (재강조)
모빌리티 설정의 현명한 선택: 가능한 한 Static
조명을 많이 사용하고, 꼭 필요한 경우에만 Stationary
나 Movable
을 사용하세요.
라이트 빌드: Static
또는 Stationary
조명을 변경할 때마다 **Build Lighting
**을 수행하여 최신 조명 정보를 레벨에 적용하고, 빌드 품질을 적절히 조절합니다.
라이트맵 UV 최적화: 모든 Static 메시가 적절한 라이트맵 UV 채널을 가지고 있는지, 겹치는 부분이 없는지 확인합니다. (3장 4절 '3D 모델 최적화', 5장 4절 '라이트맵 밀도 시각화' 참고)
그림자 품질 vs 성능: Directional Light
의 Dynamic Shadow Distance
와 Num Cascades
를 조절하여 그림자 품질과 성능 사이의 균형을 찾습니다. 불필요한 오브젝트의 Cast Shadows
를 비활성화합니다.
Attenuation Radius 제한: Point Light
및 Spot Light
의 Attenuation Radius
를 필요한 만큼만 설정하여 오버랩되는 동적 조명의 수를 줄입니다.
Lumen
(UE5): 언리얼 엔진 5를 사용하고 실시간 GI가 필수적이라면 Lumen
을 고려하지만, 이는 높은 성능 요구사항이 따르므로 목표 플랫폼을 고려하여 결정해야 합니다.
실시간 조명과 사전 계산 조명은 언리얼 엔진 조명 시스템의 양대 산맥입니다. 이 두 가지 방식의 차이점을 명확히 이해하고, 여러분의 프로젝트 특성과 목표에 맞춰 어떤 조명 모빌리티를 선택하고 어떻게 조합할지 결정하는 것이 중요합니다. 효율적인 조명 설정은 시각적 품질을 극대화하면서도 게임의 안정적인 프레임 속도를 유지하는 데 결정적인 역할을 합니다.