이전 글에서 Phong의 Specular는 다음과 같이 계산했다.
즉,
- 빛 $L$을 Normal $N$에 대해 반사하여
- Reflection Vector $R$을 만들고
- 카메라 방향 $V$와 얼마나 가까운지 확인한다.
그런데 Blinn은 이를 조금 다른 방식으로 계산했다.
Half Vector
빛 방향 $L$과 카메라 방향 $V$가 있다고 하자.
두 벡터의 중간 방향을 계산한다.
이 벡터를 Half Vector라고 한다.
그리고 Blinn-Phong에서는 Specular를 다음처럼 계산한다.
코드로 보면 더욱 간단하다.
vec3 H = normalize(L + V);
float specular =
pow(max(dot(N, H), 0.0), shininess);
Phong의
dot(R, V)
가
dot(N, H)
로 바뀐 것이다.
그런데 왜 Half Vector인가?
처음 보면 단순한 계산상의 트릭처럼 느껴진다.
하지만 Half Vector에는 중요한 기하학적인 의미가 있다.
어떤 완벽한 거울이 있다고 생각해보자.
빛이 $L$ 방향에서 들어와 $V$ 방향으로 정확하게 반사되려면 그 거울의 Normal은 어느 방향이어야 할까?
바로 $L$과 $V$의 중간 방향이어야 한다.
즉,
가 된다.
V
/
/
↑ H
/
/
L
따라서
는 이렇게 해석할 수 있다.
현재 표면 Normal이 빛을 카메라로 완벽하게 반사하기 위해 필요한 Normal과 얼마나 가까운가?
아직은 Phong과 비슷해 보인다.
그런데 이 해석은 이후 Microfacet Model에서 매우 중요해진다.
표면을 하나의 평면이 아니라 작은 면들의 집합으로 본다면?
실제 표면을 아주 크게 확대하면 미세한 요철들이 존재한다.
N
↑
--------------------
확대
↗ ↑ ↖ ↗
/\ / \_/ \_/ \
각각의 작은 면에는 서로 다른 Normal이 존재한다.
이 작은 면을 Microfacet이라고 한다.
그렇다면 Specular reflection을 이렇게 생각할 수도 있다.
수많은 Microfacet 중에서 빛을 정확히 카메라 방향으로 반사하는 녀석이 얼마나 존재하는가?
그 Microfacet이 가져야 하는 Normal은 무엇일까?
앞에서 살펴본 바로 그 Half Vector다.
즉 Half Vector는 단순히 Blinn-Phong에서 계산을 바꾸기 위해 만들어진 값이 아니다.
Microfacet 관점에서는
빛을 카메라 방향으로 반사시키는 Microfacet이 가져야 하는 Normal
이라는 명확한 의미를 갖는다.
Phong → Blinn-Phong → Microfacet
세 모델을 연결하면 다음처럼 볼 수 있다.
Phong
Reflection Vector R을 구한다.
R ≈ V ?
→ Specular
Blinn-Phong
L과 V 사이의 Half Vector H를 구한다.
N ≈ H ?
→ Specular
Microfacet
빛을 V로 반사하려면
Microfacet Normal이 H여야 한다.
그런 Microfacet이 얼마나 존재하지?
→ Specular
바로 이 마지막 질문에서 현대적인 Specular 모델이 시작된다.
그런데 빛의 세기는 어떻게 정의해야 할까?
여기서 또 다른 문제가 있다.
Phong에서는
diffuse + specular
를 우리가 원하는 대로 더했다.
그렇다면 다음과 같은 것도 가능하다.
diffuse = 1.0;
specular = 1.0;
입력된 빛의 양보다 더 많은 빛을 반사해버리는 상황도 만들 수 있다.
현실에서는 물체가 스스로 에너지를 만들어내지 않는 이상 이런 일은 일어나면 안 된다.
따라서 현대적인 렌더링에서는
특정 방향에서 들어온 빛을 표면이 다른 방향으로 얼마나 반사하는가?
를 보다 명확하게 정의할 필요가 있다.
그 역할을 하는 것이 바로 BRDF다.
다음 글에서는 지금까지 사용하던 Diffuse + Specular라는 조명 공식을 BRDF라는 관점으로 다시 바라본다.