본문 바로가기

Library/Computer Graphics

Ambient Light, Diffuse Light, Specular Reflection

물체의 재질이 어떻든 결국 빛이 있어야 비로소 물체의 색을 볼 수 있게 된다. 물체의 색이란 광원에서 나온 빛이 주변이나 물체면과 상호 작용하고, 관찰자의 눈에 와 닿는 세기에 의해 결정된다. 따라서, 이들을 어떻게 모델링하느냐에 따라 렌더링 시스템에서의 최종적인 물체의 색상이 결정된다. 일반적으로, 이것을 근사적으로 모델링하기 위해 환경광(ambient light), 난반사(diffuse reflection), 정반사(specular reflection)가 사용된다.

관찰자가 물체를 인식하게 되는 과정을 살펴보자. 먼저, 광원이 없다면, 특히 인간의 시각은 가시 광선만을 인식할 수 있기 때문에 물체가 스스로 가시 광선 영역에 해당하는 빛을 방출하거나, 그런 광원으로부터의 빛을 반사하지 못한다면, 관찰자는 물체를 인지하지 못한다(당신이 적외선 영역의 긴 파장의 에너지를 방출하는 물체조차 시각으로 감지할 수 있다면, 이미 외계인이다). 즉, 스스로 가시 광선 영역의 빛을 방출하지 못하는 물체를 볼 수 있는 가장 큰 요소는, 가시 광선을 포함하는 광원의 빛을 물체가 반사하고, 그 빛을 관찰자가 보는 것이다. 위의 요소에서, 이것에 해당하는 것은 난반사와 정반사이다. 빛이 특정 방향으로만 반사되는 정반사를 가장 잘 표현하는 것은, 매끄러운 재질을 가진 물체에 빛을 비추었을 때 나타나는 하이라이트 지점이다.

그러나, 물체를 인식하는데 있어서 직접적인 광원으로부터의 반사만 관찰자의 인식에 영향을 미치는 것은 아니다. 최종적으로 관찰자에게 도달하는 빛은, 물체가 광원으로부터 반사하는 빛도 있지만, 광원 외에도 주변 물체가 방출하는 빛이 관찰자가 보는 물체에 반사되어 관찰자에게 도달할 수도 있다. 환경광은 바로 이런 종류의 빛을 근사적으로 모델링한다.

환경광은 다른 표면에 반사되어 물체의 색에 영향을 주는 빛을 모델링한다. 가장 좋은 것은 주면에서 물체의 조명에 영향을 미치는 모든 빛을 계산하는 것(최대한 광선 추적 과정을 적용하는 것과 같은)이지만, 대부분의 그래픽 시스템은 지역 조명 모델을 사용하며, 이 환경광의 영향을 일정한 상수로 취급한다. 즉, 이 환경광은 광원과 상관없이 물체 자체의 색을 어느 정도 나타낸다고 할 수 있으며, 지역 조명 모델에서 전역 조명 모델 효과를 근사적으로 구현하기 위한 것이다.

만약 환경광만 사용하여 조명 모델을 구성한다면, 물체의 모든 부분은 명암 차이 없이 같은 밝기로 보일 것이다. 지역 조명 모델에서의 환경광은 물체가 광원으로부터 받은 빛을 직접적으로 반사한 요소만 고려하지만, 전역 조명 모델에서는 광원 외에 다른 물체로부터 입사되는 빛도 고려해야 한다. 전역 조명 모델이 지역 조명 모델보다 좀 더 부드럽고 사실적인 이미지가 되는 것은 이런 이유 때문이다.

광원으로부터 반사되는 빛은 난반사와 정반사로 구분할 수 있다. 여기서 난반사는 관찰자와의 상관 관계를 고려할 필요가 없는 요소이다. 만약, 물체의 표면 재질이 거울과 반대되는 성분을 가지고 있다면(즉, 물체의 표면이 매우 거칠다면), 입사된 빛은 특정한 방향으로 반사되는 것이 아니라 여러 반향으로 불규칙하게 반사될 것이다. 현실적으로, 난반사된 빛은 방향과 크기가 모두 제각각일 것이며, 관찰자는 이것을 보게 된다. 실시간 렌더링 시스템에서 이 모든 것을 완전하게 계산한다는 것은 거의 불가능하므로, 이것보다 단순한 근사 모델을 사용하게 된다. 즉, 난반사 성분은 평향되지 않은, 모든 방향으로 균일하고 같은 세기라고 가정한다. 그런 근사 모델 중 하나가 램버트의 법칙(Lambertian Law)이다. 램버트의 법칙은 표면에서 난반사가 모든 방향으로 동일하게 일어난다고 가정하며, 광원과 표면에서의 법선 벡터의 사이각 θ에 대한 코사인값으로 빛의 세기를 결정한다. 90도를 넘어가는 코사인값은 음수이므로, 그래픽 시스템이 RGB 컬러 모델을 사용하고 있다면 이 부분은 검은색으로 나타나게 된다. 즉, 결과적으로 이 값의 차이로 인해 명암이 발생하게 된다.

