Ibl

16 분 소요

앞서서

\[L_o(p, w_o) = \int_\Omega { f_r(p, w_i, w_o)L_i(p, w_i) n \cdot w_i dw_i}\] \[f_r(p, w_i, w_o) = \cfrac{ FGD}{4(w_o \cdot n)(w_i \cdot n)}\]

Rendering Equation 에서 Reflect 부분만 떼어놓은 식과 \(f_r\) 로 많이 사용되는 Cook-Torrance microfacet BRDF 을 일단 적어둔다.

Diffuse

Precomputed-Light-Field-Probes 을 이해해보려고 했는데 너무 어렵다.

WebGL Precomputed Light Probe 가 위 Paper 를 잘 구현해놓았으니 참고하자.

기본적으로 Light Probe 를 균등한 Grid 로 깔아두고 Radiance, Normal, Distance 등을 샘플링하여 Octahedral Encoding 하여 저장한 후 이를 이용해 Indirect Light 를 처리한다.

크게 Spatial-Temporal Radiance Denoising 부분과 Irradiance with (Pre-)Filtered Visibility 부분이 있다.

  • 전자의 경우 Tracing 알고리즘이 너무 복잡하다…
  • 후자의 경우는 큐브 형태의 8개의 Light Probe 의 Radiance 와 Distance 를 사용한다. 위치에 따른 가중치와, Mean Distance 와 Variance 를 이용하는 Chebychev Filter 그리고 Normal 과 LightProbe 방향 간의 Dot Product 를 이용한 Smooth Back Culling 를 이용해 TriLinear Interpolation 을 한다.

Specular

LearnOpenGl1 와 Unreal4 Doc2 를 주로 참고하였다.

Approximation

\[L_o(p, \omega_o) = \int_\Omega {L_i(p, w_i)d\omega_i} * \int_\Omega {f_r(p, w_i, w_o) \omega_g \cdot \omega_i d\omega_i}\]

기존의 Render Equation 의 Reflection 부분을 전처리를 용의하기 위해 위의 식으로 바꾼다.

앞쪽 적분이 Pre-filtering Environment Map 가 되고 뒤쪽 적분이 LUT 가 된다.

Pre-filtering Environment Map

Since it’s a microfacet model, the shape of the distribution changes based on viewing angle to the surface, so we assume that this angle is zero, i.e. n = v = r.2

Pre-filtering Environment Map 을 구할 때 Light Vector 는 View Vector 와 독립적이지 않지만 그러면 계산하기가 너무 어렵다. 그래서 위와 같은 가정을 추가로 붙인다.

View 와 Normal 이 극적으로 달라지는 경우, 예를들어 호수의 수면에 물가의 물체가 비칠때, 정반사가 카메라쪽으로 편향되지 않는 등 정확한 결과를 얻을 순 없지만 괜찮은 Trade Off 이다.

\(\omega_g \cdot \omega_i\) 의 Weight 를 준 Biased Importance Sampling 을 하면 더 좋은 결과를 얻는다고 한다.2

Microfacet Importance Sampling

Normal Distribution Function

\[D(n, h, a) = \cfrac{a^2}{\pi((a^2-1)(n \cdot h)^2+1)^2}\]

\(D\) 는 Normal Distribution Function 으로 Trowbridge-Reitz GGX 가 잘 사용되고 이는 위와 같다.

주의할 점은 \(D\) 는 정규분포도 아니고 확률분포도 아니라는 점이다. (9)3 에서

\[\int_\Omega(\omega_m \cdot \omega_g)D(\omega_m) d\omega_w = \int_\mathcal{M}(\omega_m(p_m) \cdot \omega_g)dp_m = 1m^2\]

이며 spatial to statistical integrals 을 위해 사용된다. 간단하게 말하면 Microspace Normal 이 \(h\) 방향으로 얼마나 있는지 알려주는 함수이다. 이에 대한 이야기는 ReedBeta Blog 에서 더 살펴볼 수 있다.

우리가 원하는건 \(D\) 를 이용해서 Microfacet Normal 을 Sampling 하는 것이다. 이에 대한 자세한 과정은 AGraphicsGuy Blog 에 잘 나와 있지만 이를 자세히 정리해보자.

PDF

Unit Hemisphere 내에서 Microspace 내의 Normal 분포인 PDF 는 (9)3 를 이용하면 다음과 같이 둘 수 있다.

\[p_h(\omega) = \cfrac{a^2 \cos{\theta}}{\pi((a^2-1)\cos^2\theta+1)^2}\]

이때 \(\omega\) 는 Solid Angle 에서 바로 얻은 값이다. 사용하기 쉬운 Spherical Coordinate 로 변환하면 다음과 같다.4

\[p_h(\theta, \phi) = \cfrac{a^2 \cos{\theta} \sin{\theta} }{\pi((a^2-1)\cos^2\theta+1)^2}\]

여기서 Marginal PDF of \(\theta\) 을 구하는건 \(2\pi\) 만 곱해주면 된다.

