최근 수정 시각 : 2024-01-31 23:33:01

글로벌 일루미네이션

Global Illumination
전역 조명

1. 개요2. 구현방법
2.1. 비실시간 구현방법
2.1.1. 라이트맵 생성과정에 GI연산 추가 2.1.2. GI로 생성한 다중 라이트맵을 상황에 따라 교체
2.2. 실시간 구현방법
2.2.1. LPVGI(Light Propagation Volumes Global Illumination)2.2.2. SVOGI(Sparse Voxel Octree Global Illumination)
2.2.2.1. VXGI
2.2.3. 루멘 레이 트레이싱 GI(Lumen Ray-Tracing GI)
3. 사용기술
3.1. 레이 트레이싱(Ray Tracing)3.2. 라디오시티(radiosity)

1. 개요

글로벌 일루미네이션(GI, 전역 조명)은 CG에서의 빛 표현 및 계산 방식 중 하나이다. GI를 사용하여 광원에서의 직접광, 그리고 다른 재질이나 물체, 벽 등에 반사되는 간접광까지 모두 계산하여 더욱 사실적인 느낌을 줄 수 있다. 소프트 섀도우, 커스틱스(Caustics), 컬러 블리딩 등의 현상은 모두 전역 조명 효과를 통해 나타나게 된다. 기존에는 비싼 컴퓨팅 비용과 방대한 라이팅 정보량 때문에 전역 조명 효과를 게임 등 실시간 콘텐츠 내에서 구현하기 힘들었지만, 라이트맵 방식과의 혼용과 노이즈 계산 방식 등 여러 대안들을 통해 현재는 사양만 받쳐 준다면 높은 퀄리티의 GI 라이팅이 리얼 타임으로도 구현 가능하다. 미러스 엣지, 배틀필드 헤일로, 킬존 등의 게임에서도 널리 쓰인 바 있으며 현재는 많은 고사양 게임에 적용되는 기술이다.

2. 구현방법

2.1. 비실시간 구현방법

2.1.1. 라이트맵 생성과정에 GI연산 추가

말 그대로 라이트맵을 생성하는 중간과정에 GI연산을 추가해서 라이트맵을 생성하는 것이다. 정교한 간접광의 반사과정이 포함되므로 라이트맵 생성에 사용되는 연산량이 매우 많고 시간도 오래 걸리지만 결과물로 충분히 보상된다.

Illuminated Labs에서 만든 Beast라는 GI 라이트맵 생성 라이브러리에서 처음 구현된 방법이고 이를 이용한 첫번째 게임은 미러스 엣지다. 이후 언리얼 엔진 3에서 Beast를 참고해서 언리얼 엔진 3에 도입한 기술이 Lightmass이며 Beast와의 차이점은 Swarm이라는 이름의 다중분산처리 기술로 라이트맵 연산시 로컬 네트워크의 PC들을 활용해서 연산효율을 높이는 방법과, 사전에 Lightmass 볼륨을 설정하고 라이트맵 생성시 볼륨안에는 간접광이 반사된 표면과 거리에 비례한 간접광 캐시(Indirect Lighting Cache)가 생성되어 동적 객체(캐릭터나 움직이는 물체)가 그 주위를 지나가면 실제 GI에 의한 광원이 비추는것처럼 보여준다. 후에 Illuminated Labs가 Autodesk로 인수된후 Beast도 동일한 기능을 개발해서 간접광 캐시는 Light Probe라는 이름으로, Swarm은 DistriBeast라는 이름으로 추가했다. Autodesk는 2017년 이후 Beast를 포기하고 판매를 중단했으나 Lightmass는 언리얼 엔진 4에서도 기능이 개선되어 도입되었으며 라이트맵은 여전히 움직일 필요가 없는 정적 배경에 매우 좋은 기술이므로 유용하게 쓰이고 있으며 지속적으로 기능도 버전업되고 있다.

언리얼 엔진 4가 버전업 되면서 볼류메트릭 라이트맵(Volumetric Lightmap)이 도입되었는데 간접광 캐시는 2D 기반이었다면, 이것은 3D 기반으로 동적 객체가 다양한 방향에서 GI에 의한 실시간 라이팅 반응을 받을 수 있다.

2.1.2. GI로 생성한 다중 라이트맵을 상황에 따라 교체

GI연산이 추가된 라이트맵을 여러개 만들어 놓고 상황에 따라 해당 라이트맵을 교체해주는 방법이며, 다양한 기법들로 실시간 동적 라이트가 움직여도 표면이 그에 반응하듯 눈속임해주는 기법이다. 다만, 미리 구워진 라이트맵의 방향대로 라이트는 움직일 수 있지만 라이트맵이 입혀진 표면은 절대 이동, 회전, 스케일 조정 등의 어떠한 변형도 불가하다. 정확히 말하자면 움직이게 되면 원래 구워진 라이트맵과 일치하지 않아서 비주얼이 다 깨지므로 절대로 움직이면 안된다.

