Phong에서 PBR까지 (1) - 우리는 반짝임을 어떻게 계산했을까?

Phong Reflection Model을 통해 실시간 렌더링에서 Diffuse와 Specular를 계산하는 가장 고전적인 방법을 살펴봅니다.

Series Phong에서 PBR까지 1 / 6

렌더링을 처음 공부하면 가장 먼저 만나는 조명 모델 중 하나가 Phong Reflection Model이다.

나 역시 처음 조명을 구현했을 때 다음과 같은 형태로 계산했다.

Color =
    Ambient +
    Diffuse +
    Specular;

Diffuse에는 N · L을 사용하고, Specular에는 반사 벡터와 카메라 벡터의 내적을 사용한다.

float diffuse =
    max(dot(N, L), 0.0);

vec3 R =
    reflect(-L, N);

float specular =
    pow(max(dot(R, V), 0.0), shininess);

이 간단한 식만으로도 제법 그럴듯한 물체를 렌더링할 수 있다.

그런데 Unreal Engine 같은 현대 게임 엔진으로 넘어가면 갑자기 Shininess가 사라지고 다음과 같은 값들이 등장한다.

  • Base Color
  • Metallic
  • Roughness
  • Specular

그리고 렌더링 관련 자료를 읽다 보면 갑자기 다음과 같은 용어도 튀어나온다.

  • BRDF
  • Microfacet
  • GGX
  • Smith
  • Fresnel
  • Cook-Torrance

Phong밖에 모르는 입장에서는 대체 어디서부터 이렇게 복잡해진 것인지 알기 어렵다.

이번 시리즈에서는 Phong에서 출발해 현대 게임 엔진의 PBR까지 하나씩 이어가 보려고 한다.


Phong Shading과 Phong Reflection Model

먼저 용어 하나를 구분할 필요가 있다.

Phong Shading과 Phong Reflection Model은 엄밀히 말하면 다른 개념이다.

Phong Shading

Triangle의 vertex normal을 보간하여 각 pixel에서 normal을 구한 뒤 lighting을 계산하는 shading 방식을 의미한다.

즉,

Vertex Normal
     ↓
보간
     ↓
Pixel Normal
     ↓
Lighting 계산

이라는 이야기다.

Phong Reflection Model

반면 이번 글에서 다루는 것은 빛을 어떻게 계산할 것인가에 대한 모델이다.

보통 다음 세 항으로 구성된다.

$$ I = I_{ambient} + I_{diffuse} + I_{specular} $$

따라서 흔히 “Phong 조명"이라고 말할 때는 두 개념이 섞여 사용되는 경우가 있다.

이번 시리즈에서 PBR과 비교할 대상은 후자인 Phong Reflection Model이다.


Diffuse: 표면이 빛을 얼마나 바라보고 있는가

Diffuse는 보통 Lambertian reflection을 이용한다.

$$ I_d = k_d \max(N \cdot L, 0) $$

여기서

  • $N$: 표면 Normal
  • $L$: 표면에서 광원으로 향하는 방향
  • $k_d$: Diffuse Color

이다.

빛을 정면으로 바라볼수록 $N \cdot L$이 1에 가까워지고 밝아진다.

반대로 빛과 수직에 가까워질수록 0에 가까워진다.

       L
       ↓
       ↓
-------↑------- Surface
       N

N · L ≈ 1

이 부분은 현대 PBR에서도 형태가 크게 낯설지 않다.

진짜 차이가 커지는 부분은 Specular다.


Specular: 카메라가 반사 방향에 얼마나 가까운가

Phong은 빛이 표면에서 완전히 거울 반사된 방향 $R$을 계산한다.

그리고 카메라 방향 $V$와 비교한다.

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

여기서 $s$가 shininess다.

카메라가 정확히 반사 방향에 위치하면

$$ R \cdot V = 1 $$

이므로 강한 하이라이트가 발생한다.


Shininess

shininess는 하이라이트의 폭을 조절한다.

Shininess가 클 때

$$ (R \cdot V)^{100} $$

1에서 조금만 멀어져도 값이 빠르게 감소한다.

따라서 하이라이트가 좁고 날카롭다.

          *
         ***
--------*****--------

Shininess가 작을 때

$$ (R \cdot V)^4 $$

값이 천천히 감소하므로 넓은 영역에 Specular가 나타난다.

       *******
    *************
---------------------

여기까지만 보면 꽤 훌륭하다.

그런데 한 가지 의문이 생긴다.

Shininess가 대체 물체의 어떤 물리적 성질을 의미할까?

shininess = 32인 물질이 현실에서 정확히 무엇을 의미하는지는 알기 어렵다.

그저 숫자를 높이면 반짝임이 좁아지고, 낮추면 넓어진다.

즉 결과를 원하는 모습으로 만들기 위한 경험적인 파라미터에 가깝다.


Phong 모델의 한계

Phong Reflection Model이 나쁘다는 뜻은 아니다.

단순하고 빠르며, 적은 연산으로도 상당히 그럴듯한 결과를 얻을 수 있다.

문제는 현실의 빛과 물질을 설명하려고 할 때 나타난다.

예를 들어 Phong의 Specular는 본질적으로 다음 질문만 한다.

완전 반사 방향과 카메라 방향이 얼마나 가까운가?

하지만 현실의 표면은 완벽하게 평평하지 않다.

우리가 보는 표면

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

아주 크게 확대하면

 /\    /\/\      /\
/  \__/    \_/\_/  \

표면에는 미세한 요철이 존재한다.

그렇다면 반짝임의 폭을 단순히

pow(RdotV, shininess)

로 만들어내는 대신,

실제 표면의 미세한 방향들이 어떻게 분포되어 있는가?

를 모델링할 수도 있지 않을까?

현대의 Microfacet Model은 바로 여기서 출발한다.

하지만 그 전에 Phong과 현대 Microfacet Model 사이를 연결해 주는 중요한 개념이 하나 있다.

Half Vector다.

다음 글에서는 Blinn-Phong을 통해 Half Vector가 왜 등장했는지 살펴본다.



다음 편