본문 바로가기

Library/Computer Graphics

Lighting Under Local Illumination Model

3D 기하 정보를 읽어서, 이 기하 정보에 각 변환을 적용하여 화면에 렌더링했다고 하더라도, 이것이 곧 사실적인 3D 영상을 보여주는 것은 아니다. 왜냐하면 음영과 같은 조명 효과를 적용하지 않았기 때문이다. 아무리 3D 기하 정보를 토대로 물체를 구성했다고 하더라도, 광원을 적용하지 않으면 2D 영상과 다를 바 없는 밋밋한 영상을 얻을 수 밖에 없다.

조명 효과는 크게 지역 조명 모델(Local Illumination Model)과 전역 조명 모델(Global Illumination Model)으로 분류할 수 있는데, 개념적으로 둘의 가장 커다란 차이는 다른 물체로부터의 빛의 영향에 대한 고려이다. 지역 조명 방식에서는 다른 물체로부터의 입사되는 빛을 직접 추적하지 않는다. 하지만, 전역 조명 모델에서는 물체에 입사되는 빛의 요소 중, 다른 물체로부터의 반사되거나 굴절된 빛 모두를 고려하기 때문에 보다 사실적인 영상을 얻을 수 있다. 하지만, 이런 것 모두를 고려하는 것은 실시간 그래픽스 시스템에서는 비효율적이다. 그러나, 최근에는 병렬 처리가 가능한 저렴한 하드웨어의 등장으로 점차 실시간 전역 조명 모델의 가능성이 보이고 있다.

조명을 적용하기에 앞서, 물체의 음영을 표현하려면 가장 먼저 물체의 해당 영역에 대한 빛의 강도를 알아야 한다. 빛의 강도를 계산하는 방법으로 가장 널리 알려진 것은 램버트 확산광 모델(lambertian emissive law)이다.

램버트 확산광 모델은, 물체의 표면의 법선(normal) 벡터와 입사되는 빛의 벡터와의 내적값을 빛의 강도로 표현한다. 특히, 법선 벡터와 입사되는 빛의 벡터가 정규화되어 있다면 단순히 코사인 값이 빛의 강도를 표현한다.




이제, 확산광(diffuse lighting)을 이야기할 수 있다. 만약, 광원에서 나온 빛이 어떤 물체에 충돌했다고 하자. 물체가 거친 표면을 가지고 있다면, 이 빛은 일정한 방향이 아닌, 임의의 방향으로 반사되며, 관찰자는 이 난반사된 성분을 보게 된다. 난반사광은 빛의 세기와도 관련이 있기 때문에, 램버트 확산광 모델을 적용하여 최종적인 난반사광 성분을 계산하게 된다. 즉, Kd = max(cosΘ, 0)라고 했을 때, 광원의 난반사 성분 Cd와 물체의 난반사 성분 Md를 감안하여, 최종적으로 DiffColor = Kd · Cd · Md가 된다. 여기서 cosΘ = L · n으로 표현할 수 있으며, L은 입사되는 광원의 벡터, n은 이 빛을 받는 표면의 법선 벡터를 의미한다.




정반사광(specular lighting)은, 난반사광이 빛이 표면에 닿았을 때 표면의 거친 성분 때문에 빛이 흩어지는 것과 달리, 일정한 방향으로만 반사되는 빛의 성분이다. 즉, 매끈한 표면의 물체에 빛을 비추었을 때 관찰자는 특정 각도에서 빛을 그대로 볼 수 있는데, 이것은 입사된 빛이 그대로 반사되기 때문이다. 이런 빛을 보통 하이라이트(high light)라고 한다.




여기서, 정반사광이 입사된 벡터와 완전하게 대칭되는 방향으로만 반사되는 것은 아니다. 즉, 반사되는 강도 역시 cosΘ 값에 비례하며, 결과적으로 콘(cone) 모양으로 퍼져나가게 된다. 또, 콘의 모양은 (cosΘ)^p일 때 p의 값에 의하여 콘의 폭이 결정되며, 이것은 정반사 성분의 크기(즉, 하이라이트 면적)를 좌우하게 된다.




