Path Tracing 기본 수식 그래픽스/렌더링

Path Tracing 을 구현할 때 필요한 기본적인 수식을 정리해 보겠습니다. 

미소 표면 x 에서 w_o 방향으로 발산하는 radiance L_o 는 다음과 같이 쓸 수 있습니다.

$$L_o(x, w_o) = L_e(x, w_o) + L_r(x, w_o) \tag{1}$$

L_e 는 표면이 발광하는 물체일때 직접적으로 발산하는 radiance 고, L_r 은 모든 방향에서 들어오는 L_i 가 BRDF 에 의해서 반사되는 radiance 를 나타냅니다. 식으로 풀어쓰면,

$$L_r(x, w_o) = \int_\Omega L_i(x, w_i) f_r(x, w_i, w_o) |N_x \cdot w_i| d\omega_i\tag{2}$$

위의 식만으로 Path Tracer 를 구현하자면 광원에 닿을 때 까지 재귀적으로 적분을 수행해야 합니다. 실제로는 Monte Carlo 적분을 하게 되는데 tracing depth 는 제한이 있으므로, 광원의 크기가 작을 수록 적분의 수렴률은 떨어지게 됩니다. 이것은 극심한 noise 의 원인이 됩니다. 예를 들어 무한히 작은 점광원일 경우, 점에 도달할 확률은 0% 에 가까우므로 해를 구하는 것은 불가능에 가깝습니다. 하지만 식을 변형하면 solid angle 에 대한 적분을 광원의 면적에 대한 적분으로 빼낼 수 있습니다. 

우선 L_i 는 또 다른 임의의 미소 표면 x' 에서 반사되어 나오는 것이므로 L_o 로 바꿔쓸 수 있습니다.

$$L_r(x, w_o) = \int_\Omega L_o(x', -w_i) f_r(x, w_i, w_o) |N_x \cdot w_i| d\omega_i \tag{3}$$

이제 식 (1) 을 (3) 에 대입하면,

$$L_r(x, w_o) = \int_\Omega \left( L_e(x', -w_i) + L_r(x', -w_i) \right) f_r(x, w_i, w_o) |N_x \cdot w_i| d\omega_i$$
$$= \int_\Omega L_e(x', -w_i) f_r(x, w_i, w_o) |N_x \cdot w_i| d\omega + \int_\Omega L_r(x', -w_i) f_r(x, w_i, w_o) |N_x \cdot w_i| d\omega_i$$
$$= \int_A L_e(x' \rightarrow x) f_r(x, \overrightarrow{x'x}, w_o) V(x', x) \frac{|N_{x'} \cdot \overrightarrow{x'x}| |N_x \cdot \overrightarrow{xx'}|}{||x' - x||^2} dA + \int_\Omega L_r(x', -w_i) f_r(x, w_i, w_o) |N_x \cdot w_i| d\omega_i$$
$$= L_{direct} + L_{indirect}$$

여기서 V 는 x' 에서 x 가 보이는지에 대한 0 or 1 의 가시성 함수 입니다. 

결과적으로 L_{direct} 항에 의해 광원에 대한 직접적인 라이팅 계산을 할 수 있게 되었습니다. L_{indirect} 항은 여전히 재귀함수이지만 함수안에 직접 라이팅 항을 가지므로 좀 더 빠르게 해에 수렴하게 됩니다. (이것을 next event estimation 이라고 부릅니다) 

여기서 한가지 주의할 점이 있습니다. 광원 방향의 적분은 이미 L_{direct} 에 포함되기 때문에 L_{indirect} 를 구할 때는 중복되므로 제외시켜야 하는 것이 맞습니다.

픽셀 당 샘플수 16

픽셀 당 샘플수 16 + next event estimation

픽셀 당 샘플 수 4096 + next event estimation

참고:
Advanced Global Illumination (A K Peters)

덧글

댓글 입력 영역