그러나, 난반사는 글자 그대로 입사각에 대한 난반사 성분만 고려한 것이기 때문에 입사각에 대한 정반사 요소를 제대로 표현하지 못한다. 다시 말해, 광원의 색이 그대로 관찰자에게 보여지는 하이라이트와 같은 부분을 제대로 표현하지 못한다. 하이라이트 성분까지 제대로 표현하려면, 정반사각 근처의 반사된 빛의 성분까지 고려해야 한다. 정반사 범위를 계산하기 위한 실험적인 모델은 Phong 정반사 모델(Phong 쉐이딩 모델이 아니다)을 들 수 있다. Phong 정반사 모델은, 반사각과 관찰자와의 사이각 Φ에 대한 cos^(Ns)(Φ)로 정반사 광도를 설정한다. Ns는 물체의 정반사 정도를 의미하는 값인데, 금, 은과 같은 정반사 요소가 강한 물체라면 이 값은 크게 설정되며, 벽돌, 분필과 같은 물체는 낮은 값을 가진다. 또 정반사 광도는 표면의 물질 특성 이외에 편광, 입사각의 색과 같은 다른 요소에도 의존한다. 이것을 간단히 정반사 계수 W(θ)를 이용하여 표현할 수 있다. 일반적으로 W(θ)는 입사각이 증가함에 따라 증가하는 경향을 가진다. 이런 요소들을 종합하여, Phong 정반사 모델을 표현하면 다음과 같다.

I(spec) = W(θ) * I(l) * cos^(Ns)(Φ)

여기서 I(l)은 광원의 광도이며, Φ는 정반사 방향 R에 대한 상대적인 관찰 각도이다.

그러나, 이런 광원 요소를 지정하고, 이 빛을 물체에 적용하는 것으로 끝나는 것은 아니다. 물체 역시 빛을 흡수하거나 반사하는 표면의 특성을 가지기 때문인데, 실제와 근사한 조명 효과를 얻으려면 이런 물체 표면의 재질 역시 고려해야 한다. 즉, 관찰자가 현실에서 보는 물체의 색은 실제로는 물체가 반사하는 빛의 색에 의해 결정된다. 빨간 공은 빨간 빛 이외의 다른 모든 빛을 흡수하고, 빨간 빛을 반사하기 때문에 빨간 색으로 보인다. 그래픽 시스템은 물체의 재질을 정의할 수 있도록 하여 모델링한 광원의 속성을 표현할 수 있도록 한다. 즉, 표면의 재질에서도 환경광, 난반사광, 정반사광을 지정할 수 있는데 각각 표면이 반사하는 양을 지정할 수 있다. 이외에도 물체 자체가 빛을 발하는 속성이라든가, 정반사광의 날카로운 정도 따위의 값을 결정할 수 있다. 또, 거리에 따른 광원의 감쇠 효과 따위도 고려해야 보다 사실적인 장면을 얻을 수 있다.

이제, 관찰자의 눈에 도달하는 빛의 성분들을 대략적으로 얻었고, 이 성분들을 모두 더해주면, 즉 환경광과 난반사 성분, 정반사 성분, 기타 물체의 특성에 따른 요소, 광원의 감쇠 효과 따위를 고려하여 적절하게 더해주면 그럭저럭 실제와 비슷한 영상을 얻을 수 있게 된다.


마지막으로, 조명(lighting)과 음영(shading)은 서로 다른 단계에서 계산된다. 조명이 적용된 물체의 정점의 색을 결정하기 위해서는 해당 정점에서의 빛의 세기를 알아야 하며, 이를 위해서는 법선 벡터 따위가 필요하다. 따라서, 조명은 모델 변환이 이루어지고 난 다음, 클리핑 작업이 일어나기 전에 계산되는 것이 일반적이다. 클리핑이 적용되면 잘려진 면을 기준으로 정점에서의 빛의 세기가 결정되기 때문에, 원래의 물체의 표면에서의 빛의 세기를 제대로 계산할 수 없기 때문이다. 음영은 이렇게 계산된 정점색을 기준으로 해당되는 픽셀의 색을 부여하는 과정이다. 따라서, 이 과정은 래스터라이즈화(rasterization) 단계에서 결정된다.


광원과 물체의 재질 설정에 따른 효과를 직접 확인하고 싶다면, Nate Robin의 Tutorial 프로그램만큼 좋은 것이 없다. 위에서 언급한 광원과 표면의 재질 속성에 따른 변화를 직접 관찰할 수 있다.




이외에도, Nate Robin의 사이트는 유용한, 몇 가지 다른 Tutorial 프로그램들을 제공한다. 주소는 다음과 같다.

http://www.xmission.com/~nate/index.html


Reference
Frank D. Luna, Introduction 3D GAME Programming with DirectX 9.0, Wordware Publishing
주우석, OpenGL로 배우는 컴퓨터 그래픽스, 한빛미디어