본문 바로가기

Programming/Graphics

025. LOD 레밸 오브 디테일

LOD 종류에는 크게 2가지가 있는데 정적LOD 와 동적 LOD 이다

정적은 처음부터 매쉬의 정밀도가 정해져있고 이를 카메라와의 거리에 따라서 바꿔치기 해가면서 출력을 하는 방법이다 미리 메쉬의 정밀도가 있어야 하기 때문에 메모리의 낭비가 심하나 단순히 정해져 있는 정밀도만 바꾸어서 출력 하기 때문에 속도가 빠르다 그러나 메시의 단계가 급격하게 변하기 때문에 튐현상이 발생을 한다
이런한 형상을 해결하는것이 동적 LOD 이다

동적 LOD는 카메라와 물체의 거리에 따라서 실시간으로 메시의 정밀도를 변화 시키는 방법 으로 메시의 분활 계산을 하기 때문에 추가적인 연산이 필요로 한다 그러키때문에 상대적으로 속도가 느리나 그래도 하드웨어의 사양이 좋아져서 많이 쓴다고 한다

맵툴을 담당 하여 동적 LOD를 하였고 LOD를 쿼드 트리에 적용하에 쿼드트리의 노드 래벨로 카메라와의 거리에 따라 표현 하는 방법을 사용 하였 쉽게 구현을 하였다 하지만 균열의 문제가 있어서 디테일이 다른 메쉬끼리 연결된 모든 부분을 상하좌우로 삼각형을 추가하여 해결을 하는 방법을 썻다

단순하게  출력할 삼각형의 인덱스를 만들면서 상하좌우 노드의 LOD값을 검색한 뒤, 현재 노드의 LOD값과 다른노드가 있는 경우 그 방향으로 땜질삼각형을 분할 생성해주면 된다.


랜더할때.. DrawIndexedPrimitive()함수 에서  옵션 플레그를  D3DPT_TRIANGLESTRIP 으로

그리는것이 D3DPT_TRIANGLELIST 보다 빠르다.

 

 CPU    <===========>   RAM

 캐시

 

LIST로 하면 정점 3개씩 삼각형 하나로 해서 그리지만

STRIP으로 하면 앞의 정점 2개에 정점 하나만 더 추가되어 삼각형이 형성된다.

암튼 그래서.. 캐시에.. 그렇게.. 해가꼬.. 더 빠르다.. 쩝.. ㅡㅡa..

 

이렇게 하면 문제가 생기는데 지형을 한줄그리고 다음 줄을 그릴때 문제가 되는데..

먼저그린 두 정점과 연결이 되기때문인데.. 인덱스버퍼에 인덱스를 넣을때..

맨끝과, 다음줄의 맨처음에 정점들을 하나씩 더 넣어준다.

맨끝에는 맨끝의인덱스정점을 하나 더 추가하고

다음줄의 맨처음에는 원래 맨 처음의인덱스 정점을 하나더 추가한다. 똑같이..

그러면 삼각형이 그려져야하는데 똑같은 정점 2개로 그려지므로 삼각형이 형성이안된다.

그래서 한줄이 그려지고 다음줄을 그리는데 연결이 되지 않게 그린다...