Geomerics의 Enlighten이 이런 방법을 채택하고 있고 다양한 게임 엔진들에 통합 가능하다. 프로스트바이트 2 엔진부터 이후 버전에 기본적으로 통합되어 있고 게임으로는 배틀필드 3에서 최초로 선보였다.

언리얼 엔진 4의 Realistic Rendering 데모 맵에 Enlighten을 적용한 영상 적용하지 않은 영상을 비교해보면 Enlighten의 효과를 알수있다.

2.2. 실시간 구현방법

2.2.1. LPVGI(Light Propagation Volumes Global Illumination)

실시간으로 GI를 구현하는 방법. 정교하진 않지만 GI를 대략적으로 구현하는 방법으로 연산량이 비교적 적은 대신 난반사광(Diffuse Lighting)의 반사(Bounce)만 구현되고 정반사광(Specular Lighting)의 반사는 구현되지 않기 때문에 시각적 효과가 크지 않은 것이 단점이다.

크라이시스 2에서 처음 선보였으며 언리얼 엔진 4도 최초 도입되었던 SVOGI가 너무 무거운 관계로 SVOGI를 삭제하고 도입했던 기법이다.

실시간이기 때문에 임의의 지오메트리와 광원을 언제든지 추가 및 제거 할 수 있으며, 이미지의 품질을 바로 볼 수 있으니 자신이 기획하는 화면의 품질을 예측하는것이 가능하다. 추가되더라도 성능의 저하가 선형적으로 일어난다.

2.2.2. SVOGI(Sparse Voxel Octree Global Illumination)

2012년에 공개됐던 언리얼 엔진 4의 초기 버전 데모에서 처음 선보인 기법으로 폴리곤으로 구현된 물체의 표면을 복셀화 시키고 전역조명 맵을 만든 후 픽셀에 구현하는 방식이다. 결과물에 있어서 LPVGI와의 가장 큰 차이점은 SVOGI는 난반사광은 물론이고 정반사광까지 반사가 일어난다는 점이다. 이로 인해 엄청난 시각적 효과를 얻을 수 있으며 SVOGI 역시 LPVGI와 마찬가지로 실시간이며 완전히 동적으로 동작한다. 이 기술은 계산에 사용될 광선의 갯수를 대폭 줄일 수 있으며 현존 지포스 RTX 제품이전 GTX 제품은 물론이고 AMD의 라데온 제품에서도 빠르게 돌아가는 효율성을 보여준다.

다만 복셀화로 인해서 섬세하지 못한 부분이 있기 때문에 아주 정교한 GI를 얻는데는 무리가 있으며 그 구현의 한계상 2차 반사광 이상은 구현하지 못한다.

크라이엔진은 3.8 버전에 실험버전으로 있던 SVOGI를 2016년에 출시한 V(5) 버전부터 정식버전으로 도입했는데 비효율성으로 인해 정작 사용하는 게임은 없다. 크라이엔진 3.8을 기반으로 한 럼버야드 엔진은 레거시 기능으로 구 버전이 남아있는데 쓸만하지는 못하다.
2.2.2.1. VXGI
SVOGI를 NVIDIA의 Maxwel 아키텍처에서 하드웨어적으로 가속해주는 라이브러리로 nVIDIA에서 만들어서 배포하고 있으며 각종 게임 엔진에 결합하여 사용할 수 있다. Maxwell 아키텍처 이상의 nVIDIA GPU 사용시 하드웨어 가속이 가능하지만 여전히 무자비하고 비현실적인 연산량을 요구하는 것은 마찬가지고 nVIDIA GPU가 아니면 하드웨어 가속이 되지 않아서 사실상 이걸 쓰는 게임은 없다. 언리얼 엔진 4.6버전에 결합된 VXGI 데모 언리얼 에디터 영상에서 확인 가능하며 VXGI는 단지 하드웨어 가속을 받을뿐 시각적으로나 기술적으로는 보통 SVOGI와 차이점이 없다.

2.2.3. 루멘 레이 트레이싱 GI(Lumen Ray-Tracing GI)

언리얼 엔진 5에서 도입된 `루멘`은 GI 연산에 한하여 실시간으로 레이 트레이싱 연산을 통해 간접광 결과물을 뽑아내는 기술이다.

언리얼 엔진 5 고유의 기술이며, 크게 소프트웨어 방식과 RTX를 이용한 하드웨어 방식이 있고 세부적인 구현 기술은 언리얼 엔진 5의 버전업과 함께 지속 개량되고 있다.

루멘 GI와 별도로, 비슷한 방식으로 반사를 구현해내는 루멘 리플랙션도 존재한다.

3. 사용기술

3.1. 레이 트레이싱(Ray Tracing)

사실 레이 트레이싱은 GI만을 구현하기 위한 기술은 아니다. 레이 트레이싱이란 단어의 뜻 그대로 광선의 경로를 추적하여 이루어지는 광원처리 방법으로서 가장 단순하고 간단하면서도 정확한 방법이다. 이 방식은 실제 세계에서의 빛이 가진 특성을 거의 그대로 구현하므로 매우 사실적인 이미지를 만들 수 있고, 별도의 포스트 프로세싱 없이 피사계 심도, 렌즈 플레어 같은 카메라 등을 통해서 빛의 현상을 이용한 다양한 특수 효과들까지도 시뮬레이션 할 수 있다. 이렇게 레이 트레이싱을 이용해 다양한 렌더링을 구현하는 것을 패스 트레이싱(Path Tracing)이라고 부른다.

