개요

렌더링기법중 하나로 광선이 물체의 표면에서 반사되어, 카메라를 거쳐 다시 돌아오는 경로를 계산하는 작업을 거친다. 좋은 품질의 이미지가 비교적 쉽게 나오지만, 이를 위해서 많은 계산량을 요구한다.

Ray tracing.png

기존 레스터 그래픽스와의 비교

레스터 그래픽스는 절대 물리 기반 렌더링이 아니다. 사람의 직관및 여러 수정된 물리 법칙등을 이용하여 그럴듯한 이미지를 만들어 내는데 치중한다. 이를 통해 레스터 그래픽스는 빠른 성능을 보이지만 현실적이지 못한 결과가 도출된다. 또한 많은 간접 광선이 이루어 내는 효과 (반사, 굴절등)을 표현하지 못해서 이런것도 다 핵으로 구현한다. 그러나 레이트레이싱은 모든 광선을 추적하여 이미지를 만들어 내기 때문에 보다 현실적인 그래픽을 만들어 낸다. 따라서 Global illumination이 매우 사실적으로 표현된다. 사실 그래픽스의 큰 두가지 흐름은 최대한 빠르게와 최대한 사실적으로 로 나뉘어져 있다. 그 대표주자가 각각 레스터 그래픽스와 레이 트레이싱인 것이다.

기본적인 흐름

  1. 광선을 만들어 낸다. 이때 광원에서 시작하는 광선이 아니라 카메라(눈)에서 시작하는 광선이다.
  2. 광선과 물체의 교점을 찾는다. 레이트레이싱에서 대부분의 연산을 차지하는 부분.
  3. 셰이딩을 한다.

광선 만들기

[math]p(t)=e+t(s-e)[/math] e 는 orgin (원점)이고 s는 표적이 되는 위치이다. 또한 (s-e)는 광선의 방향이다. 여기서 그렇다면 s를 어떻게 구할 것인가?

[math] p(t) = ray.origin + t * ray.direction [/math]

Orthographic Views

Orthographic view.png

Orthographic 모델은 원근법을 무시하고 광선을 발사하는 방식이다. 결과물에 원근법이 반영되지 않는다는 단점이 있지만, 물체가 왜곡되면 안되는 상황에서 사용한다.
이미지의 크기가 [math]n_x * n_y [/math]라 해보자. 또한 l은 가장 left 좌표 b는 가장 bottom의 좌표라 해보자. 또한 r은 가장 right좌표 t는 가장 top좌표라 하자. 또한 i와 j는 itteration 하는 i,j라 하자. 그러면 좌표를 계산하는 수식은 다음과 같다.

[math]\alpha = l+\frac{(r-l)(i+0.5)}{n_x}[/math]
[math]\beta = b + \frac{(t-b)(j+0.5)}{n_y} [/math]
[math]rat,direction := -w [/math] (카메라 좌표계의 -w)
[math]ray-origin := e + \alpha u + \beta v [/math]

Perspective Views

[math]\alpha = l+\frac{(r-l)(i+0.5)}{n_x}[/math]
[math]\beta = b + \frac{(t-b)(j+0.5)}{n_y} [/math]
[math]ray.direction := -dw + \alpha u + \beta v [/math] d는 카메라와 이미지 plane사이의 거리이다.
[math] ray.origin := e [/math]

물체와의 교점 찾기

광선이 [math]p(t) = e+td[/math]라 하자. 물체의 함수가 [math]f(t)=0[/math]음함수로 나타내져 있을경우 [math]f(p(t)) = f(e+td)=0 [/math]의 해가 물체와의 교점이 된다.

광선과 원의 교점

광선의 식:[math]p(t)=e+td[/math]
원의 식:[math](p-c)(p-c)-r^2=0[/math]
교점을 구하기 위한식:[math](e+td-c)(e+td-c)-r^2=0[/math]

광선과 삼각형의 교점

Intersection between ray and triangle.png
광선의 식:[math]p(t)=e+td[/math]
평면의 식:[math]a + \beta(b-a)+\gamma(c-a)[/math]
교점을 구하기 위한 식:[math]e+td=a + \beta(b-a)+\gamma(c-a)[/math]

[math]\gamma,\beta[/math]가 모두 범위 [0,1] 안에 있으면 교점이 존재하는 것이며, 아니면 교점이 존재하지 않는 것이다.

셰이딩

퐁 일루미네이션과 같은 셰이딩기법을 적용하여, 색을 칠해준다. 교점이 존재하지 않으면 background color로 채워준다.

Shadow Ray

Shadow ray offset.png

Shadow Ray란 광원으로 직접가는 광선을 말한다. shadow ray 가 다른 오브젝트와 충돌하면 그림자를 셰이딩을 하지 않고 충돌하지 않으면 셰이딩을 해준다. 이런 식으로 하면 그림자를 구현 할 수 있다. 컴퓨터가 실수를 처리하는 방식으로 인해서. shadow ray는 shadow ray를 쏘는 면과 (자기자신과)충돌 검사를 일으킬 수도 있다. 그렇기 때문에, 적당히 작은 offset 을 더해주어 그러한 충돌을 막는다. 그림에서는 엡실론으로 표시되어 있다.

Basic Ray Tracer Pseudo Code

광선을 만든다.
만약 광선과 다른 오브젝트가 충돌하면:
    만약 shadow ray와 광원사이에 다른 오브젝트가 존재하지 않으면:
        셰이딩을 한다.
    그림자값 (0)을 리턴한다.
백그라운드 컬러를 리턴한다.

종류

  1. Whitted Ray Tracing
  2. Distributed Ray Tracing
  3. Path Tracing

가속화 방식

레이트레이싱의 대부분을 처리하는 물체 찾기를 좀더 빠르게 해주는 자료구조는 다음과 같다. 크게 공간을 나누는 것과 물체를 나누는 것으로 구분한다.

  1. 바운딩 박스: 물체 주위에 충돌검사를 하는 박스를 이용하는 방식
  2. BVH:바운딩 박스를 이용하여, 구조적인 트리를 만들어 가속화
  3. AABB: 바운딩 박스중 흔히 쓰이는 직사각형을 이용한 방식
  4. Kd-트리:공간 분활의 대표적인 예시. BSP의 한 특별한 케이스이다. BSP중 축과 평행한 면을 사용하는 방식.
  5. Uniform Grid:공간을 같은 크기의 cell로 나누는 방식
  6. BSP:공간 분활 트리의 통칭이다.
  7. Octree: 공간을 나누긴 나누는데 BSP처럼 binary (이분)하는 것이 아니라 octa (8분)하는 방식이다. SIMD같은 병렬 처리에 특화된 방식이다.