들어가기에 앞서...
이제 LOD군요. 앞으로 한 파트만 더 설명하면 되겠군요. 거의 끝을 향해서 왔군요!
다음 파트인 균열방지를 끝내면, 당분간은 맵툴제작에 들어갈 생각입니다.
아마도 다시 포스팅이 뜸해질지도 모르곘군요. 하하..
그래도, 어떤 분에게 자극을 받아서 작업현황을 중간중간에 올려볼려고 합니다.
1. LOD (Level of Detail)이란?
간단하게, LOD는 카메라와 메쉬간의 거리에 따라서 메쉬의 정밀도를 정하는 기법을 말한다.
메쉬가 카메라에 가까이있다면, 정밀도를 높인다. 멀리있다면 정밀도를 낮춘다.
(출처 : http://www.ernestszoka.com/tstriplod/tstrip.htm)
이런식으로 말이다.
엄밀하게 말하면, 이것은 렌더링의 질을 떨어뜨리는 행위이다. 메쉬의 정밀도를 강제로 떨어뜨리니까 말이다.
그러나, 이것은 훌륭한 타협이라고 할수 있다.
게임은 실시간 렌더링이 중요하게 여겨진다. 때문에 질을 떨어뜨림으로서 빠르게 렌더링되는 타협을 한 것이다.
그리고 그것과 다르게 또다른 효과가 있다.
멀리있는 것은 흐릿하게, 가까이 있는 것은 선명하게.
2. 정적 LOD와 동적 LOD
정적 LOD는 처음부터 메쉬의 정밀도가 정해져있고, 카메라와의 거리에 따라서 빠르게 바꿔치기 해서 출력하는 방식이다.
정적 LOD의 장점은 연산이 쉬워서 속도가 빠르다는 것에 있다.
반대로 단점은 각 디테일에 대한 매쉬를 준비해야기에 메모리 소비가 크다는 것이다. 또한 메쉬가 급격하게 변하기에 팝핑현상이 발생한다.
동적 LOD는 실시간으로 카메라와 메쉬의 거리에 따라서 메쉬의 정밀도를 변화시킨다.
자연스럽게 LOD가 이루어지기 떄문에 정적 LOD의 단점인 팝핑 현상이 적고, 메모리 낭비도 없다.
단점은 정적 LOD에 비해서 '상대적으로' 연산이 많기에 속도가 느리다.
우리는 동적 LOD를 살펴볼 것이다.
카메라가 우상단에 있다고 가정하면, 노드의 정밀도가 우상단에 가까울수록 높아지는 것을 알수 있다.
3. 구현
LOD의 구현은 생각보다 쉽다.
이전에 쿼드트리를 설명할때, 썼던 함수를 조금만 수정하면 된다.
if( m_corner[TR] - m_corner[TL] <= 1)
이부분을 다음과 같이 고친다.
if( m_corner[TR] - m_corner[TL] <= GetLODLevel(pHeightMap, pCamera, fLODRatio) )
GetLODLevel은 함수 이름과 매개변수에서도 알수 있듯이, 두개의 정점을 빼서 나온 벡터의 길이를 재어서 fLODRatio를 곱한 값이 LOD의 디테일값이 된다.
이것만으로 LOD가 구현된다.
4. 균열발생
그러나, 이런 LOD는 불완전하다.
그것은 LOD의 디테일이 변경되는 경계에서 균열이 일어난다는 큰 문제점이 있기 때문이다.
(출처 : http://garland.egloos.com/12074)
이에대한 해결은 다음 파트인 균열방지에서 설명하겠다.
참고자료 : 해골책
PS. 질문과 태클은 언제나 환영입니다. 댓글에 달아주세요!
쿼드트리 컬링 (0) | 2014.08.04 |
---|---|
Quadtree (0) | 2014.07.25 |
절두체 컬링 (0) | 2014.07.24 |
Terrain - 높이맵과 텍스처링 (0) | 2014.07.23 |
Directx9를 이용한 3D GAME 프로그래밍 입문 – part1 수학적 준비 (벡터) (0) | 2014.02.28 |
댓글,
Lowpoly
게임 서버 프로그래머 지망생