본문 바로가기

컴퓨터 그래픽스

컴퓨터 그래픽스 기초 - Fragment Shader part 2. Phong Lighting ([KUOCW] 한정현 교수님 강의)

이 포스팅은 [KUOCW] 한정현 교수님 강의 9장 - Lighting을 듣고 정리한 내용입니다.

선형대수학, 빛의 성질에 대한 기초적인 지식이 요구됩니다.

Rendering Pipeline

이번 포스팅도 part 1에 이어 Fragment Shader에 대한 내용입니다. 저번에는 texture에 대해 다뤘지만, 이번 포스팅은 lighting에 관한 내용입니다. 좀 발전된 형태의 lighting 기법이 있는 거로 아는데 강의에서는 가장 유명하고 전통적인 Phong Lighting을 다뤘습니다.

 

우선 lighting은 그래픽스에서 빛과 물체의 상호작용을 말합니다. 실제 세상에서 어떤 물체 고유의 색상이 있지만 외부의 조명이 바뀌면 그 영향에도 색상이 바뀌는 것은 다들 아실 것입니다. 이와 같이 저번 포스팅에는 texturing을 통해 object의 표면의 색상을 표현했다면, 이번에는 외부의 조명에 따라 색상이 어떻게 표현되는지 알아볼 것입니다.

Phong model에서는 Diffuse, Specular, Ambient, Emissive 같이 4가지 요소가 있는데, 차례로 알아보겠습니다.


 

  • Diffuse

먼저 Diffuse term은 난반사를 나타냅니다(lambert's law를 따른다고 합니다). 이때 광원(lighting source)은 태양과 같이 모든 object에 대해 world space에 같은 방향인 광원(Directional light source)을 가정합니다. 이렇게 표면에 닿은 빛은 어느 방향으로든 반사가 되며(난반사), 반사된 빛의 크기는 해당 pixel의 normal vector와의 내적으로 결정됩니다(각 pixel의 normal vector는 rasterizer를 통해 나왔죠). 90도가 넘어가면 음수의 값을 띄기 때문에 최종적으로 max(n(dot) l, 0)으로 표현됩니다. 

난반사(좌)와 normal vector에 따른 연산(우)

이때 점 p는 모든 빛의 성분(RGB) 반사하지 않습니다. 실세 세상에서도 빨간색 물체는 빨간색만 반사하고 나머지는 흡수하듯, 그래픽스에서도 동일한 연산을 수행하죠. 이렇게 빛의 색상 성분 s_d와 물체의 색상 성분 m_d(texturing을 통한 계산)을 component-wise multiplication을 수행함으로써 물체의 색상 성분을 참고하여 반사될 빛의 성분을 결정하게 합니다.

component-wise multiplication를 통해 반사될 빛의 성분을 결정한다.

따라서, Directional light source에 대한 난반사를 표현하는 diffuse term의 최종 수식은 아래와 같죠.

 Diffuse term


 

  • Specular 

 Specular term은 반사광을 나타냅니다.  어떤 물체의 반사광은 난반사와 달리 어느 방향에서든 그 반사된 빛이 보이는 게(view-independent) 아니라 특정 지점 혹은 특정 영역에서만 그 빛이 반사됩니다(view-dependent). 아래 그림의 (a)와 (b)처럼 말이죠.

반사광의 표현(위)과 r vector의 계산(아래) 

또한 위의 그림에서 나타는 s vector와 r vector는 그리고 빛이 들어오는 물체의 방향을 통해 입사각과 반사각을 알 수 있고, n과 l vector또한 알 수 있으니 계산할 수 있습니다. 이때 반사광을 표현한 r vector와 camera를 향하는 v(view) vector를 알아야 합니다. r vector는 계산 가능하고, v(view) vector는 vertex shader에서의 변환과 rasterizer의 보간을 통해 구해집니다. 그렇다면 두 벡터의 내적을 통해 반사광의 크기를 알 수 있죠.

 

이때 반사광을 구하는 Specular term은 아래의 수식과 같이 표현됩니다. Diffuse term과 같은 이유로 max와 component-wise multiplication이 붙었죠. 다른 점은 sh라는 변수로 제곱이 되어있다는 것입니다. sh는 반사광을 볼 수 있는 각도를 조절해주는 1 이하의 수입니다. 또한 이때 m_s는 m_d와 다르게 RGB채널의 값이 다 같은 gray scale로 표현됩니다. 저는 물체의 색상이 아닌 광원의 색상에 영향을 받는 term이라서 그렇다고 이해했습니다.

Specular term


 

  • Ambient 그리고 Emissive

Ambient 그리고 Emissive은 간단하게 설명하고 넘어갑니다. Ambient은 깜깜한 방에서도 물체가 보이듯 어디선가 들어오는 미세한 빛을 가정합니다. 또한 Emissive는 물체 자체가 광원이 되어 나오는 빛을 말하죠. 따라서 Ambient은 전 방향에서 들어오는 빛을 가정하여 아래 그림의 수식같이 따로 내적 없이 물체와 component-wise multiplication하는 것으로 Ambient term을 계산하고 Emissive는 물체 자체의 빛이 카메라에 들어오는 것이기 때문에 해당 값 자체를 Emissive term으로 사용합니다.

 

Ambient(위) 그리고 Emissive(아래)


 

  • Phong Lighting model

이로써 Phong Lighting model에 사용하는 4가지 term을 모두 알아보았습니다. 이 4가지 term을 모두 더하면 한 오브젝트를 보다 사실적으로 표현할 수 있습니다. 최종적으로 정리된 수식은 바로 아래에서 확인할 수 있습니다. 

Phong Lighting model

정리하자면, 앞서 vertex shader와 rasterizer의 보간을 통해 각 pixel의 normal vector n과 view vector v가 구해졌고, l vector는 설정한 값으로 주어집니다. 때문에 r vector는 계산 가능합니다. 그리고 또 m_d와 m_s 같은 object의 색상 정보는 이전 포스팅인 texturing 방법을 통해 그 값을 알 수 있습니다.

 

최종적으로 이렇게 구해진 값들을 종합해 각 pixel이 무슨 색상 정보를 가지고 있는지를 알아내고 물체를 보다 사실적으로 표현할 수 있습니다. 이렇게 앞선 단계부터 이러한 과정을 위해 pipeline이 설계되었다는 것을 이해할 수 있습니다.


감사합니다.

 

References

강의: [KUOCW] 한정현 교수님 강의

https://www.youtube.com/channel/UCfyXTCv0QlZxG1S1rteGI7A

강의 자료: 한정현 교수님 연구실 홈페이지
http://media.korea.ac.kr/books/