Phong에서 PBR까지 (2) - Half Vector는 왜 등장했을까?

Phong의 Reflection Vector 대신 Half Vector를 사용하는 Blinn-Phong을 살펴보고, 이 개념이 Microfacet Model로 어떻게 이어지는지 알아봅니다.

Series Phong에서 PBR까지 2 / 6

이전 편

이전 글에서 Phong의 Specular는 다음과 같이 계산했다.

$$ I_s = k_s(R \cdot V)^s $$

즉,

  1. 빛 $L$을 Normal $N$에 대해 반사하여
  2. Reflection Vector $R$을 만들고
  3. 카메라 방향 $V$와 얼마나 가까운지 확인한다.

그런데 Blinn은 이를 조금 다른 방식으로 계산했다.


Half Vector

빛 방향 $L$과 카메라 방향 $V$가 있다고 하자.

두 벡터의 중간 방향을 계산한다.

$$ H = \frac{L+V} {\|L+V\|} $$

이 벡터를 Half Vector라고 한다.

그리고 Blinn-Phong에서는 Specular를 다음처럼 계산한다.

$$ I_s = k_s\max(N\cdot H,0)^s $$

코드로 보면 더욱 간단하다.

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$의 중간 방향이어야 한다.

즉,

$$ N_{mirror} = H $$

가 된다.

          V
         /
        /
       ↑ H
      /
     /
    L

따라서

$$ N \cdot H $$

는 이렇게 해석할 수 있다.

현재 표면 Normal이 빛을 카메라로 완벽하게 반사하기 위해 필요한 Normal과 얼마나 가까운가?

아직은 Phong과 비슷해 보인다.

그런데 이 해석은 이후 Microfacet Model에서 매우 중요해진다.


표면을 하나의 평면이 아니라 작은 면들의 집합으로 본다면?

실제 표면을 아주 크게 확대하면 미세한 요철들이 존재한다.

          N
          ↑

--------------------

       확대

  ↗  ↑   ↖   ↗
 /\ / \_/ \_/  \

각각의 작은 면에는 서로 다른 Normal이 존재한다.

이 작은 면을 Microfacet이라고 한다.

그렇다면 Specular reflection을 이렇게 생각할 수도 있다.

수많은 Microfacet 중에서 빛을 정확히 카메라 방향으로 반사하는 녀석이 얼마나 존재하는가?

그 Microfacet이 가져야 하는 Normal은 무엇일까?

앞에서 살펴본 바로 그 Half Vector다.

$$ N_{microfacet}=H $$

즉 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라는 관점으로 다시 바라본다.


다음 편