\[p_h(\theta) = \cfrac{2 a^2 \cos{\theta} \sin{\theta} }{((a^2-1)\cos^2\theta+1)^2}\]

Inverse CDF Method

우선 \(p_h(\theta)\) 를 적분해 CDF 를 만들자.

\[\begin{multline} P_h(\theta) \\ \shoveleft = \int_{0}^{\theta} \cfrac{2a^2 \cos{t} \sin{t}}{((a^2-1)\cos^2t+1)^2}dt \\ \shoveleft = \int_{1}^{\cos^2\theta} \cfrac{-a^2}{((a^2 - 1)x+1)^2}dx \\ \shoveleft = \cfrac{a^2}{a^2-1} \left( \cfrac{1}{(a^2 - 1)\cos^2{\theta} + 1} - \cfrac{1}{a^2} \right) \\ \shoveleft = \cfrac{a^2}{(a^2 - 1)^2\cos^2{\theta} + a^2 - 1} - \cfrac{1}{a^2-1} \end{multline}\]

우리는 CDF 을 이용해 [0, 1] 사이의 Uniform Random Variable 에서 Microfacet Normal 을 아래와 같이 얻을 수 있다.

\[\begin{multline} \xi = \cfrac{a^2}{(a^2 - 1)^2\cos^2{\theta} + a^2 - 1} - \cfrac{1}{a^2-1} \\ \shoveleft \cfrac{\xi(a^2-1)+1}{a^2} = \cfrac{1}{\cos^2{\theta}(a^2-1) + 1} \\ \shoveleft \cfrac{a^2 - 1 -\xi(a^2-1)}{(\xi(a^2-1)+1)(a^2-1)} = \cos^2\theta(a^2-1) \\ \shoveleft \theta = \sqrt{\cfrac{1-\xi}{\xi(a^2-1)+1}} \end{multline}\]

위에 구한 \(\theta\) 를 구분을 위해 \(\theta_m\) 라고 하자.

Importance Sampling

우리는 두가지를 염두에 두어야한다.

  • Importance Sampling 을 하기 위해서는 분모에 PDF 를 나누어야 한다.
  • 우리는 \(\theta_m\) 가 필요한 것이 아니다. View Vector 인 \(\omega_o\) 가 있을 때 Light Source Vector 인 \(\omega_i\) 가 필요한 것이다.

그러므로 우리는 여러번의 Jacobian Transformation 을 수행해야한다.

  • 우선 주어진 \(\theta_m\) 와 \(\phi_m\)(PDF 특성상 독립적인 값) 를 Cartesian Coordinate 으로 바꾸어야한다. Determinant of Spherical to Cartesian transform jacobian matrix is \(r^2\sin\theta\).5
  • 반사 공식인 \(\omega_i = 2(\omega_o \cdot \omega_m) \omega_m - \omega_o\) 에 따른 determinant of jacobian transform 은 \(\cfrac{1}{4 (\omega_o \cdot \omega_m )}\) 가 된다.6

그러면 다음과 같은 PDF 를 얻을 수 있다.

\[p_i(\omega_h, \omega_o) = \cfrac{a^2 \cos{\theta_m} \sin{\theta_m} }{\pi((a^2-1)\cos^2\theta_m+1)^2} \cfrac{\sin\theta_m}{4 ( \omega_o \cdot \omega_m )} = D \cfrac{\omega_m \cdot \omega_g}{4(\omega_o \cdot \omega_m)}\]

LUT(Look Up Texture)

Importance Sampling 을 \(f_r(p, w_i, w_o) n \cdot w_i\) 에 적용해보자.

\[\begin{multline} \cfrac{f_r(p, w_i, w_o)} {p_i(\omega_h, \omega_o) } \omega_g \cdot \omega_i \\ \shoveleft = \cfrac{ FGD }{4(\omega_o \cdot \omega_g)(\omega_i \cdot \omega_g)} \cfrac{\omega_g \cdot \omega_i}{D} \cfrac{4 (\omega_o \cdot \omega_m)}{ \omega_m \cdot \omega_g } \\ \shoveleft = FG \cfrac{\omega_o \cdot \omega_m}{(\omega_o \cdot \omega_g)(\omega_m \cdot \omega_g)} \end{multline}\]

이때 편의상 \(Gv = G \cfrac{\omega_o \cdot \omega_m}{(\omega_o \cdot \omega_g)(\omega_m \cdot \omega_g)}\) 라고 하자.

\(F_0\) 과 독립적인 값을 얻기 위해서 위 식을 변형한다. Fresnel-Schlick approximation 을 사용할 때 \(Fc = (1 - \omega_o \cdot \omega_m)^5\) 라고 하면

\[\int_\Omega f_r(p, w_i, w_o) \omega_g \cdot \omega_i d\omega_i = F_0 \int_\Omega Gv(1-Fc) d\omega_i + \int_\Omega Gv Fc d\omega_i\]

위와 같은 식을 얻을 수 있다.1

참고자료

ReedBeta’s Blog

AGraphicsGuy’s Blog

댓글남기기