마지막으로, 많은 연구를 한 결과, 이전에 언급 한 바와 같이 보편적으로 "최상의"방법이 없다고 결론 지을 수 있습니다. 그러나 나의 연구로 다음과 같은 것들을 알게되었습니다.
메쉬에 따라 마침내 사용할 것입니다 :
- 구형 큐브 : quadtree를 구현하는 모든 LOD 방법은 정상적으로 작동합니다.면 사이의 경계와 같은 특수한 경우에만주의해야합니다. 즉, quadtree는 각 레벨의 인접면에있는 이웃에 대한 포인터를 가져야합니다.
- 다른 것 : ROAM (새로운 버전 2.0 또는 BDAM, CABTT 또는 RUSTIC과 같은 다른 확장)이 잘 될 것이라고 생각하지만,이 알고리즘은 작동하기 어렵고 더 많은 메모리가 필요하며 큐브에 대한 다른 공격보다 약간 느립니다.
잘 맞을 수있는 LOD 방법이 많이 있지만 제 개인적 상위 5 개는 다음과 같습니다.
- 지속적인 거리 의존적 LOD (CDLOD)
- GPUGCM (GPU 기반 Geomety 클립 맵)
- 청크 LOD
- OpenGL GPU 테셀레이션을 사용한 지형 렌더링 (도서 : OpenGL Insight, 10 장)
- 기하학적 밉 맵핑
각각은 고유 한 지형 렌더링 방법을 제공합니다. 예를 들어 CDLOD는 쉐이더 (GLSL 또는 HLSL)를 사용하여 매우 쉽게 구현할 수 있지만 CPU (레거시 하드웨어의 경우)에서도 구현할 수 있지만 Planet Rendering의 목표는 최신 GPU에서 최고이므로 GPU를 짜고 싶을 때 GPUGCM이 최고입니다. 둘 다 큰 지형의 데이터 기반, 절차 적 또는 혼합 (고정 데이터 또는 하이트 맵을 기반으로하는 지형 및 절차 적 작업으로 추가 된 세부 사항) 렌더링에서 매우 잘 작동합니다.
또한 기본 기하학적 클립 맵 방법에 대한 구형 확장이 존재하지만 하이트 맵의 평면 샘플이 구형 좌표를 사용하여 매개 변수화되어야하기 때문에 몇 가지 문제점이 있습니다.
반면에 청크 LOD는 레거시 하드웨어에 적합하고 GPU 측 계산이 필요하지 않으며 큰 데이터 세트에는 적합하지만 절차 데이터는 실시간으로 처리 할 수 없습니다 (일부 수정이있을 수 있음)
테셀레이션 셰이더를 사용하는 것은 OpenGL 4.x가 나온 이후로 가장 새로운 기술 중 하나입니다. 내 의견으로는 가장 좋을 수도 있지만 Planet Rendering에 대해 이야기하고 있습니다. 정밀도에 대해.
정점 사이의 정밀도 만 1Km이 아니라면 테셀레이션 셰이더를 사용하십시오. 이 방법으로 실제로 큰 지형의 문제점은 지터가 해결하기가 어렵다는 것입니다.
Geomipmapping은 훌륭한 기술이며, quadtree를 이용하고, 픽셀 오류가 적습니다. 그러나 행성 렌더링의 경우 최소 16 개 이상의 세부 수준을 설정해야합니다. 즉, 스티칭을 위해 약간의 추가 패치가 필요합니다. 서로 다른 레벨을 연결하고 이웃의 레벨을 관리하려면 특히 6 개의 지형을 사용하여 해결하는 것이 지루할 수 있습니다.
시각화에 탁월한 "지구형 지형을위한 투영 그리드 매핑"이라는 또 다른 방법이 있습니다. 자세한 내용을 알고 싶다면 링크로 이동하십시오.
문제 :
지터 : 오늘날의 대부분의 GPU는 32 비트 부동 소수점 값만 지원하므로 행성 규모 지형에서 큰 위치를 조작하기에 충분한 정밀도를 제공하지는 않습니다. 지터는 뷰어가 확대되고 회전하거나 이동할 때 발생하며 다각형은 앞뒤로 튀기 시작합니다.
이를위한 최선의 해결책은 "GPU를 사용하여 눈에 대한 렌더링"방법을 사용하는 것입니다. 이 방법은 기본적으로 CPU에서 두 배로 모든 위치를 설정해야하는 "가상 지구본을위한 3D 엔진 디자인"(인터넷에서도 찾을 수있을 것입니다) 책에 설명되어 있습니다 (패치, 클립 맵, 객체, frustrum, camera 등) 다음 MV는 변환을 (0, 0, 0) T로 설정하여 뷰어를 중심으로하고 double은 두 개의 float의 소수 (mantissa) 비트를 사용하여 고정 소수점 표현으로 인코딩됩니다. 그리고 몇 가지 방법으로 높았습니다 (Olarik의 구현 및 DSFUN90 Fortran 라이브러리 사용에 대해 읽으십시오).
꼭짓점 셰이더에는 추가 2 개의 빼기와 한 번의 추가 만 필요하지만 GPU RTE는 위치에 필요한 꼭짓점 버퍼 메모리의 양을 두 배로 늘립니다. 위치 만 저장하지 않으면 메모리 요구 사항을 두 배로 늘릴 필요는 없습니다.
깊이 버퍼 정밀도 : Z-fighting. 매우 큰 지형을 렌더링 할 때이 경우 : 행성, Z- 버퍼는 거대해야하지만 znear 및 zfar에 설정 한 값은 중요하지 않으므로 항상 문제가 있습니다.
Z- 버퍼는 부동 소수점 간격에 의존하기 때문에 정밀한 32 비트 부동 소수점이 없기 때문에 눈 근처의 선형 (원근 투영은 비선형 임에도 불구하고) 값이 Z- 파이팅을 겪습니다.
이 문제를 해결하는 가장 좋은 방법은 "로그 깊이 버퍼"를 사용하는 것입니다.
http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
대수 깊이 버퍼는 zscreen에 대수 분포를 사용하여 원격 객체의 깊이 버퍼 정밀도를 향상시킵니다. 가까운 물체의 정밀도를 위해 가까운 물체의 정밀도를 교환합니다. LOD 메소드로 렌더링하기 때문에 원거리 오브젝트는 삼각형이 적기 때문에 정확도가 떨어집니다.
언급해야 할 중요한 것은 Quadtree베이스로 인해 물리학 (주로 충돌)을 수행 할 때 열거 된 모든 방법 (투영 그리드 제외)이 매우 우수하다는 것입니다. 이는 게임을 만들 계획이라면 필수적입니다.
결론적으로 CDLOD는 훌륭한 작업을 수행한다고 생각합니다. 지터 및 Z- 버퍼 문제를 해결하는 것을 잊지 마십시오. 가장 중요한 것은 재미있게 만드는 것입니다!
LOD에 대한 자세한 내용은 이 링크를 확인 하십시오 .
큐브 구체화에 대한 완전한 설명을 보려면 이 링크를 확인 하십시오 .
지 터링 및 Z- 버퍼 정밀도 해결에 대한 자세한 설명은 이 책을 확인 하십시오 .
이 작은 리뷰가 도움이 되길 바랍니다.