Pixel Shader에서 진행됨
- 보통 널리 쓰이는 것이 Phong model
- Diffuse
- Specular
- Ambient
- Emissive
Light Sources
Point light
- 한 점에서 모든 방향으로 발산함
- 멀어질수록 밝기가 약해짐
Directional light
- 한 방향으로 균일하게 빛을 비춘다
- 빛의 밝기가 거리와 관계 없음
Spotlight
- 원뿔 모양으로 빛을 낸다
- 원뿔의 중앙과 광원에 가까워지면 빛이 세짐
Ambient
Diffuse
직선광이 표면에 부딪혔을 때 흩뿌려지는 빛을 의미함
-> 균일하게 분산된다
- Lambert 법칙에 의해 모든 방향, 세기로 표면으로부터 흩뿌려진다
- 빛은 view와 독립적이므로 동일한 양의 빛이 흩뿌려짐

- 0도일 때 머리 위, 90도 일 때 지평선, 90도보다 크면 지평선 아래

- max(n⋅l,0), sd는 광원의 색, md는 물체 material의 diffuse 반사율

- md는 위의 그림처럼 diffuse light의 색을 바꿀 수 있음
Specular
표면에 빛이 닿았을 때 빛나는 부분

- diffuse와 달리 specular는 view에 의존적임

- 완전히 빛나는 표면을 위해서는 ρ가 0이어야 함, 0이 아니면 ρ가 커질 수록 약해짐

- sh: shininess
- sh가 커질수록 더 가파르게 떨어진다
- 실제 구현에서는 (max(r⋅v,0))shss x ms로 이루어짐
- md와 달리 ms는 RGB대신 gray-scale로 이루어진다
Ambient

- 간접 조명을 설명하는 일반적인 수준의 조명
- 다양한 오브젝트로부터 반사되는 빛들임
- 물체에 부딪혀서 반사되면 같은 세기로 모든 방향으로 흩뿌려진다
Emissive
Phong model Lighting 최종 식

Per-pixel Lighting
Per-Vertex Lighting vs Per-pixel Lighting
- Per-vertex lighting은 단순히 vertex의 color를 보간하기 때문에 퀄리티가 떨어짐

- direcional light를 받는다고 가정
- l은 모든 표면에서 동일하다
- constant buffer를 통해 constant vector로 Pixel shader에 제공된다
- 반면에 n,r,v는 물체 표면에 따라 다양함.
- Pixel shader에 n,v 한 쌍이 주어지고 그 다음 r을 계산한다.
- r=2n(n⋅l)−l
Normal for each pixel

- l이 world space 벡터이므로 n도 world space 벡터여야 함.
- rasterization stage에서 각 픽셀에 n을 제공하여 vertex normal이 보간된다
- vertex shader는 각 vertex의 object space normal을 월드 변환하고, world space normal을 rasterization 단계로 전달함
- 즉, object-space normal -> wolrd-space normal -> raterization
- a,b에 n1, n2를 이용하야 보간하여 na,nb를 할당한다(raterizer에서)
View vector for each pixel

- a,b 는world-space의 view vector도 알아야 함(va,vb)
- vertex shader는 각 vertex의 object space 위치를 world space로 변환하고 해당 위치를 world space에 정의되어 있는 camera position(EYE)에 연결한다
- rasterization 단계에서 va,vb는 v1,v2에 의해 보간당함
Pixel shader는 rasterizer로부터 각 픽셀별로 보간된 normal과 view vector를 받았다. l은 constant buffer로부터 받고, 마침내 Phong model 구현 가능.
- n,l,r,v 모두 world space에서 정의됨
Blinn-Phong Reflection Model
Phong model을 수정한 버전임
- 매우 효율적인 라이팅이지만 specular가 특정 조건에서는 비현실적으로 보임
- (max(r⋅v,0))shss x ms -> 90도 보다 커지면 0이 나옴 -> 순간적으로 cut되어 경계가 만들어짐(cosθ의 문제점)
-> 그래서 이를 극복하기 위해 specular를 변경

- reflection vector 대신 halfway vector 사용
- h는 v, l의 중간인 벡터
- (max(n⋅h,0))shss x ms -> 최종식