행성 렌더링에 가장 적합한 LOD 방법은 무엇입니까?


23

저는 현재 논문을 연구하고 있으며 행성 크기의 지형을 렌더링하는 엔진입니다.

나는 여전히 연구를 끝내고 있는데이 주제에 관해 많은 것들을 만났다. 문제는 사용해야 할 LOD (Level of Detail) 방법을 결정할 수 없다는 것이다.

나는 geomipmapping, 지오메트리 클립 맵 (GPU)에 대해 알고 큰 지형과의 작업 좋은으로 큐브 "spherify"다음 큐브의 6 개면을 렌더링하는 데 사용 될 수있는 울리히으로 LOD를 청크 이 방법을 나는 모두를 구현하는 방법을 이해 C ++ / OpenGL / GLSL을 사용하는 GPU에서 이러한 방법 (ROAM과 같은 방법 또는 큐브를 사용하지 않는 다른 방법을 사용하면 텍스처링으로 인해 도달 할 수 없습니다). 또한 최근 테셀레이션 쉐이더를 사용하여 렌더링 지형의 튜토리얼에있어 여기

따라서 모든 방법을 구현할 시간이 없으며 어떤 방법이 행성 규모에 가장 적합하고 적합한 지 확인하고 누군가가 이런 종류의 비교를 수행했는지 확인하고 어떤 방법을 결정하도록 도와줍니다. 구현하고 사용해야합니다 (내 교사는 일종의 미쳤고 정이 십면 체로 무언가를하고 싶지만 ROAM을 사용하지 않으면 그 방법을 이해할 수 없습니다)

어쨌든, 당신이 내가 결정하거나 다른 제안이나 방법을 갖도록 도울 수 있다면 정말 감사하겠습니다. 한 가지 조건은이 방법이 CPU 병목 현상을 방지하기 위해 GPU 측 (적어도 대부분)을 구현할 수 있어야한다는 것입니다.

또 다른 요청은 지형에서 많은 세부 사항을 얻을 때 수레에 정밀도에 관한 수치 적 문제가 있다는 것을 알고, 해결 방법을 모르고, 포럼에서 솔루션을 읽지 만 어떻게 해야하는지 이해할 수 없다는 것입니다 구현, 그 스레드를 잃어 버렸고이 정밀 문제를 해결하는 방법을 알고 싶습니다.

현재 부동 소수점 정밀도, z- 파이팅 문제, 동적 z- 값으로 절두체 및 청크에 대한 데이터 표현 (플로트가있는 패치 공간 및 월드 좌표에서의 위치를 ​​두 배로 사용)을 해결하기 위해 일부 행렬 변환에 대해 읽고 있습니다. 정밀도 문제를 쉽게 해결할 수 있다고 생각합니다. 여전히 LOD 방법과 귀하의 의견 및 제안을 비교 하여이 프로젝트에 더 적합한 것을 결정해야합니다. 구현 대 시각적 품질 대 성능의 어려움을 고려하여 최고를 원합니다.

내가 언급 한 것을 잊어 버린 것은 세대가 하이브리드라는 것입니다. 즉, 전적으로 GPU (높이를 계산하여 계산 된 높이)를 사용하거나 기본 높이 맵 이미지를 사용하여 행성을 렌더링하고 GPU (vertex)로 세부 정보를 추가 할 수 있어야합니다 쉐이더). 텍스쳐링은 나중에 문제가 될 부분입니다. 지금은 높이에 따라 색상을 사용하거나 조각 셰이더에서 생성되는 노이즈 텍스처를 사용하는 것이 행복합니다.


6
보편적으로 "최상의"방법은 없습니다. 프로젝트의 모든 요구 사항 만 알고 있으며 여러 LOD 옵션에 대해 알고있는 것 같습니다. 마지막으로,이 결정은 논문의 일부이므로 스스로 결정해야합니다. 논문은 공부하고있는 주제에 대한 지식을 보여줍니다. 어느 것이 귀하의 요구에 가장 적합한 지 모른다면 옵션을 조금 더 연구해야 할 것입니다.
MichaelHouse