특히, 정반사광에서 입사되는 빛의 벡터 L과 반사되는 빛의 성분을 나타내는 벡터 R에서, 관찰자의 위치 벡터 V가 같은 방향에 위치하지 않을 수도 있다. 즉, cosΘ의 Θ값은, V와 R 사이의 각을 뜻하는 것이다. R은 L과 표면의 법선 벡터 n을 이용하여 계산할 수 있는데, 다음의 그림을 참조하라.




L을 O를 기준으로 같은 크기와 방향으로 연장하고, 법선 벡터를 사용한다면 반사된 위치 R을 이들을 사용하여 표기할 수 있다. 즉, 연장된 L과 Q 사이의 거리의 반은 법선 벡터에 대한 L의 유클리드 내적이며, 여기에 법선 벡터의 방향을 곱해주면 반사된 위치 R을 결정할 수 있다. 따라서, R + L = (2n · L) · n이 성립하고, R에 대해 정리하면 R을 구할 수 있다.

이것을 수식으로 정리한다면,

Ks = max(cosΘ, 0)^p (L · n > 0), cosΘ = V · R (V와 R이 정규화되어 있다면)
Ks = 0 (L · n ≤ 0)

즉, SpecColor = Ks · Cs · Ms로 표현할 수 있다. Cs는 광원의 정반사 성분이며, Ms는 물체의 정반사 성분이다.


마지막으로, 환경광(ambient lighting)은 주변으로부터 물체에 영향을 미치는 간접적인 빛의 성분을 뜻한다. 위에서 잠깐 말했듯이, 지역 조명 모델은 이 빛을 일일이 다 고려하지 않고, 평균적인 상수로 취급한다. 예를 들어, 방이 있고, 창문을 통해 빛이 들어오며, 탁자 위에는 금속 재질의 주전자가 놓여있다고 생각해보자. 난반사광과 정반사광만 고려한다면, 광원을 향한 주전자의 표면은 밝겠지만, 빛을 받지 않는 반대쪽을 아무 것도 볼 수 없을 것이다. 당연히, 현실에서는 그렇지 않다. 탁자나 벽과 같은 주변 물체에 빛이 반사되어 주전자에 영향을 미치기 때문이다. 지역 조명 모델은 이처럼 다른 물체를 통해 들어오는 빛을 모두 추적하지 않고 간단한 계산으로 환경광을 결정하기 때문에 사실성이 떨어진다. 즉, 지역 조명 모델에서는 광원의 환경광 선분과 물체의 환경광 성분을 곱하는 것으로 주변에서 들어오는 빛의 영향을 다음과 같이 간단하게 표현한다.

AmbColor = Ca · Ma


지역 조명 모델에서는, 위에서 언급한 환경광, 난반사광, 정반사광을 모두 합해서 최종적인 조명 효과를 만들어낸다. 위의 식을 정리하면 다음과 같다.

LitColor = AmbColor + DiffColor + SpecColor,
LitColor = Ca · Ma + (Kd · Cd · Md) + (Ks · Cs · Ms),
Kd = max(cosΘ, 0), cosΘ = L · n,
Ks = max(cosΘ, 0)^p (L · n > 0), cosΘ = V · R

여기서 다음과 같은 의문이 들 수도 있다. 즉, 빛의 성분은 하나인데 왜 환경광, 난반사광, 정반사광과 같은 성분을 따로 주어야 하는가? 하나의 빛의 성분만으로도 충분하지 않을까?

만약, 광원의 성분을 이렇게 분리하지 않고 하나의 성분으로만 위의 계산을 처리한다고 하자. 그렇다면, 환경광 성분을 간단한 유클리드 내적으로 계산하여 표현하고, 광원의 하이라이트를 표현할 때 하이라이트가 환경광과 동일한 최대값으로 표현되는 문제가 발생한다. 즉, 하이라이트는 보통 하얀색이나 회색 계통으로 표현되기 마련인데, 광원을 하나의 성분만 사용한다면 하이라이트가 하얀색이나 회색이 아닌, 해당 성분의 최대값으로 나타날 수 있다는 것이다. 이것은 난반사광에 대해서도 마찬가지이다. 즉, 위의 광원 모델링은 그야말로 근사적인 모델링일 뿐이며, 가장 좋은 값을 얻기 위해 각 성분을 분리한 것이다.

또, 위의 근사적인 모델링은 완전한 것이 아니다. 보다 사실적인 영상을 얻기 위해서는, 광원의 종류에 따른 광원의 감쇄 효과도 고려해주어야 한다.