QuadTree Static Level Of Detail

2018. 5. 22. 14:24프로그래밍/게임 알고리즘


QuadTree를 이용한 SLOD


Level Of Detail?

거리에 따라 물체의 정밀도를 조절하여 연산 속도를 올리는 방법.


Dynamic Level Of Detail

메쉬를 실시간으로 분할하는 알고리즘을 사용하여 정밀도를 결정.

팝핑현상이 적고 정밀하지만, CPU 의존도가 높으며 비디오 메모리와 연결이 자주 일어난다.


Static Level Of Detail

미리 각 레벨에 맞는 데이터를 비디오 메모리에 올려두고 상황에 맞게 교체하는 방법이다.

팝핑현상이 눈에 띄게 일어난다.


팝핑현상 : 레벨이 교체되면서 나타나는 정밀도 변화현상


테셀레이션은 셰이더 기반으로 실행되는 Level Of Detail. 

모든 작업이 gpu에서 이루어진다.



QuadTree를 이용한 SLOD

 - 게임 프로그래밍을 입문하고 처음 진행한 프로젝트에서, 행성을 렌더링 하기위해 사용했던 방법입니다.

 - 이 당시 생각해보면 게임프로그래밍 막 입문했을 때다 보니 셰이더 사용에 대한 지식이 너무 없었고, 

   거기다 사용중인 하드웨어는 SaderModel SM 3.0 까지 지원하였기에 SLOD를 사용한 것으로 기억합니다.



1. Square 오브젝트 생성

  - Square를 생성합니다. (16개)

  - 이웃 노드의 레벨이 서로 다를 경우 Crack 현상이 일어난다.

  - 이를 해결하는 방법은 이웃한 섹터 위에 방지용 섹터를 씌워버리면 되지만, 드로우 콜이 늘어나며 그만큼 중복되어 그리게 된다.

  - 때문에 처음부터 상황에 맞는 Square를 모두 생성 해두고 필요에 따라 교체하도록 한다.(비디오 메모리 사용량이 늘어난다.)




2. 쿼드트리 생성

  - 공간 분할하는 목적으로 쓰이는 알고리즘 이지만, 여기서는 추가로 거리에 따라 노드의 깊이(레벨)을 정한다.

  - 절두체 내에 들어오는 노드를 탐색한다.

  - 해당 노드와 카메라의 거리를 체크하고, 가까우면 분할 멀어지면 합병한다.


3. 렌더링

  - 완성된 노드 리스트를 참고하여 Square Object를 렌더링한다.



4. 결과