2. Motion Blur

이현기·2022년 8월 12일
0

RayTracing:The-Next-Week

목록 보기
2/9
  • 주의 사항
  1. 이 글은 RayTracing:The Next week을 공부하며 작성한 글이다.
  2. 모든 사진, 글은 RayTracing:The Next week에서 가지고 왔다.
  3. 영어 해석, 이론적으로 틀린 내용이 존재할 경우가 매우 크다. (지적해주시면 감사합니다.)
  4. 글을 쓰는 능력이 매우 안좋으니 이해해주세요. 연습 중 입니다.

1. OverView

우리가 저번에 공부했던 Ray Tracing in one weeken에는 매우 간단하고 모든 경우의 수를 기반으로 하는 simple brute force path tracer를 Build해 봤다. 그리고 optimization은 모든 기능이 구현이 되었을 때 진행을 해야한다. 그래서 이 책에서는 가장 간단한 접근 법을 알려준다. 조금 더 자세히 보고싶다면 다음 시리즈의 책을 참고하자.(다음에 공부할 것.)
이 책에서는 두 가지의 가장 어려운 두 Part가 존재한다. 바로 BVH 그리고 Perlin textures가 있다. 그래서 in one weekend 다음 시리즈인 이 책에 넣은 이유이다.

설명하는 내용이 많았다. 이제 Motion Blur부터 천천히 살펴 보자.

2. Motion Blur

우리가 RayTracer을 선택했었을 때, 우리는 Run-time보다 visual quality(시각적 품질)을 더 중요하게 생각했다. 그래서 fuzzy reflection과 defocus blur에서 우리는 각 pixel에 대한 더 많은 sample을 필요로 했다. 조금 더 나아가자면, Ray Tracing으로 거의 모든 효과들을 나타낼 수 있다는 것이다. 그중 대표적인 예로 Motion Blur가 존재한다. 실제로 카메라에서, shutter가 사진을 찍기 위해서 열리고 닫히기 전까지 그 시간동안 물체가 움직임의 평균이다.

쉽게, 물체가 빨리 움직여서 생성되는 잔상이라고 생각하면 이해가 편했다.

그러면 Ray를 이용하여 우리는 어떻게 Motion Blur를 효과를 나타낼 수 있을까?

우리는 무작위로 shutter가 열렸을 때 Random한 Ray를 보내어 random한 추정을 얻을 수 있다. 물체가 그 시간에 그 자리에 존재하는 한, 우리는 한 time에서 ray를 보냄으로써 그에 대한 올바른 평균 답안을 얻을 수 있다. 이것은 Random Ray Tracing이 간단한 경향을 띄고 있는 이유이다.

기본적인 아이디어는 shutter가 열렸을 때 random한 시간에 Ray를 생성하고 이 생성된 Ray를 Model과 한 번 교차킨다. 이 방법은 보통 카메라를 움직이면서 물체를 움직이는 방식으로 사용된다. 하지만 정확하게 각 Ray들이 한 번 존재해야 한다. 이 방법을 사용한다면 Ray Tracer의 "Engine"이 물체가 광선을 위해 있어야 할 곳에 있는 지 확인 할 수 있으며, Intersection guts가 많이 변하지 않는다.

intersection guts라는 뜻? 교차 차이? 잘 모르겠다.. ㅠ
Time이라는 변수를 추가해서 변수를 이용하여 한 번인 것을 Check하려는 것 같다.

책에서 설명한 듯이 코드를 수정해서 Motion Blur효과를 나타내보자.

기존과 같이 Moving_sphere라는 Class를 생성하고 Camera와 Ray class에 time0, time1이라는 변수를 추가하고 연산을 하는 것을 확인 할 수 있었다. 앞서 말한 셔터의 시간에 대한 정보를 가지고 있는 변수라고 생각이 되었다. Moving_sphere는 앞서 sphere에서 원의 방정식을 사용하여 원을 만들어 주었지만 조금 다른 점이 존재한다.

t2b    2tb    (AC)+(AC)    (AC)r2=0t^2 b \; \cdot \; 2tb \;\cdot\; (A-C) + (A-C)\;\cdot\;(A-C) - r^2 = 0

우리는 RayTracing:In one weekend에서 위의 식은 t에 관한 2차 방정식으로 볼 수 있기 때문에 근의 공식을 이용하여 hit 여부를 판단했다. 여기에서 oc를 구하기 위해서 r.origing - center(r.time()) 를 사용하는데 center함수를 보면 아래와 같다.

Cmoving=Copen+traytopentclosetopen×(CcloseCopen)\vec{C_{moving}} = \vec{C_{open}} + \frac{t_{ray} - t_{open}}{t_{close} - t_{open}} \times (\vec{C_{close}} - \vec{C_{open}})

위의 방정식을 설명하자면 앞서 Motion blur가 일어나려면 shutter가 open되었을 때 부터 close될 때까지 ray는 Random하게 generate된다고 했다. 그래서 위의 수식을 글로 설명을 하자면 shutter가 open되었을 때의 center point와 그리고 close되었을 때 center point의 거리에서 shutter가 open될때 부터 close될 때 까지의 시간에서 shutter가 open되었을 때 부터 ray가 generate된 시간 비율을 곱해주어 기존의 center point에 더해주는 것이다.
결과적으로 Motion Blur는 Center point만 시간에 따라서 변경을 해주고 나머지는 동일하게 처리해준다.

위의 말을 조금 더 쉽게 하자면 shutter가 켜질 동안 시간을 비율로 해서 거리를 곱해준 것과 마찬 가지다!! 맞게 설명된 것인지도 모르겠다..ㅠㅠ

결과.

우당당탕 하는 느낌이나지만 랜더링 속도가 너무 답답해...

profile
안녕하세요!

0개의 댓글