사실적 조명 : Global Illumination Final Gathering

by Anthony Rossano(Certified Softimage 인스트럭터로, Inside of Softimage 3D의 저자이기도 하며, XSI Illuminated이 공동저자이며 Mesmer Animations Labs의 설립자이다.)

초보 애니메이터는 컴퓨터 그래픽에서의 라이팅의 역할을 종종 경시하는 경우가 있다. 대규모 프로덕션 하우스에서는 버츄얼 라이팅 디자이너로 매일같이 일하는 수많은 사람들이 있고, 실생활의 라이팅 경험과  이론적인 배경을 갖고 있는 사람들이 그들의 지식을 CG에 좋게 활용하기위해 일하고 있다. 이러한 사람들은 대부분의 3D 렌더링 엔진에서 볼수 있듯이 제한적인 라이팅 모델로부터 효과적인 라이팅을 짜내기 위해 눈속임을 하고 있고, diffuse 라이트만을 드리우기 위해 또는 텍스쳐 맵에 프리-렌더링 라이팅 효과를 주기위해 수많은 작고 희미한 라이트들을 매단 것 같이 눈속임을 하고 있다. 과거에 왜 이러한 것이 필요했던가를 이해하기위해, 그리고 앞으로 하고자 하는 것에 관해 이해하기위해, 전통적인 레이트레이싱이 실제적인 라이팅과 무엇이 어떻게 다른가를 이해할 필요가 있다.

단순하게 하기위해, 빛이 포톤(photon)이라는 파티클이라고 생각하고자 한다. 그렇지만 빛도 또한 공간을 뚫고 전파되는 3D 웨이브 같이 만드는 퀄리티를 갖는다.

실제 라이팅과 CG

실생활에서 우리는 빛을 확산시키기위해 열심히 작업한다. 따라서 빛은 한 지점으로부터 똑같은 방향으로 모든 것이 방출되지 않는다. 그것이 우리가 많은 서페이스 영역을 갖는 형광등 튜브를 사용하는 이유이고, 우유빛 백열등을 사용하는 이유이고, 전등 갓을 사용하는 이유이다. 그러나 CG에서는 빛은 무한히 작은 점으로부터 대부분 온다. 이것이 거친 라이팅 조건, 강하고 뚜렷한 그림자, 그리고 입체적이지 않게 보이는 이미지들을 만든다. CG에서 이런 문제점을 해결하는 예전의 방법은 수많은 조명을 사용하거나 또는 렌더링하기위해 더 많은 샘플이 필요하고 렌더링 시간을 길게하는 영역 조명(area lights)을 사용하는 것이었다. 

빛 에너지의 반사.

실제 라이팅 상황에서 광원(위 그림에서 머리위에 있는 조명같은 광원)은 전구의 서페이스로부터 둘러싸인 방의 모든 방향으로 빛의 입자들을 일정하게 쏘아댄다. 이러한 입자(포톤)는 다른 오브젝트에 닿을때 까지 빛의 속도로 날아간다. 만일 오브젝트가 불투명이라면, 그 오브젝트는 포톤 에너지를 흡수하게 되며, 에너지중 일부를 방으로 발산한다. 새로운 포톤은 다른 서페이스를 만날 때까지 곧바로 진행하는데, 여기에서 다시 에너지가 흡수되고, 또다시 에너지의 일부는 방안의 오브젝트로 방출된다.

매번 정지할 때마다, 포톤은 에너지를 잃게되고 파장이 바뀌게 된다. 에너지를 잃는다는 것은 반사된 빛이 각 반사후에는 더 희미해진다는 것을 의미하며, 감지할 수 없을 때까지 계속된다.

얼마나 많은 빛이 서페이스로부터 다시 방출되는지는 서페이스 칼라의 값으로 알아챌 수 있다. 병원의 거칠고 순백색의 벽과 같이 값이 크면, 벽을 때린 대부분의 빛은 다시 방출된다. 값이 낮으면(어두우면), 서페이스로부터 적은 양의 빛이 나온다. 만일 한 재질이 완전하게 검정색이라면, 그것은 0 값을 가지므로, 그  재질을 때린 아무 빛도 되돌아오지 않으므로 전혀 볼 수가 없다-이것이 블랙홀이다. 재질의 값때문에 에너지를 잃는것외에, 빛이 공간을 뚫고 지나갈 때 약해진다고 생각할 수 있다. 실제로 일어나는 것은 포톤이 에너지를 잃는 것이 아니고, 포톤이 커다란 볼륨속을 진행할 때, 주어진 영역에서의 포톤의 밀도가 떨어지므로, 영역의 전체 에너지가 떨어지는 것이다. 컴퓨터 그래픽에서는 Light Exponent를 변화시켜 이러한 조명의 falloff를 조절하는 장점을 가질 수 있다. 노말 라이트는 거리의 제곱으로 약해지지만(2의 지수 함수), 이것은 여러분의 씬을 조명하기에 충분한 빛을 드리우기에는 어렵다. linear falloff(1의 지수함수)는 씬을 통해 라이팅을 하는 것을 더 쉽게 만들지만, 자연스럽게 보이지는 않는다. 최선의 경우는 그 중간 어디쯤인가에 놓여있다.

