서비스
교육 철학

10.7 광원 (Light Sources)

렌더링 방정식에서는 표면의 발광 성분을 고려할 때 광원의 효과가 나타납니다. 앞서 언급했듯이 실시간 그래픽스에서 발광 표면을 사용해 이를 ‘제대로’ 처리하는 것은 보통 감당하기 어려운 사치입니다. 그 비용을 감당할 수 있는 오프라인 환경에서도 아무것도 없는 곳에서 빛을 내보내고 싶은 이유가 있을 수 있습니다.
극적인 조명을 위해 장면의 모습을 더 쉽게 제어하거나, 카메라 밖에 있어 기하 형상을 모델링하는 데 시간을 쓰지 않은 표면에서 반사되어 올 빛을 흉내 내기 위해서입니다. 따라서 우리는 보통 자체 표면 기하 형상은 없고 렌더링 체계 안에 추상적인 개체로 존재하는 광원을 사용합니다.
이 절에서는 가장 흔한 광원 유형 몇 가지를 설명합니다.
10.7.1절은 전통적인 점 광원·방향성 광원·스폿 광원을 다룹니다. 10.7.2절에서는 현실의 빛이 어떻게 감쇠하는지, 그리고 실용적인 이유로 현실과 다른 방식을 사용하는 일이 얼마나 흔한지 살펴봅니다. 이어지는 두 소절에서는 이론적으로 순수한 영역을 떠나 오늘날 실시간 그래픽스에서 사용하는 임시방편적인 조명 기법들의 복잡한 세계로 들어갑니다. 10.7.3절에서는 Doom 방식의 체적 광원을 소개합니다. 마지막으로 10.7.4절에서는 특히 간접 조명 효과를 포함하기 위해 조명 계산을 오프라인에서 수행한 뒤 그 결과를 실행 시점에 사용하는 방법을 다룹니다.

10.7.1 표준 추상 광원 유형

