요즘 Real Time Rendering 책도 읽고 DXR프로그래밍도 접하면서 Ray Tracing과 Path Tracing이 무엇인지 정확히 알게된것 같은 기분이 들어서 이 글을 작성한다.
한짤 요약에서 말했듯이 Ray Tracing은 Path Tracing을 포함하는 개념이다.
컨셉은 그림을 그리는데 빛이 물체와 만났을 때 반사하고 굴절하는 성질을 이용하는 것이다.
컴퓨터 그래픽에서의 Ray Tracing은 렌더링을 함에 있어서 Ray(빛)를 사용해서 특정 pixel의 색을 결정하는데 영향을 주는 것을 말한다.
Path Tracing은 Ray Tracing의 ray를 사용한다는 컨셉은 유지하면서 조금 이상한 짓을 하는게 특징이다. 바로, 이전 글에서 언급한 렌더링 방정식을 풀기위해 한 픽셀에서 Ray를 수십,수백개를 발사해서 광원에 닿을 때까지 튕겨서 Path를 만들고 한 픽셀에서 만든 Path들의 평균 Color로 렌더링을 하는것이다. 이 방식을 사용하면 표면의 diffuse BRDF(난반사), specular BRDF(정반사)를 완전히 반영한 물리적으로 이상적인 렌더링을 할 수있다. 차세대 기술이라고 할 수 있다. 하지만, 수많은 Recursion콜을 수반하기 때문에 현재 실시간에 사용할 수 있도록 활발히 연구중이다(아직은 쓸게 못됨).
Path Tracing인지를 판단하는 좋은 방법은 Noise를 확인하는 것이다. Path Tracing은 필연적으로 Noise가 생길수 밖에 없기 때문이다. 그 이유는 다음과 같다.
- 모든 Ray가 광원에 닿을때까지 반사시킬 정도로 성능 여유가 없다.(Recursion이 중간에 끊기면서 Noise생성)
- Monte Carlo적분 자체가 애초에 컨셉이 '근사'이다. 이산적으로 값을 더하기에 자연의 연속적인 값의 합과 다르게 된다.
물론 샘플 수를 많게 Ray의 반사횟수 제한을 크게 걸면 Noise가 잘 안느껴지게 만들수는 있다. 그럼에도 Noise는 있다.
위 그림과 같은 짤을 발견한다면, Path Tracing의 한계로 인해 생긴 Noise라고 생각하면 된다.
위에서 Ray Tracing은 Path Tracing을 포함하는 개념이라고 언급했는데, 실제로 사람들은 이 두개념을 '다른 렌더링 방식' 으로 인지한다. 보통 다음과 같이 쓰인다.
Ray Tracing: 물체의 specular, shadow같은 것들을 계산하기위해 reflection ray, shadow ray를 한 두세번 정도만 Tracing하는 것(실제 게임에서 쓰는 방식)
Path Tracing: 렌더링 방정식을 Monte Carlo적분을 이용해서 각 픽셀마다 푸는 것. 순수하게 Ray만 사용하는 것
실제로 사람들이 Ray Tracing과 Path Tracing을 다른 개념인것 처럼 많이 다루니 이 차이를 알아둘 필요가 있다.