Color bleed

 

우리는 빛의 파장을 칼라로, 더 정확하게는스펙트럼의 빨간 부분에서의 긴 파장으로부터 눈에 보이는 스펙트럼의 더 짧은 범위의 파란색과 보라색 까지의 범위인 hue로 느낄 수 있다. 따라서 빛이 반사되고 파장이 바뀔 때, hue 도 따라서 바뀌어, 서페이스로부터 방출되는 hue를 보게 된다. 예를 들면, 빨간 오리엔탈 카페트를 밝은 태양빛 속의 하얀 벽옆에 위치시키면, 카페트 근처의 벽은 약간 빨갛게 보이게 된다. 이런 효과를 시뮬레이션하는 것을 래디오시티(Radiosity)라고 한다. Softimage XSI에서는 이것은 글로벌 일루미네이션(global Illuminations)Final Gathering 이라고 부른다.

빛은 앞으로 진행되고 레이트레이서는 뒤로 추적한다.

이러한 두가지 라이팅 효과(바운싱된 빛 에너지와 color bleed)는 자연스런 라이팅의 정교한 아름다움을 준다. 두가지 모두 광원이 환경속으로 수천개의 포톤을 쏟아내고 일부 포톤들이 우연히 우리의 눈이나 카메라 렌즈에 포톤들의 길이 보일 때까지 주위에서 반사되는 것이 필요하다. 불행하게도 레이트레이싱 엔진들은 그렇게 작업되지 않는다. 레이트레이서는 렌즈를 통해 가상의 카메라로부터 오브젝트로 빛을 뒤로 따라가서 멈추어, 중간의 바운스 없이 빛에 의해 오브젝트에 직접 드리워진 빛의 칼라와 에너지만을 체크한다. 레이트레이서는 빛을 뒤쪽으로 따라가므로 일반적인 레이트레이서는 반사된 빛의 물리학에 따르는 라이팅 효과를 만들 수 없다.

Softimage XSI 로 라이팅 문제점 해결하기

XSI 은 위와 같은 문제점을 해결하고 자연스럽게 보이는 라이팅 효과를 시뮬레이션하는 렌더링 기능을 갖고 있다(또한 이러한 테크닉을 사용하여 환상적이고 비사실적인 라이팅 조건을 만들수도 있다). 일반적인 아이디어는 빛을 광원으로부터 주변속으로 앞쪽으로 드리우는 것이다. 그리고나서 주변에서 약간씩 바운스시키고, 그 결과를 Photon Map이라고 하는 어딘가에다 저장하고, 일반적인 방법으로 씬을 렌더링하고, 가상 카메라로부터 씬으로 빛이 오브젝트를 때릴 때까지 빛을 뒤쪽으로 투사하고, 그러면 오브젝트 칼라가 일반적인 방법으로 결정되고 반사된 빛의 효과를 추가하기위해 포톤 맵을 고려한다. 이 방법을 XSI에서는 글로벌 일루미네이션이라고 한다.

글로벌 일루미네이션은 Final Gathering이라고 하는 또다른 XSI 렌더링 효과를 사용하여 더 증대될 수 있다. Final Gathering은 빛이 도달하는 각 오브젝트상의 점으로부터 씬으로 많은 빛을 투사하여 작업한다. 이것이 의미하는 것을 시각적으로 보여주는 다이어그램을 참조하라. 일반적으로, 이러한 효과들은 모두 렌더링 시간을 현저하게 증가시키므로, 퀄리티가 좋아지는 대신 참을성과 자유시간을 필요로 한다. 두가지를 합치기전에 두개의 효과를 따로 시험해보기로 하자.

Global Illumination 설정

이방에는 아직 글로벌 일루미네이션이 없다; 통상적인 레이트레이싱 효과만이  있다.

글로벌 일루미네이션용 작업흐름은 간단하다. 대부분의 시간을 파라미터들을 정밀조정하면서 글로벌 일루미네이션 프로퍼티들의 수정에 의해 만들어질 수 있는 여러 결과들을 검토하는데 보내게 될 것이다. 효과를 조정하는 동안 렌더링을 빠르게 하는 설정을 사용하는 것이 현명하다. 따라서 원하는 결과를 얻기전까지 많은 반복과 테스트 렌더링을 할 수 있다.