이 소절에서는 대부분의 렌더링 시스템이 지원하는 가장 기본적인 광원 유형 몇 가지를 나열합니다. 여기에는 OpenGL과 DirectX의 고정 기능 조명 파이프라인이나 닌텐도 Wii처럼 오래되었거나 제약이 있는 플랫폼도 포함됩니다. 물론 프로그래머블 셰이더를 갖춘 시스템도 이런 광원 유형을 자주 사용합니다. 실행 시점에는 구면 조화 함수처럼 전혀 다른 방식을 쓰더라도, 오프라인 편집 인터페이스에서는 대개 표준 광원 유형을 사용합니다.
점 광원(point light source)은 한 점에서 바깥의 모든 방향으로 퍼져 나가는 빛을 나타냅니다. 점 광원을 전방향(omnidirectional)의 줄임말인 옴니 광원(omni light) 또는 구형 광원(spherical light)이라고도 합니다. 점 광원에는 위치와 색이 있으며, 색은 빛의 색상뿐 아니라 세기도 제어합니다. 그림 10.30은 3DS Max가 점 광원을 시각적으로 표시하는 방법입니다.
그림 10.30. 점 광원
그림 10.30에서 보듯이 점 광원에는 빛이 비추는 구의 크기를 제어하는 감쇠 반경(falloff radius)이 있을 수 있습니다. 보통 광원 중심에서 멀어질수록 빛의 세기는 줄어듭니다. 현실적이지는 않지만, 광원이 영향을 미치는 공간 범위를 한정할 수 있도록 감쇠 거리에서 세기가 0이 되는 편이 여러 이유로 바람직합니다. 10.7.2절에서는 실제 세계의 감쇠와 흔히 사용하는 단순화된 모델을 비교합니다.
점 광원으로는 전구·램프·불 등 흔한 광원들을 표현할 수 있습니다.
스폿 광원(spot light)은 특정 위치에서 특정 방향으로 나오는 빛을 나타냅니다. 손전등·전조등, 그리고 당연히 스포트라이트를 표현하는 데 사용합니다. 스폿 광원에는 위치와 방향이 있으며, 선택적으로 감쇠 거리도 있습니다. 빛을 받는 영역은 원뿔이나 각뿔 모양입니다.
원뿔형 스폿 광원(conical spot light)은 원형 ‘밑면’을 갖습니다. 원뿔의 너비는 감쇠 각도(falloff angle)로 정의하며, 감쇠 거리와 혼동하지 말아 주세요. 또 핫스폿의 크기를 재는 내부 각도가 있습니다. 그림 10.31은 원뿔형 스폿 광원입니다.
그림 10.31. 원뿔형 스폿 광원
사각형 스폿 광원(rectangular spot light)은 원뿔 대신 각뿔을 만듭니다. 사각형 스폿 광원은 영상을 투사하는 데 사용되므로 특히 흥미롭습니다. 예를 들어 영화가 상영되는 동안 스크린 앞을 걸어가는 상황을 떠올려 보겠습니다. 이 투사 영상에는 투영 라이트 맵(projected light map), 고보(gobo), 심지어 쿠키(cookie)까지 여러 이름이 있습니다(원주 10-17). 고보라는 말은 연극 분야에서 유래했습니다. 스폿 조명 앞에 마스크나 필터를 놓아 색이 있는 빛이나 특수 효과를 만드는 것을 뜻하며, 이 책에서는 이 용어를 사용합니다. 고보는 그림자나 다른 조명 효과를 가짜로 만드는 데 매우 유용합니다. 원뿔형 스폿 광원을 직접 지원하지 않는다면, 적절한 원형 고보를 만들어 구현할 수 있습니다.
방향성 광원(directional light)은 공간상의 아주 먼 점에서 나오는 빛을 나타냅니다. 거리가 충분히 멀어서 장면, 또는 적어도 현재 고려하는 물체에 조명을 주는 모든 광선을 평행하다고 볼 수 있습니다. 해와 달이 가장 분명한 예입니다. 장면에 올바른 조명을 주려고 월드 공간에 태양의 실제 위치를 지정하려 하지는 않을 것입니다. 따라서 적어도 조명 계산 관점에서 방향성 광원에는 보통 위치가 없고, 일반적으로 감쇠도 적용하지 않습니다. 그러나 편집을 위해서는 이리저리 옮겨 전략적으로 배치할 수 있는 방향성 빛의 ‘상자’를 만드는 것이 편리한 경우가 많습니다. 이때 상자 경계에서 빛이 약해지도록 추가 감쇠 인자를 넣을 수 있습니다. 방향성 광원을 평행 광원(parallel light)이라고도 합니다. 방향성 광원에도 고보를 사용할 수 있는데, 이때 영상은 사각형 스폿 광원에서의 원근 투영이 아니라 직교 투영으로 투사됩니다.
앞에서 말했듯이 렌더링 방정식과 현실 세계의 광원은 유한한 면적을 갖는 발광 표면입니다. 추상 광원 유형에는 표면적이 전혀 없으므로 적분할 때 특별하게 처리해야 합니다. 몬테카를로 적분에서는 보통 광원을 향하는 방향을 특별히 표본으로 선택하고 dω^ind\hat{\boldsymbol{\omega}}_{\mathrm{in}}을 곱하는 부분은 무시합니다.
빛이 하나의 점에서 나오는 대신, 빛을 받는 지점을 향하고 있는 0이 아닌 면적의 원판에서 나온다고 상상해 보겠습니다. 이제 원판의 면적을 0으로 줄이면서 복사속, 즉 전체 에너지 흐름은 일정하게 유지되도록 원판의 라디오시티, 즉 단위 면적당 에너지 흐름을 계속 증가시킨다고 생각해 보겠습니다.
추상 광원은 디랙 델타(12.4.3절 참조)와 매우 비슷한 방식으로 이 극한 과정의 결과라고 볼 수 있습니다. 라디오시티는 무한대이지만 복사속은 유한합니다.
지금까지 설명한 광원은 고정 기능 실시간 파이프라인에서 지원하는 전통적인 유형이지만, 물론 필요에 맞게 광원의 공간 범위를 어떤 방식으로든 정의할 자유가 있습니다. 10.7.3절의 체적 광원은 유연하면서도 실시간 렌더링에 적합한 대안입니다. Warn [71]과 Barzel [5]은 빛의 모양을 만드는 더 유연한 체계를 자세히 다룹니다.
원주 10-17: gobo는 ‘go between’의 줄임말이고, cookie는 ‘cucoloris’의 줄임말입니다. 연극 분야에서 두 용어 사이에 존재하는 미묘한 기술적 차이는 컴퓨터 생성 영상에서는 중요하지 않습니다.