레이 트레이싱 자체가 실세계의 빛이 움직이는 현상을 그대로 시뮬레이션하는 방식이기 때문에 레이 트레이싱에서 GI를 표현한다는것은 단순히 빛을 표면에서 더 튕겨(Bounce)주기만 하면 된다. 실제 빛이 표면에 반사되어 간접광이 생기는 현상과 똑같이 한번씩 더 튕겨주는만큼 2차, 3차, 4차 반사가 제한없이 가능하다. 하지만 그만큼 연산량은 엄청나게 늘어난다. 레이 트레이싱은 연산량이 매우 많기 때문에 현세대의 최신 하드웨어에서도 실시간으로 구현하기가 힘들며 아직까지도 프리렌더링 또는 라이트맵 생성과정에서만 쓰이고있다.

그러나 2018년 GDC에서 DXR을 통해 언리얼 엔진 4에서 실시간으로 구현된 데모 공개되었다. 다만 아직까지 게임에 실시간 레이 트레이싱이 사용되기에는 무리고, 언리얼 엔진 4가 영화 제작 등의 업계에서 기존에 사용되던 프리렌더링을 대체하기 위해 선보인 기술로 엔터프라이즈에서 사용하는 용도로 보인다.


2019년 1월 퀘이크 2에서 vulkan api를 이용해서 레이트레이싱을 구현했고 nvidia rtx 2080ti에서 1440p 60프레임으로 돌아간다.
그러나 이 전에도 2000년대 초반에 누군가에 의해 공개된 퀘이크 2 소스코드를 수정하여 당시 슈퍼컴퓨터에서 레이트레이싱으로 퀘이크 2를 구동한 영상이 공개됐었고 잠시 화제가 되었던 적도 있었다. 하지만 현재 시점에서 기사나 영상자료를 찾기 힘들다.


2019년 3월에 위의 Q2VKT 버전을 개발한 개발자의 도움으로 nvidia가 직접 구현한 영상이며 2019년 6월에 퀘이크 2 RTX라는 제목으로 스팀에 정식 발매하였다.
퀘이크 2 RTX는 모든 장면에 레이 트레이싱을 구현 했는데 이렇게 할 수 있었던 이유는 퀘이크 2가 20년도 넘은 워낙에 오래된 게임이고 3D 가속카드가 막 보급되기 시작한 초창기 시절 게임인 만큼 오브젝트도 거의 없다시피 하고 전반적으로 매우 단순한 렌더링으로만 이루어져 있기 때문이다. 그리고 영상을 보면 느껴지겠지만 단순히 라이팅만 레이 트레이싱으로 처리한다고 그래픽이 천지개벽할 수준으로 좋아지는 것은 아님을 알 수 있다.

3.2. 라디오시티(radiosity)

라디오시티 역시 GI만을 구현하기 위한 기술이 아니다. 레이 트레이싱이 광선 경로를 추적하는 방식으로 실제 빛의 흐름을 그대로 시뮬레이션하는 방식이라면 라디오시티는 빛이 중앙의 점에서부터 모든 방향으로 확산해나가는 방식이다. 알고리즘의 한계상 레이 트레이싱보다는 현실적이지 못한 만큼 연산량은 적지만, 현재의 하드웨어로도 아직까지는 실시간으로 사용되기엔 상당한 무리가 따르며 레이 트레이싱과 마찬가지로 라이트맵 생성이나 프리렌더링에서만 사용되고 있다.

레이 트레이싱이 비해 연산량이 적은 관계로 프리렌더링이나 라이트맵 생성 속도도 레이 트레이싱보다는 빠른 편이기에 제작속도 향상을 위해 쓰기도 한다. 하지만 하드웨어의 발전에 따라서 레이 트레이싱이 점차 효율적으로 사용되는 실정이라 비실시간이나 실시간이나 라디오시티가 거의 쓰이지 않게 될 것으로 보인다.

대략 엔비디아의 2080ti 의 60 프레임 유지를 위해서는 픽셀당 1 레이 정도가 한계이다.

1 바운스 시 256 레이 정도로 확산한다고 쳐도 대략 2 바운스 레이트레이싱을 위해서는 현재 보다 4만배 정도 빨라지면 된다.

물론 이럴 가능성은 없기 때문에 DynamicDiffuse GI라는 Diffuse만 래디오시티로 표현하는 방법으로 방향을 바꿨다.
물론 이것과 Specular Reflection이 합쳐져서 랜더링되기 때문에 기존 래디오시티보다 나은 결과를 보여주지만, 모든 픽셀을 레이트레이싱으로 표현하는 것은 머신 러닝으로 노이즈를 감소시킨다 해도 턱도 없는게 현실이다.

분류