여러분의 씬에서 글로벌 일루미네이션이 작업하게 하는데에는 4가지 요구조건이 있다.

  1. 라이트가 포톤을 쏘도록 설정해야 한다.

  2. 빛으로부터 오브젝트를 때리는 포톤을 전달하여 씬의 나머지로 반사시키도록 설정된 적어도 한 오브젝트가 있어야 한다.

  3. 씬에서 반사된 후에 오브젝트를 때리는 포톤을 받을 수 있도록 설정된 적어도 한 오브젝트가 있어야 한다.

  4. Render>Region>Options 대화상자에서 Global Illumination을 켜야 한다.

1단계 : 조명을 선택한다. 아마 포인트 라이트나 스포트 라이트일 것이다. 그리고 라이트에 대한 프로퍼티 에디터에서 Photon 탭으로 가서 Global Illumination 토글을 클릭한다. 이 토글 바로 아래에 Photon Energy Number of Emitted Photons 에 대한 두가지 슬라이더 세트가 있다. Energy는 효과가 얼마나 밝을 것인가를 결정한다. 이 값을 증가시키는 것은 렌더링 시간에는 영향을 주지 않는다. 이것은 효과를 테스트하는 동안 50,000과 같이 아주 높게 설정하는 것이 좋다. 라이트 falloff는 포톤의 에너지 레벨을 바꾸게 된다는 것을 알고 있으라. 설정하는 동안 Light Falloff를 끄고 나중에 켜도록 하라. Use Light Exponent로 설정하고, Light Exponent(Light 프로퍼티 에디터의 general 탭에 있다)를 12 사이에서 조정하면서 intensity를 조심스럽게 올린다. 라이트 exponent1로 설정하는 것은 글로벌 일루미네이션을 보다 명확하게 하고, 2에 가깝게 설정하는 것은 효과를 부분적으로하게 되어 더 자연스럽게 만들지만 보기가 어렵다.

그 아래의 슬라이더 Number of Emitted Photons 는 렌더링 시간에 큰 영향을 끼친다. 이것은 1000정도로 아주 낮게 설정하는 것이 좋다. 효과를 조정하면서 최종 렌더링을 위해 숫자를 크게한다.

2단계 : 글로벌 일루미네이션 전송기(transmitter)를 설정한다. 라이트로부터 나온 포톤이 한 오브젝트를 치고 그 오브젝트가 포톤을 다시 방출하기를 원할 때, 오브젝트는 글로벌 일루미네이션 전송기가 되어야 한다. 예를 들면, 카페트는 글로벌 일루미네이션 전송기이다. 왜냐하면 라이트로부터 나온 포톤이 카페트에 반사되어 칼라 정보를 벽에다 뿌리기 전에 카페트로부터 hue value를 수집하기 때문이다.

포톤을 전송할 오브젝트를 선택하고, Visibility 프로퍼티 에디터를 부른다. Global Illumination 에디터 부분에서 Transmitter 체크박스를 토글한다.

만일 오브젝트가 투명체라면, 포톤은 오브젝트를 통과해서 굴절율에 의해 편향되어져서 다른 위치로 나오기 위해 오브젝트를 통과해 휘어질 것이다. 한 오브젝트가 전송기와 수신기(receiver) 둘다 될 수 있다. 둘다 반투명과 굴절성 오브젝트일 때, 포톤이 오브젝트 내부에서 이리저리 바운스되어 서페이스에 에너지을 추가하게 되므로 내부에서 빛나는 패턴이 만들어질 수 있다.

3 단계 : 글로벌 일루미네이션 수신기를 설정한다. 수신하는 오브젝트는 그 서페이스에 포톤을 모아 포톤 맵을 만든다. 적어도 하나의 수신기 오브젝트가 없으면 아무일도 일어나지 않는다. 최적인것은 크고 평평한 서페이스(벽, 바닥, 테이블, 천정)는 모두 수신기이어야 한다. 오브젝트를 선택하고 Visibility 프로퍼티 에디터를 열고 Global Illumination Receiver 체크박스를 토글한다.

이제 방안은 두개 광원(테이블 램프와 천정 조명)으로부터 뿌려진 포톤을 갖는다

4 단계 : 모든 것을 켜자! Render 모듈의 왼쪽 메뉴에서 Render Region Property Editor를 연다. Photon 탭 하의 Global Illumination 체크박스를 토글하여 효과를 작동시킨다. Accuracy Radius 슬라이더를 지금은 디폴트로 둔다. 렌더링 영역을 그리고 결과를 본다. 우측 하단 코너를 보면 진행중임을 나타내는 바가 보일 것이다. 첫번째로 일어나는 것은 포톤맵을 만드는 것이다. 렌더링 영역이 뭔가를 보여주는 것을 기다리는데 지쳤다면, 아마도 라이트로부터 너무 많은 포톤을 내보내고 있는 것일 것이다. 진행표시바의 왼쪽에 있는 작고 빨간 X를 클릭하여 렌더링을 중지시키고 Light 프로퍼티 에디터에 포톤을 적게 내보내게 한다.

2부로 .........