[RT in One Weekend Series 12] Defocus Blur (번역)

By | 2019-09-16

목차: Series 1: Index and Overview (Link)
이전 글: Series 11: Poisionable Camera (Link)
다음 글: Series 13: Where Next? (Link)

이번 RT 시리즈의 마지막 Feature는 Defocus Blur이다. Photographers(사진사?)는 Defocus Blur Feature를 보통 “Depth of Field”라고 한다. 실제 카메라를 사용해서 사진을 찍으면 Defocus Blur 현상이 나타나는 이유는 카메라 렌즈가 구멍(Big Hole)으로 만들어져있기 때문이다 (현재 우리가 구현한 코드는 아주 작은 Pinhole 형태를 가정한 것이다). 그래서 특정 거리에 있는 물체는  Focus가 되어서 잘 보이고 그렇지 않은 물체의 경우 흐릿하게 보이는 현상이 있다 (사진을 찍으면 중간에 위치한 캐릭터가 잘나오고 나머지는 약간 흐리게 나오는 현상을 말하는 것 같다).

이렇게 Focus를 조절하기 위해서 보통 렌즈(Lens)의 크기를 조절한다. 핸드폰의 경우 보통 Sensor(Film을 의미하는 것 같음)가 움직여서 Focus 조절 한다고 한다. 실제 카메라에서 더 많은 빛을 받기 원하면 “Aperture (Lens에 있는 Hole을 의미함)”을 크게 만든다. 이 Aperture로 인해서 Defocus Blur가 발생하게 된다. 우리가 만드는 Ray Tracing과 같은 Virtual Camera를 사용하는 경우 더 많은 빛이 필요하지 않기 때문에 Defocus Blur 현상을 만들고 싶은 경우에만 Aperture 관련 부분을 구현한다.

실제 카메라는 Compound Lens(복합 렌즈)를 사용하여 복잡한 구조를 가진다. 아래 그림 1은 실제 카메라가 구성된 형태를 보여준다. 우리는 복잡한 렌즈를 계산하기 위해서 Sensor, Aperture, Lens, Figure 등을 모두 구현하여서 완벽한 결과 이미지를 생성할 수 있다. 이렇게 생성된 이미지를 다시 뒤집어서 실제 카메라를 시뮬레이션 할 수 있다 (보통 카메라는 사진 촬영을 하면 이미지를 뒤집어서 저장한다).

그림 1: 카메라 구성 (출처 1)

하지만 이러한 절차는 복잡한 관계로 카메라 내부를 구현하지 않고 카메라 외부만을 구현하여서 Defocus Blur 현상을 재연할 수 있다. 이전에 구현한 RT에서는 모든 Ray가 항상 동일한 위치에서 출발한다. 하지만 이번 장에서는 Lens의 Surface에서 Ray를 생성하여서 Virtual Film Plane(가상 필름 영역)으로 Ray를 보낸다.

MK: 설명으로는 약간 이해가 어려운 부분이 있는 것 같다. 코드를 보면 작은 원의 무작위 위치에서 Ray를 생성한다. 그리고 해당 Ray를 Virtual Film Plane으로 보낸다. Ray가 발사되는 Virtual Flim Plane의 최종 위치 역시 작은 원의 무작위 위치 값을 사용하여 최종 위치 값을 결정하게 된다 (솔직히 이 부분이 정확히 왜 필요한지 잘 모르겠다).

아래 코드 1은 Defocus Blur 효과를 구현하기 위한 Camera 코드이다. 코드 2는 Lens 효과를 구현하기 위해서 randomInUnitDisk() 함수를 추가한 Vec 코드이다. 마지막으로  코드 3은 새로 작성한 Camera 코드를 사용하기 위한 Main 함수 코드이다.

코드 1: Defocus Blur Camera 코드

코드 2: randomInUnitDisk 함수를 추가한 Vec 코드

코드 3: Main 함수 코드

위 코드를 컴파일해서 실행하면 아래 그림3의 결과를 확인 할 수 있다. 중간에 위치한 파란색 구는 선명하지만, 옆에 있는 다른 2개의 구는 선명도가 떨어진 것을 확인 할 수 있다.

그림 3: 최종 결과 이미지

출처

  1. http://www.realtimerendering.com/raytracing/Ray%20Tracing%20in%20a%20Weekend.pdf

Leave a Reply

Your email address will not be published. Required fields are marked *