본문 바로가기
Dev/Computer Graphics

[Nori] Assignment 2: Octree 만들기

by Jino Park 2019. 2. 15.
반응형

--- 2021/6/25 수정 : 코드 관련 부분 삭제

2번째 Assignment는 Octree를 만들고, 그걸 이용해 렌더링 시간을 많이 단축시켜보는 것이다. Octree는 이름에서 알 수 있듯이 최대 8개의 노드를 갖는 트리를 말한다.

 

출처 : 위키피디아

 

왼쪽의 육면체처럼, 한 공간을 8개의 구역으로 나눌 수 있다. Ray tracing을 할 때는 하나의 ray가 물체의 어느 표면에 부딪힐지를 찾아야 하는데, 이 충돌 지점을 전체 공간이 아니라 나누어진 구역에서만 찾아 렌더링 시간을 많이 줄일 수 있다.

 

 

구현

 

Octree의 노드는 아래 멤버들을 갖는다.

 

- BoundingBox

- face의 번호를 저장하는 vector<int>

- child 포인터 8개를 저장하는 vector<Node*>

- depth

 

Ray tracing을 시작하기 전에 Octree를 빌드하고, Octree::search()를 통해 ray가 통과하는 face 중 가장 작은 t 값을 갖는 face의 번호를 찾는다.

 

구현시에는 nori/bbox.h 의 기능을 사용해 쉽게 구현할 수 있었다. 몇 가지 헤맸던 점도 있다.

 

자식의 BoundingBox3f 를 생성할 때, 생성자에서 min/max가 정말 최소/최대인지 확인하지 않았다. 그래서 아래와 같이 생성해야만 했다.

 

 

결과

 

MAX_DEPTH가 커질수록 렌더링 시간이 줄어드는 것을 확인할 수 있다. 이는 ray를 추적할 때 탐색하는 face의 수가 적어지기 때문이다.

 

MAX_DEPTH 렌더링 시간(초) 
30.9 
10.9 
7.1 
6.8 

 

 

TODO

 

이 Assignment는 원래 여기서 끝나지 않는다. child를 정렬해야함.

 

링크

나중에 수정이 될 수도 있으니 최신 코드도 참고하기

커밋

Assignment 2

 

 

덧 : Assignment 4를 시작하기 전에 accel.cpp와 accel.h를 새로 덮어씌우는 과정이 있는데, 내꺼랑 비교해서 진짜 빠르다..

 

(2018-10-05에 작성됨)

반응형