10.7.2 빛의 감쇠

빛은 거리에 따라 감쇠합니다. 즉 광원과 물체 사이의 거리가 증가할수록 물체가 그 광원에서 받는 조명은 줄어듭니다. 현실 세계에서 빛의 세기는 광원과 물체 사이 거리의 제곱에 반비례합니다.
현실 세계의 빛 감쇠
i1i2=(d2d1)2.(10.16)\frac{i_1}{i_2}=\left(\frac{d_2}{d_1}\right)^2.\tag{10.16}
여기서 ii는 복사속, 즉 단위 면적당 복사 출력이며, dd는 거리입니다. 현실의 감쇠에서 제곱이 등장하는 이유를 이해하려면, 점 광원에서 같은 순간에 방출된 모든 광자가 만드는 구를 생각해 보겠습니다. 광자가 바깥으로 이동하면서 같은 수의 광자가 점점 더 큰 구를 만듭니다. 단위 면적당 이 광자 흐름의 밀도, 즉 복사속은 구의 표면적에 반비례하고, 표면적은 반지름의 제곱에 비례합니다(9.3절 참조).
여기서 잠시 멈추고 더 미묘한 점을 살펴보겠습니다. 대기 효과를 무시하면 물체나 광원의 지각되는 밝기는 관찰자에게서 멀어져도 감소하지 않습니다. 광원이나 물체가 관찰자에게서 멀어지면 앞서 설명한 이유로 눈에 도달하는 복사조도는 줄어듭니다. 그러나 지각되는 밝기는 복사조도가 아니라 복사휘도와 관련됩니다.
복사휘도는 단위 투영 면적·단위 입체각당 출력을 측정한다는 점을 떠올려 보겠습니다. 물체가 멀어질수록 물체가 차지하는 입체각도 줄어들어 복사조도의 감소를 보상합니다.
렌더링 방정식이 빛의 감쇠를 어떻게 자연스럽게 반영하는지 이해하면 특히 유익합니다. 적분 안에서는 셰이딩 지점 x\mathbf{x}를 둘러싼 반구의 각 방향에 대해, 그 방향의 발광 표면에서 들어오는 복사휘도를 측정합니다. 방금 이 복사휘도는 거리에 따라 감쇠하지 않는다고 했습니다.
그러나 광원이 x\mathbf{x}에서 멀어지면 반구에서 차지하는 입체각이 작아집니다. 따라서 광원의 면적이 유한하면 렌더링 방정식 안에서 감쇠가 자동으로 일어납니다. 반면 한 점에서 빛을 내는 추상 광원, 즉 디랙 델타에는 감쇠를 수동으로 포함해야 합니다.
조금 혼란스러우므로 실시간 렌더링의 일반적인 규칙을 정리하겠습니다. 렌더링되는 유한 면적의 발광 표면에는 보통 거리 감쇠를 적용하지 않지만, 안개 같은 대기 효과의 영향을 받을 수는 있습니다. 특정 지점을 셰이딩할 때 유효한 광원 색을 계산하기 위해서는 표준 추상 광원 유형에 감쇠를 적용합니다.
실제로 식 (10.16)을 사용하기 까다로운 이유는 두 가지입니다. 첫째, 이론적으로 d=0d=0에서 빛의 세기가 무한대로 커집니다. 앞서 말했듯이 광원이 디랙 델타이기 때문입니다. Barzel [5]은 광원 원점 부근에서 역제곱 곡선으로부터 부드럽게 벗어나도록 조정하여 중심 부근의 최대 세기를 제한하는 간단한 방법을 설명합니다. 둘째, 빛의 세기가 완전히 0으로 줄어들지는 않습니다.
현실 모델 대신 감쇠 거리에 기반한 더 간단한 모델을 자주 사용합니다. 10.7절에서 감쇠 거리는 그보다 멀리 있는 곳에는 광원이 영향을 주지 않도록 제어한다고 설명했습니다. 거리 dd에 따라 빛이 서서히 사라지도록 간단한 선형 보간 공식을 사용하는 것이 흔합니다.
전형적인 선형 감쇠 모델
i(d)={1,d≤dmin⁡,dmax⁡−ddmax⁡−dmin⁡,dmin⁡<d<dmax⁡,0,d≥dmax⁡.(10.17)i(d)=\begin{cases} 1,&d\le d_{\min},\\ \dfrac{d_{\max}-d}{d_{\max}-d_{\min}},&d_{\min}<d<d_{\max},\\ 0,&d\ge d_{\max}. \end{cases}\tag{10.17}
식 (10.17)에서 보듯이 감쇠를 제어하는 데는 실제로 두 거리를 사용합니다. dmin⁡d_{\min} 안쪽에서는 빛이 최대 세기, 즉 100%입니다. 거리가 dmin⁡d_{\min}에서 dmax⁡d_{\max}로 증가하면 세기는 100%에서 0%까지 선형으로 줄어듭니다. dmax⁡d_{\max}와 그 바깥에서는 세기가 0입니다.
따라서 dmin⁡d_{\min}은 기본적으로 빛이 약해지기 시작하는 거리입니다. 이 값은 0인 경우가 많으며, 이는 빛이 처음부터 곧바로 약해진다는 뜻입니다. dmax⁡d_{\max}는 실제 감쇠 거리로, 빛이 완전히 약해져 더 이상 아무런 영향을 주지 않는 거리입니다. 그림 10.32는 현실의 빛 감쇠와 단순한 선형 감쇠 모델을 비교합니다.
그림 10.32. 현실 세계의 빛 감쇠와 단순한 선형 감쇠 비교
거리 감쇠는 점 광원과 스폿 광원에 적용할 수 있으며, 방향성 광원에는 보통 적용하지 않습니다. 스폿 광원에는 추가적인 감쇠 인자가 있습니다. 핫스폿 감쇠(hotspot falloff)는 원뿔 가장자리에 가까워질수록 빛을 약하게 만듭니다.
💡
빛의 양과 방향을 구분하기
원문 10.7.2의 식(10.16) 설명은 i를 ‘radiant flux (radiant power per unit area)’라고 부릅니다. 그러나 복사속은 전체 복사 출력(W)이고, 단위 면적당 입사 복사 출력은 복사조도(W/m²)입니다. 같은 소절의 구면 확산 설명에 등장하는 ‘단위 면적당 광자 흐름’도 복사조도와 연결해서 읽는 것이 정확합니다. 번역 본문에는 원문의 용어를 남겼고 여기서 구분을 밝힙니다.

10.7.3 Doom 방식의 체적 광원

렌더링 방정식의 이론적 틀에서든, 표준 블린–퐁 모델의 조명 방정식을 계산하는 HLSL 셰이더에서든, 특정 지점 x\mathbf{x}의 셰이딩 계산에 광원을 사용하기 위해 필요한 것은 광원의 색, 즉 세기와 입사 방향뿐입니다. 이 소절에서는 이 값들을 새로운 방법으로 지정하는 체적 광원 유형을 다룹니다. 2003년 무렵 Doom 3 엔진, 일명 id Tech 4가 널리 알린 방식입니다.
이 광원들은 실제 활용 관점에서 이해할 가치가 있으며 지금도 유용합니다. 또한 우아하고 빠른 근사를 보여 준다는 점에서 이론적으로도 흥미롭습니다. 이러한 근사는 실시간 렌더링이라는 기술의 핵심입니다.
Doom 방식 체적 광원에서 가장 창의적인 부분은 주어진 지점의 세기를 정하는 방법입니다. 두 텍스처 맵으로 이를 제어합니다. 한 맵은 사실상 고보이며, 스폿 광원이나 방향성 광원과 비슷하게 직교 투영이나 원근 투영으로 투사할 수 있습니다. 다른 맵은 감쇠를 제어하는 1차원 맵으로 감쇠 맵(falloff map)이라고 합니다.
지점 x\mathbf{x}의 빛 세기를 정하는 절차는 다음과 같습니다. x\mathbf{x}에 4×44\times4 행렬을 곱하고, 결과 좌표로 두 맵을 조회합니다. 2차원 고보는 (x/w,y/w)(x/w,y/w)로, 1차원 감쇠 맵은 zz로 조회합니다. 두 텍셀의 곱이 x\mathbf{x}에서의 빛 세기를 정의합니다.
그림 10.33의 예들을 보면 분명해질 것입니다. 각 예를 자세히 살펴보겠습니다. 옴니 광원은 원형 고보를 상자 전체에 직교 투영하고, l\mathbf{l} 벡터 계산에 사용하는 광원의 ‘위치’를 상자 중심에 둡니다.
그림 10.33. Doom 방식 체적 광원의 예
옴니 광원 — Omni
그림 10.33. 옴니 광원의 조명 예
고보
그림 10.33. 옴니 광원의 고보
감쇠 맵
그림 10.33. 옴니 광원의 감쇠 맵
투영: 직교 투영
경계 상자
그림 10.33. 옴니 광원의 경계 상자
스폿 광원 — Spot
그림 10.33. 스폿 광원의 조명 예
고보
그림 10.33. 스폿 광원의 고보
감쇠 맵
그림 10.33. 스폿 광원의 감쇠 맵
투영: 원근 투영
경계 상자
그림 10.33. 스폿 광원의 경계 상자
가짜 스폿 광원 — Fake spot
그림 10.33. 가짜 스폿 광원의 조명 예
고보
그림 10.33. 가짜 스폿 광원의 고보
감쇠 맵
그림 10.33. 가짜 스폿 광원의 감쇠 맵
투영: 직교 투영
경계 상자
그림 10.33. 가짜 스폿 광원의 경계 상자
이 옴니 광원의 텍스처 좌표를 만드는 4×44\times4 행렬은 다음과 같습니다.
Doom 방식 옴니 광원의 텍스처 좌표 생성 행렬
[1/sx0000−1/sy00001/sz01/21/21/21].\begin{bmatrix} 1/s_x&0&0&0\\ 0&-1/s_y&0&0\\ 0&0&1/s_z&0\\ 1/2&1/2&1/2&1 \end{bmatrix}.
여기서 sx,sy,szs_x,s_y,s_z는 각 축 방향의 상자 크기입니다. 이 행렬은 광원의 오브젝트 공간에 있는 점에 적용하며, 이 공간에서 광원 위치는 상자 중심에 있습니다. 따라서 월드 공간 좌표에 적용하는 행렬을 만들려면 이 행렬의 왼쪽에 4×44\times4 월드-오브젝트 변환 행렬을 곱해야 합니다.
고보에 직교 투영하므로 맨 오른쪽 열이 [0,0,0,1]T[0,0,0,1]^T라는 점에 주목하겠습니다. 1/21/2만큼의 평행이동은 좌표 범위를 [−1/2,+1/2][-1/2,+1/2]에서 텍스처의 [0,1][0,1]로 바꾸기 위한 것입니다. 또한 yy축이 뒤집혔다는 점에 주목하겠습니다. 이 책의 3차원 관례에서는 +y+y가 위를 향하지만 텍스처에서는 +v+v가 아래를 향하기 때문입니다.
이제 스폿 광원을 보겠습니다. 원근 투영을 사용하며 투영 중심은 상자의 한쪽 끝에 있습니다. l\mathbf{l} 벡터 계산에 쓰는 광원 위치도 같은 지점에 두지만, 언제나 그래야 하는 것은 아닙니다. 옴니 광원과 같은 원형 고보를 사용하지만 원근 투영 때문에 원뿔 모양이 된다는 점에 주목하겠습니다.
감쇠 맵은 투영 중심에 가장 가까운 상자 끝에서 가장 밝고 +z+z축을 따라 선형으로 약해집니다. 모든 경우에 +z+z축이 고보 투영 방향입니다. 광원 ‘뒤’에 있는 물체가 조명을 받지 않도록 스폿 광원 감쇠 맵의 맨 첫 픽셀이 검다는 점에 주목하겠습니다. 실제로 모든 고보와 감쇠 맵의 가장자리 픽셀은 검습니다.
상자 밖 기하 형상에는 이 픽셀들을 사용하기 때문입니다. 고보와 감쇠 맵이 3차원 공간 전체에 반복되지 않도록 주소 지정 모드는 clamp로 설정해야 합니다. 원근 스폿의 텍스처 좌표 생성 행렬은 다음과 같습니다.
Doom 방식 스폿 광원의 텍스처 좌표 생성 행렬
[sz/sx0000−sz/sy001/21/21/sz10000].\begin{bmatrix} s_z/s_x&0&0&0\\ 0&-s_z/s_y&0&0\\ 1/2&1/2&1/s_z&1\\ 0&0&0&0 \end{bmatrix}.
오른쪽의 ‘가짜 스폿’이 어쩌면 가장 흥미롭습니다. 여기서는 직교 투영을 사용하며, 투영 방향은 옆쪽입니다. 빛의 원뿔 모양과 감쇠, 즉 우리가 보통 생각하는 의미의 감쇠가 모두 고보 안에 들어 있습니다. 이 광원의 감쇠 맵은 옴니 광원과 같습니다. 상자 중심에서 가장 밝고 상자의 −z-z 면과 +z+z 면에 가까워질수록 빛이 사라지게 합니다.
이때의 텍스처 좌표 행렬은 실제로 옴니 광원의 행렬과 같습니다. 모든 차이는 다른 고보를 사용하고 광원의 방향을 적절하게 맞추는 데서 나옵니다!
이 예들이 어떻게 작동하는지 확실히 이해할 때까지 살펴보기 바랍니다.
Doom 방식 체적 광원은 여러 이유로 실시간 그래픽스에서 매력적입니다.
•
단순하고 효율적입니다. 기본적인 텍스처 좌표 생성 기능과 텍스처 조회 두 번만 필요합니다. 이 연산들은 유연하며 닌텐도 Wii 같은 고정 기능 하드웨어에도 쉽게 내장할 수 있습니다.
•
서로 다른 많은 광원 유형과 효과를 같은 틀 안에서 표현할 수 있습니다. 이는 필요한 셰이더 종류 수를 제한하는 데 도움이 됩니다. 조명 모델·광원 유형·재질 특성·조명 패스는 모두 셰이더 조합 행렬의 차원이 될 수 있으므로, 그 행렬의 크기는 매우 빠르게 증가할 수 있습니다. 렌더 상태 전환 횟수를 줄이는 데도 도움이 됩니다.
•
고보와 감쇠 맵에 임의의 감쇠 곡선을 넣을 수 있습니다. 선형 감쇠나 현실의 역제곱 감쇠에 제한되지 않습니다.
•
감쇠를 제어할 수 있으므로, 조명 영역을 포함하는 경계 상자를 전통적인 스폿·옴니 광원보다 대체로 더 꼭 맞게 만들 수 있습니다. 다시 말해 상자 안 부피의 상당 부분이 실제로 유의미한 조명을 받으며, 기존 모델보다 빛이 더 빠르게 약해지므로 영역을 가능한 한 작고 꼭 맞게 잡을 수 있습니다. 그림 10.33의 맨 아래 행에서 진짜 스폿 광원과 가짜 스폿 광원을 포함하는 데 필요한 상자 크기를 비교해 보겠습니다.
마지막 특성은 Doom 3가 이런 광원을 도입한 가장 중요한 이유일지도 모릅니다. 이 게임은 라이트 맵이나 사전 계산 조명 없이 누적 렌더링 기법을 사용했고, 모든 물체에 완전히 실시간으로 조명을 주었습니다. 각 광원은 자신의 영향 영역 안에 있는 기하 형상을 다시 렌더링하고, 광원의 기여분을 프레임 버퍼에 더하는 방식으로 장면에 추가되었습니다.
다시 그려야 하는 기하 형상뿐 아니라 스텐실 그림자를 위해 처리해야 하는 기하 형상의 양도 제한할 수 있었으므로 성능상 이점이 매우 컸습니다.
💡
빛의 양과 방향을 구분하기
이 책의 Doom 방식 ‘체적 광원’은 광원이 영향을 미치는 공간 부피를 정한다는 뜻입니다. 이 절의 계산은 표면 지점에 들어오는 빛의 세기와 방향을 구합니다. 안개 같은 참여 매질 안에서 산란을 적분해 공중의 빛줄기를 그리는 계산을 이 두 텍스처 조회만으로 완성한다는 뜻은 아닙니다.

10.7.4 사전 계산 조명

실시간으로 생성하는 영상에서 오차가 가장 크게 발생하는 원인 중 하나는 간접 조명입니다. 긍정적인 독자라면 가장 크게 개선할 기회라고 말할지도 모르겠습니다. 간접 조명이란 렌더링되는 픽셀을 밝히기 전에 적어도 한 번 ‘튕긴’ 빛입니다. 이는 극도로 어려운 문제입니다. 처리 가능한 문제로 만들기 위한 첫 번째 중요한 단계는 장면의 표면들을 이산적인 패치나 표본 지점으로 나누는 것입니다.
그러나 패치 수가 비교적 적더라도 어떤 패치들이 서로를 ‘볼’ 수 있어 복사휘도가 흐르는 통로를 만들고, 어떤 패치들은 서로 볼 수 없어 복사휘도를 교환하지 않는지 여전히 판단해야 합니다. 그다음 렌더링 방정식에서 빛의 평형을 풀어야 합니다. 게다가 어떤 물체든 움직이면 어떤 패치가 어떤 패치를 볼 수 있는지가 달라질 가능성이 있습니다.
다시 말해 사실상 어떤 변화도 장면 전체의 빛 분포를 바꿉니다.
그러나 보통 장면의 일부 광원과 기하 형상은 움직이지 않습니다. 이 경우 더 자세한 조명 계산, 즉 렌더링 방정식을 더 완전하게 푸는 계산을 수행한 뒤 그 결과를 사용할 수 있습니다. 현재 조명 배치와 오프라인 계산에 사용했던 배치의 차이 때문에 생기는 오차는 무시합니다. 이 기본 원리를 사용하는 몇 가지 예를 살펴보겠습니다.
한 기법은 라이트매핑(lightmapping)입니다. 추가 UV 채널을 사용하여 장면의 다각형을 사전 계산 조명 정보가 들어 있는 특별한 텍스처 맵 안에 배치합니다. 다각형들을 텍스처 맵 안에 잘 배치하는 방법을 찾는 과정을 흔히 아틀라싱(atlasing)이라고 합니다.
이 경우 앞에서 언급한 이산 ‘패치’는 라이트 맵의 텍셀입니다. 라이트매핑은 바닥과 천장처럼 큰 평면에서 잘 작동합니다. 이런 표면은 라이트 맵 안에 효율적으로 배치하기가 비교적 쉽습니다. 반면 계단·조각상·기계·나무처럼 위상 구조가 훨씬 복잡한 조밀한 메시에는 아틀라싱을 적용하기가 쉽지 않습니다.
다행히 사전 계산한 조명 값을 정점에도 똑같이 저장할 수 있으며, 비교적 조밀한 메시에서는 이 편이 더 잘 맞는 경우가 많습니다.
라이트 맵이나 정점에 저장하는 사전 계산 정보는 정확히 무엇일까요? 기본적으로는 입사 조명을 저장하지만 선택지는 많습니다. 한 가지 선택 사항은 패치마다 저장할 표본 수입니다. 라이트 맵이나 정점 색이 하나뿐이면 입사 조명의 방향별 분포를 표현할 수 없고, 반구 전체에 걸친 합만 사용해야 합니다. 원문은 이 ‘단위 면적당 입사 복사 출력’을 라디오시티라고 부릅니다. 다만 입사량의 정확한 물리 용어는 복사조도이며, 아래 보충 설명에서 라디오시티와의 차이를 짚습니다.
역사적인 이유로 라이트 맵 계산 알고리즘을 라디오시티 기법이라고 부르기도 합니다. 라이트 맵이 방향 성분을 포함하는 경우에도 그런 이름을 사용하므로 혼란스러울 수 있습니다.
라이트 맵이나 정점 색을 둘 이상 저장할 수 있으면 분포를 더 정확히 담을 수 있습니다. 이 방향 정보는 특정한 기저에 투영합니다. 각 기저가 하나의 방향에 대응하도록 할 수도 있습니다. 구면 조화 함수(spherical harmonics) [44, 64]라는 기법은 2차원 푸리에 기법과 비슷한 정현파 기저 함수를 사용합니다.
어느 경우든 핵심은 입사광의 방향별 분포가 중요하다는 점입니다. 그러나 사전 계산한 입사광 정보를 저장할 때는 보통 이 정보를 버리거나 압축할 수밖에 없습니다.
또 다른 선택 사항은 사전 계산 조명에 직접광·간접광·둘 모두 중 무엇을 포함할 것인가입니다. 이 결정은 흔히 광원별로 내릴 수 있습니다. 최초의 라이트매핑 사례들은 장면의 각 광원이 각 패치에 주는 직접광만 계산했습니다. 주된 장점은 당시 실시간으로 생성하기에는 비용이 너무 컸던 그림자를 표현할 수 있다는 것이었습니다.
같은 기본 아이디어는 지금도 유용하지만, 오늘날의 목적은 보통 생성해야 할 실시간 그림자의 전체 수를 줄이는 것입니다. 그런 다음 시점을 실시간으로 움직일 수는 있지만, 라이트 맵에 구워 넣은 광원은 당연히 움직일 수 없습니다. 기하 형상이 움직이면 그림자가 그 표면에 ‘붙어’ 움직여 착각이 깨집니다.
실행 시점의 시스템은 그대로 두고 간접광까지 포함한 라이트 맵을 렌더링할 수도 있습니다. 다만 오프라인 계산에는 훨씬 정교한 처리가 필요합니다. 어떤 광원은 직접광과 간접광을 모두 라이트 맵에 구워 넣고, 다른 광원은 간접광 부분만 사전 계산 조명에 포함하면서 직접광은 실행 시점에 계산할 수 있습니다.
그러면 라이트 맵의 텍셀 밀도보다 더 정밀한 그림자를 얻거나, 입사 방향을 올바르게 모델링하여 정반사 하이라이트를 개선할 수 있습니다. 입사 방향은 빛을 라이트 맵에 구워 넣을 때 잃어버리는 정보입니다. 광원의 세기를 동적으로 조금 조절하거나 광원을 끄거나 위치를 바꾸는 제한적인 능력도 얻을 수 있습니다.
물론 일부 광원에 사전 계산 조명을 쓴다고 해서 다른 광원에 완전히 동적인 기법을 쓰지 못하는 것은 아닙니다.
방금 설명한 라이트매핑 기법은 정적인 기하 형상에는 잘 작동합니다. 그렇다면 캐릭터·차량·발판·아이템 같은 동적인 물체는 어떨까요? 이런 물체에는 동적으로 조명을 주어야 하므로 간접광을 포함하기가 어렵습니다. Valve의 Half-Life 2 [28, 47]가 널리 알린 한 기법은 장면 곳곳의 적절한 위치에 라이트 프로브(light probe)를 배치하는 것입니다.
각 프로브에서 큐브 환경 맵을 오프라인으로 렌더링합니다. 동적 물체를 렌더링할 때 가까운 프로브를 찾아, 그 프로브에서 해당 위치의 간접 조명을 얻습니다.
이 기법에는 여러 변형이 있습니다. 예를 들어 간접광의 난반사용 환경 맵 하나를 사용할 수 있습니다. 이 맵의 각 표본에는 해당 방향을 둘러싼 반구 전체를 코사인 가중치로 합친 값이 들어가도록 미리 필터링합니다. 한편 간접광의 정반사에는 이런 필터링을 하지 않은 별도의 큐브 맵을 사용할 수 있습니다.
💡
빛의 양과 방향을 구분하기
원문 10.7.4도 ‘단위 면적당 입사 복사 출력’을 radiosity라고 부릅니다. 엄밀히는 입사량이 irradiance(복사조도), 표면에서 나가는 양이 radiosity(라디오시티)입니다. 라이트맵을 만드는 알고리즘의 역사적 명칭과 물리량의 방향을 혼동하지 말아 주세요.