본문 바로가기

ComputerScience/Computer Graphics

CG - 14. Global illuminations(Ray Tracing)

728x90

1. Ray Tracing

- 카메라에서 모든 frame buffer에 있는 image의 pixel에 빛을 쏴서 닿는 곳에서 색을 계산하는 것이다.

- 광원의 직접적인 빛뿐만 아니라 모든 물체들간에 반사되는 빛을 고려하여 simulating하는 방법이다.

- 훨씬 사실적인 묘사가 가능하다.

- relection(반사), refraction (투명한 물체를 통과하면서 보이는 효과), 그림자, scattring(산란) 등 다양한 optical effect를 구현할 수 있다.

- 빛이 반사가 되어 다른 표면에 밝게 초점이 맺히는 caustic 현상도 구현할 수 있다.

- 반사되어 색이 물드는 color bleeding도 잘 반영된다.

2. Idea

- Forward Mapping은 자연 현상에서 물체를 보는 방식과 같다.

- 광원에서 나오는 무한대의 빛이 물체를 반사해가며 뻗어나가는데 이중 눈에 들어오는 빛으로 물체를 바라보는 것을 말한다.

- 이는 실제로 구현하기 매우 어렵다. 무한한 ray중 어떤게 눈에 들어올지 계산하는것이 어렵기 때문이다.

- 따라서 거꾸로 눈에서부터 ray를 쏴서 path를 역추적하는 방식을 Backward Mapping이라고 한다. 이 방법이 ray tracing의 기본 아이디어 이다.

 

 - 첫번째로 눈에서 해당 픽셀로 ray를 쏜다.

- 첫번째로 마주치는 물체의 점a을 찾는다.

- 그 점으로 들어오는 direct light를 계산한다.

- 계산한 결과값을 픽셀에 더한다.

- a로부터 반사되어 나간 빛이 또 다른 점b에 닿는다.

- b로 들어오는 direct light를 계산한다.

- 계산한 결과값을 path를 타고 가서 픽셀에 더해준다.

- 이렇게 recursively 하게 픽셀의 색을 결정한다.

- 반사되어 a에서 b로 가는 빛도 있겠지만 투명한 물체라서 통과하여 새로운 점c로 닿을 수도 있다. 이를 모두 더하게 된다.

3. Scan Conversion vs Ray Tracing

- scan conversion은 이제까지 배운 graphics 파이프라인(v, f shader)을 거쳐서 rasterize하는 방식이였다면

- Ray Tracing은 이를 역행한다고 볼 수 있다.

4. Ray Generation

 

- E에서 나오는 ray를 직선의 식으로 표현하면 위와 같다. 눈 위치가 t=0, pixel위치가 t=1이 된다.

- 만약 이미지가 512 by 512라면 ray는 총 266144개가 필요하다. 하지만 이거는 첫 ray들이고 secondary ray까지 고려하면 그 cost가 어마어마 하다.

- 이렇게 ray들이 tree 형태로 생겨나게 되고 역전파 하며 픽셀에 색을 더해나가게 된다.

5. Ray intersection

bounding volumn hierarchies

- 그 다음은 ray와 물체의 교점, intersection을 구해야 한다.

- scene에 있는 trangle과의 교점을 찾는 과정이 가장 시간이 많이 걸린다.

- 이를 빠르게 하기 위해 acceleration technique을 사용한다.

- 그중 한가지 방법이 bounding volumn hierarchies이다. 

- 물체를 완전히 감싸는 가장 작은 단순한 bounding volumn을 만든다. ex) sphere, box

- 그 bounding volumn들을 감사는 또하나의 bounding volumn을 만든다.

- 이런 구조때문에 hierarchy라고 한다.

- 이렇게 bounding volumn을 만들어서 ray가 애초에 그 바운딩 볼륨과 닿지 않으면 배제하는 방식으로 연산량을 줄인다.

- bounding volumn과 닿는 ray만 더 깊숙히 파고들어서 실제 맺히는 지점을 찾게 된다.

- 이렇게 하면 bounding box와 접점이 없는 ray들은 모두 스킵할 수 있다.

- bounding box와 교점이 있는 ray만 깊게 들어간다. 

- bounding volumn들을 tree로 나타낸다.

- 첫번째 ray를 1번 과 교점이 있는지 확인한다. 교점이 있으면 아래로 내려간다. 만약 교점이 없다면? 그 sub tree를 모두 skip한다.

