전역 조명 GI (Global Illumination)
기본 개념
3D 장면에서 간접광을 고려해 현실적인 조명 효과를 구현하는 기술
광원에서 표면으로 직접 도달하는 직접 조명만으로는 한 표면에 닿은 빛이 다른 표면에 영향을 주지 않는다.
GI는 빛이 표면에 닿아 반사되고 산란되어 주변 환경을 밝히는 모든 과정을 포함한다.
만약 간접광이 없다면 그림자가 아주 새까맣게 나와 뭔가 이상한 그래픽이 된다.
주요 기술
Light Map
유니티에서 라이팅 설정을 Baked 또는 Mixed 로 설정해놓고 라이팅을 굽게 되면, 조명 정보가 반영된 텍스쳐가 한장 뽑히는데, 그것을 라이트맵이라고 한다. static설정이 된 정적 오브젝트들에 한해 해당 텍스쳐가 뽑히게 된다.
장점으로는 매 프레임 조명 연산을 할 필요가 없다는 장점이 있지만, 단점으로는 동적 오브젝트들이 해당 부분에 돌아다닐 경우 조명을 받지 못한다는 것과, 텍스쳐를 사용하기 때문에 메모리를 더 써야 한다는 것이 있다.
Light Probe
라이트 프로브는 색의 급격한 변화가 있는 곳에 프로브를 배치해, 그 주변으로 동적 오브젝트가 다가올 경우 프로브가 계산한 조명의 값을 보간하여 동적 오브젝트에 입힌다. 장점으로는 실시간 조명 계산보다 가볍다는 것이 있고, 단점으로는 배치를 잘못 할 경우 빛이 새는 현상이 발생할 수 있다는 것이 있다.
Ray Traced GI
레이트레이싱을 이용해 빛의 경로를 하나하나 추적하는 방식으로 물리적으로 정확한 그림자와 반사, 굴절 등을 표현할 수 있다.
계산량이 많아 빛이 반사되는 횟수를 제한하거나, 낮은 해상도로 계산한 뒤에 업샘플링을 하거나, 여러 프레임에 걸쳐 누적된 값을 사용하거나 다양한 방법이 있다고 한다.
언리얼에서는 루멘으로 하드웨어 레이 트레이싱을 지원할경우 최대한 활용하고, 지원 불가시 소프트웨어 레이트레이싱을 사용한다. 라이트맵이나 프로브가 필요없는 형태고, 포트나이트 등에 사용되었다.
DDGI라는 것 또한 있는데, 이것은 실시간 레이트레이싱을 이용해 프로브 정보를 업데이트 하는 방식이라고 한다.
이 부분은 개념적인 부분으로만 이해했고, 실제 샘플읆 만들어 볼 예정이다.
간단한 샘플
공통
- 동적인 오브젝트 (캡슐)
- Emission이 들어간 큐브 2개
- 포인트 라이트 두개 근처의 큐브 2개
실시간 렌더링
Draw Call 49 / SetPassCalls 14
Light Map 사용
Draw Call 38 / SetPassCalls 28
Light Probe 사용
Draw Call 21 / SetPassCalls 11
차이 분석
라이트맵만 사용한 경우와 라이트 프로브를 배치해 사용한 경우의 드로우 콜과 SetPassCalls의 차이가 발생한 이유가 궁금해서 찾아보았다.
찾아보니 라이트 맵 셰이더는 더 많은 Pass를 요구한다고 하는데, Baked GI 를 사용하는 Material 들은 라이트 맵 샘플링을 위한 추가된 Variant를 사용한다고 한다. 즉, 각 Material의 라이트맵 uv 처리와 텍스쳐 바인딩을 위한 별도 SetPass가 필요하다.
라이트 프로브의 경우, 셰이더 키워드가 변경된다. LIGHTPROBE_SH 키워드가 활성화되는데, 기본 라이트 키워드만 활성화 되어 SetPass가 감소한다고 한다.
이것이 무슨말인가 하고 프레임 디버거를 돌려보니 아래와 같았다.
![]() |
![]() |
셰이더 변형이 달라져서 이런 결과를 낸다는게 매우 신기하다.
도구 정리
라이트맵 | 라이트 프로브 | |
적용 대상 | 정적 오브젝트 | 동적 오브젝트 |
역할 | GI를 포함한 간접광의 조도, 컬러 등을 텍스쳐로 구워 표현 | GI를 포함한 간접광의 컬러 정보를 구간별로 보간하여 적용 |
GI 반영 | Baked된 간접광 포함 | Baked된 GI의 샘플링 결과를 보간 |
품질 | 고품질 (텍스쳐 기반) | 상대적으로 낮지만 가벼움 (샘플 기반) |
셰이더 부하 | 높음 (텍스쳐 바인딩 및 방향성 계산) | 낮음 (보간 계산만으로 적용) |
약간 알듯 말듯한 어느 경계가 있다. 좀 더 찾아봐야 할듯.