Lighting or illumination은 lights와 objects사이의 상호작용을 다루는 기법이다.
local illumination models 중 하나로 Phong lighting model이 있고 diffuse, specular, ambient, emissive 4가지 용어로 구성되어 있다.
여러가지 광원 형태가 있는데 가장 간단한 것은 directional light source이고 태양이 그 예시이다. 매우 강하고 scene에서 멀리 떨어져 있기 때문에 모든 물체가 거의 동일한 방향(universal direction)에서 태양빛을 받게 한다.

diffuse term은 Lambert's law를 기반으로 하는데 표면에서 이상적으로 일어나는 반사는 동일한 강도로 모든 방향으로 흩어져(=퍼져)나간다는 것이다.
그래서 인지된 반사의 양은 view direction과는 상관이없고 들어오는 빛의 양과 상관이 있다는 것이다.
light vector = l이라고 하고 표면의 법선 n과이루는 각도를 θ 라고 한다. 두 벡터가 유닛벡터이기에 두 벡터의 내적은 1x1xcosθ이기에 cosθ에만 영향을 받게된다. 그렇기에 태양이 두각도가 0일때 가장크고 90도일 때 가장 작은데 만일 90도 이상으로 갈경우 음수가 나오기에 max(dot(n,l),0)으로 범위를 정한다.

앞서 언급한 강도는 이제 color이라고 생각하면 된다.
만약 하얀 빛(1,1,1)이라고 할 경우, 물체가 빨간색으로 비춰지려면 R만을 반사하고 G,B는 완전히 흡수해야 한다.즉, (1,0,0)되어야 한다. 그리고 이런 필터링 과정을 material parameter을 거쳐서 간단하게 실행할 수 있다. 

specular term은 표면을 더 매끈(shiny)하게 만들기 위해 사용된다. 그리고 reflection vector(r)과 view vector(v)가 필요하다.

입사각 반사각을 이용하면 r에 대하여 n(법선),l(조명==directional light source) 이용할 수 있는 식이 나온다.

정반사는 매우 view-dependent한 성격을 가지고 있다.
완전히 매끈한(shiny) 표면은 ρ=0일때 이다.
ρ가 증가할수록 fall-off는 점점 뾰족해진다.(fall-off:광원으로부터 멀어질수록 광량이 감소하는 곳)

rapid fall-off of highlights는 밑에 코사인식과 근사하다. sh는 shiniess를 나타낸다.


정확히 반사되는 곳은 아니지만 광원의 영향이 있는 곳에 view vector이 있는 경우 그 물체에서 반사된 곳을 볼 수 있다.

m diffuse와 다르게 m specular은 주로 gray-scale value로 명도를 나타내는 데 사용된다.
ambient는 배경광으로 출처를 알 수 없는 광원(직접 조명), 여러 물체에 반사되어서 옴.
scene내 여러 곳에서 튕겨서 모든 방향으로 부터 surface point에 도착함. 도착한 빛은 동일한 강도로 모든방향으로 흩어져 나간다.-> 그렇기에 direct일 경우 음영인 부분도 보이게 할 수 있다.

emissive는 발광체로 스스로 발산하는 빛의 양을 설명한다.

지금까지 구한 4개의 terms를 더하면 된다.
fragment shader에서 앞서 나온 벡터인 l,n,r,v로 계산한다.
밑 그림에서 두 개의 다른 fragment를 고려할때(물체의 다른 두 지점) l은 모든 지점에 동일하게 적용되므로 uniform으로 제공되어진다.
반면 n,r,v는 각각 다르므로 따로 구해야 하는데 Open GL ES에서 r은 아까 배운 식을 이용해 스스로 계산하고 n,v는 rasterizer에서 나온 결과를 입력으로 받으면 된다.

이때 l이 world space vector이기 때문에 n또한 world space vector이어야 한다. 이것이 vertex shader에서 각 정점의 object-space법선에 대해 world-trasform을 한후에 world-space 법선을 rasterizer로 넘겨야 하는 이유이다.
이후 rasterizer에서 받은 입력으로 보간을 진행한다.
위와 동일하게 v도 각 정점의 os 위치를 ws로 변환한 후에 ws에 정의된 카메라 포지션에 연결해야 한다. 이후 rasterizer에서 보간을 진행한다.


v_normal은 ws이고 ws로 변환한 위치에서 ws내에 있는 EYE로 v_view 벡터 생성 모두 정규화를 해줘야 한다.
Phong lighting model을 위해서 변수를 만든다.

밑 식대로 함수를 사용하여 만들면 된다.
