글로벌 일루미네이션

 

'''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
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에서도 기능이 개선되어 도입되었으며 라이트맵은 여전히 움직일 필요가 없는 정적 배경에 매우 좋은 기술이므로 유용하게 쓰이고 있으며 지속적으로 기능도 버전업되고 있다.

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)


실시간으로 전역 조명을 구현하는 방법. 정교하진 않지만 전역조명(라디오시티)을 대략적으로 구현하는 방법으로 현존 하드웨어로도 실시간 구현이 되지만 난반사광(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를 얻는데는 무리가 있다.
언리얼 엔진은 초기에 LPV를 실험적으로 도입하였지만 끝내 실험 기능선에서 제거되었고 라이트매스를 지속적으로 사용해왔다.
차후 SVOGI에서 발전된 VXGI로 넘어갈 예정이며 언리얼 엔진5에서 도입될 `루멘`으로 돌아올 예정이다.
재밌는 점은 LVP방식과 SVOGI의 개념은 에픽 게임즈에서 처음 선보였으나 정작 SVOGI를 메인으로 사용한 엔진은 크라이엔진이다.
크라이엔진은 3버전부터 SVOGI를 개선 발전시켜서 사용해왔으며 크라이시스2편에서부터 기존에 쓰이던 라이트맵핑 시스템을 완전히 제거하고 동적 SVOGI 시스템으로 넘어갔다.
그래서 현존 RTX 레이트레이싱을 제외한다면 비 RTX제품으로도 실시간 동적 SVOGI를 구현하는 게임엔진은 크라이엔진과 크라이엔진3를 개조하여 만들어진 Lumberyard가 유일하다.

2.2.2.1. VXGI

SVOGI를 NVIDIA의 Maxwel 아키텍처에서 하드웨어적으로 가속해주는 라이브러리로 nVIDIA에서 만들어서 배포하고 있으며 각종 게임 엔진에 결합하여 사용할 수 있다. Maxwell 아키텍처 이상의 nVIDIA GPU 사용시 하드웨어 가속이 가능하지만 여전히 무자비하고 비현실적인 연산량을 요구하는 것은 마찬가지고 nVIDIA GPU가 아니면 하드웨어 가속이 되지 않아서 사실상 이걸 쓰는 게임은 없다고 봐도 무방하다. 언리얼 엔진 4.6버전에 결합된 VXGI 데모언리얼 에디터 영상에서 확인 가능하며 VXGI는 단지 하드웨어 가속을 받을뿐 시각적으로나 기술적으로는 보통 SVOGI와 차이점이 없다.

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이 합쳐져서 랜더링되기 때문에 기존 래디오시티보다 나은 결과를 보여주지만, 모든 픽셀을 레이트레이싱으로 표현하는 것은 머신 러닝으로 노이즈를 감소시킨다 해도 턱도 없는게 현실이다.