- 자식노드중 교점이 있는 bounding volumn밑으로 계속 내려간다.

- 이렇게 하면 log의 탐색 시간을 구현할 수 있다.

- 위의 예시에서는 ray가 2와 먼저 만난다. 그 다음 A,B중 B와 만나는걸 확인하고 삼각형의 모든 traingle mesh와 교점이 있는지 찾는다. 없기 때문에 다음 C를 찾아간다. c와 교점이 있기 때문에 사각형의 모든 triangle과 교점이 있는지 확인한다.

spatial partition

- 도 다른 방법은 spatial partition이 있다.

- scene을 partitioning하고 ray가 어떤 partition을 지나가는지 계산하여 그 patition안에 있는 물체들중 intersection을 찾는다. 

 

6. Ray intersection Calculation

Sphere

- ray와 sphere의 intersection을 구하는 건 어렵지 않다.

- 해가 두개라면 가까운(작은) 점을 택하면 된다.

Triangle

- 이번에는 ray와 triangle의 intersection을 구해보자.

- 평면과 직선의 교점을 구하면 된다. 교점이 존재한다면 뚫고 들어가서 물체와의 intersection 위치를 찾게된다.

  

- 평면과의 교점이 있다면 그 점이 삼각형의 edge안쪽에 존재하는지 확인하여 최종으로 교점여부를 확인한다.

Triangle - 다른 방법

- 삼각형과 ray의 교점을 구하는 다른 방법도 알아보자.

- v1, v2가 이루는 평면의 normal vector를 가지고 ray와 dot product해서 각도를 구하는 것이다.

- 90도 보다 크면 삼각형 평면 밖에 있는 것이고 90도보다 작으면 삼각형 평면 내부에 있는 것이다. 

- 이걸 삼각형 모든 변에 대해서 세번 수행하고 모든 변의 안쪽에 있다는 결과가 나온다는 것은 그 bounding volumn과 교점이 있다는 것이다.

Box

- 만약 bounding volumn이 box라면? 그 box의 전면을 향하고 있는 평면과 intersection을 구한다.

- front facing plane을 구하는 방법은 노말벡터로 이루는 각을 구해서 판정할 수 있다.

- front facing plane을 찾으면 삼각형때와 마찬가지로 모든 edge의 안쪽에 ray의 교점이 존재하는지 확인하면 된다.

Convex polygon, concave polygon

- triangle과 같다. 

7. Shadow Rays (Advanced Ray-Tracing)

- ray가 닿은 지점에서 광원으로 가는 길에 물체가 있다면 그곳이 그림자가 져아함을 알 수 있다.

8. Reflection Rays (Advanced Ray-Tracing)

9. Refracted Rays (Advanced Ray-Tracing)

- 투명한 물체를 통과하는 ray를 구한는 법이다.

- 두 물질의 밀도차에 따라 휘는 빛을 계산한다.  

10. Distributed Raytracing

- 픽셀에 하나의 ray를 쏘는게 아니라 여러 ray를 쏜 결과를 평균내어 픽셀의 색을 정하는 방법이다.

- grid처럼 너무 딱딱하게 오와열이 맞으면 aliasing이 생길 수 있으니 jittered grid처럼 쓴다.

- 당연히 연산량이 많아져 오래걸리지만 아래 soft shadow를 잘 구현한다.

- shadow의 부드러운 경계를 나타낼 수 있다.  

- 뿐만 아니라 아래처럼 glossy reflection도 구현할 수 있다. 한 지점에서 한개의 ray가 아니라 여러개의 ray를 쏘는 것이다. (blurring)

- 실제로 반사된 ray는 하나지만 두개의 ray를 더 만드는 것이다. (총3개)

 

- 또 구현 가능한 한가지는 distribute ray를 시간차를 두고 쏘아서 Motion blur를 만들 수 있다.

 

- Depth of Field도 구현할 수 있다.

- 배경흐림 효과라고도 한다.

- 카메라 렌즈를 보면 초점 안쪽, 바깥쪽은 상이 제대로 맺히지 않는데 이를 잘 표현할 수 있다.

- 실제로 렌즈가 있다고 가정하고 여러 ray를 쏜다 아래 예시는 3개를 쏘았다.

- 초점 밖에 있거나 안에 있는 물체는 세 ray 값들의 평균이 된다.

- 초점의 물체는 같은 지점에 ray가 도달하므로 값이 동일하다.

728x90
반응형