@ Byte56 당신이 옳고, LOD 방법에 대해 많이 연구하고 있었고, 그중 일부를 구현하고 성능과 시각적 품질에 대해 이야기 한 다른 사람들의 제안을보고 싶었습니다. 귀하의 의견 :) 그리고 그런데, 현재 테셀레이션 셰이더에 대해 이해하고 훌륭한 튜토리얼 (주요 질문에 대한 링크)을 찾았습니다. 그러면 갈 것이라고 생각합니다. 지형 렌더링에 대해서만 설명하지만 수정할 수는 있습니다 6면을 만들고 큐브를 구체화합니다.
nosmirck

vterrain.org/LOD 에는 지형 렌더링 주제에 대한 많은 정보가 있습니다. 링크 된 섹션에는 세부 수준 알고리즘에 대한 논문 및 기타 소스가 나와 있습니다. vterrain.org/LOD/spherical.html 은 구형 그리드 (예 : 행성)를 처리합니다.
Exilyth

@ sarahm 알고 있습니다. 시작한 곳이 있습니다. 모두 빨간색입니다. 어떤 구현을 선택하려면 일부 LOD 메소드를 비교해야합니다. 실제로 모두 할 수 있지만 시간이 없습니다 ... 어쨌든 , 테셀레이션 셰이더를 사용하는 방법을 사용합니다. 새로운 기능이며 구형 표면에서는 구현이 없습니다. :)
nosmirck

3
이미 많은 연구를 해왔지만 이것이 데스크톱을 통과했는지 확실하지 않지만 "Virtual Globes를위한 3D 엔진 디자인 : Patrick Cozzi 및 Kevin Ring"을 살펴보십시오. 거기에 좋은 실용적인 정보. 그것은 잘 연구되었고, 말했듯이 매우 실용적인 관점에서 취해졌습니다. 어떤 식 으로든 HTH.
Schoenobates 19

답변:


17

마지막으로, 많은 연구를 한 결과, 이전에 언급 한 바와 같이 보편적으로 "최상의"방법이 없다고 결론 지을 수 있습니다. 그러나 나의 연구로 다음과 같은 것들을 알게되었습니다.

메쉬에 따라 마침내 사용할 것입니다 :

  • 구형 큐브 : quadtree를 구현하는 모든 LOD 방법은 정상적으로 작동합니다.면 사이의 경계와 같은 특수한 경우에만주의해야합니다. 즉, quadtree는 각 레벨의 인접면에있는 이웃에 대한 포인터를 가져야합니다.
  • 다른 것 : ROAM (새로운 버전 2.0 또는 BDAM, CABTT 또는 RUSTIC과 같은 다른 확장)이 잘 될 것이라고 생각하지만,이 알고리즘은 작동하기 어렵고 더 많은 메모리가 필요하며 큐브에 대한 다른 공격보다 약간 느립니다.

잘 맞을 수있는 LOD 방법이 많이 있지만 제 개인적 상위 5 개는 다음과 같습니다.

  1. 지속적인 거리 의존적 LOD (CDLOD)
  2. GPUGCM (GPU 기반 Geomety 클립 맵)
  3. 청크 LOD
  4. OpenGL GPU 테셀레이션을 사용한 지형 렌더링 (도서 : OpenGL Insight, 10 장)
  5. 기하학적 밉 맵핑

각각은 고유 한 지형 렌더링 방법을 제공합니다. 예를 들어 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- 버퍼 정밀도 해결에 대한 자세한 설명은 이 책을 확인 하십시오 .

이 작은 리뷰가 도움이 되길 바랍니다.


1
나는 당신의 연구 여정에 대해 더 알고 싶습니다. 어쨌든 당신의 업데이트를 따를 수 있습니까? 블로그 또는 무엇인가?
Syaiful Nizam Yahya

@publicENEMY 지금, 나는 여전히 엔진을 개발하고 있습니다. 1 년 동안 일을해서 멈추었고, 한두 달 안에 연구를 다시 시작하고 엔진을 완성 할 것입니다. 내가 거기에 도착하면, 여행에 대한 모든 업데이트를 게시 할 때 여기에 알려 드리겠습니다. 관심을 가져 주셔서 감사합니다.
nosmirck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.