2013-03-25 2 views
1

내가 VBO의와 인덱스 등지형 GeoMipMapping LOD - 제거 균열

우선은 높이 맵에서 지형을로드와 현대의 OpenGL을 사용하고, 그럼 난에 모든 정점을로드 (내 경우가 128x128) 블록으로 분할 VBO (각 지형 블럭에 대해) 그리고 나서 4 개의 LOD 레벨 - 인덱스 테이블 -이 꽤 정적입니다.

하는 난 그냥 여기에 카메라

if(distance > 768.0) 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod4); 
    else if(distance > 512.0) 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod3); 
    else if(distance > 128.0) 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod2); 
    else 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod1); 

에서의 거리에 따라 블록을 선택하고 렌더링 동안 나는 문제가 발생했습니다. 모든 것이 잘 작동하지만 다른로드 레벨 블록 간에는 정말 못생긴 균열이 있습니다. googling하는 동안 같은 PDF를 발견 : http://www.flipcode.com/archives/article_geomipmaps.pdf 그리고 나는 아이디어를 이해하지만, VBO (위)를 사용하여 구현하는 방법을 모르겠습니다. 나는 약간의 아이디어를 듣게되어 기쁩니다.

+0

아마도 가장 간단한 해결책은 다음 블록 남쪽에서 정점의 북쪽 행 (다른 방향으로 적절하게)을 복사하고 NS/EW 축에 정렬되도록하는 것입니다. 어떤 데이터도 잃지 않고, 인접한 덩어리에 경계선을 복사하여 정렬해야합니다. – ssube

+0

또 다른 간단한 해결책은 이음새가있는 곳에 두 개의 LOD를 렌더링하는 것입니다. –

답변

0

색인 버퍼는 렌더링하는 블록과 독립적입니다. 동일한 인덱스 버퍼는 다른 블록에 대해 재사용 될 수 있습니다 (그리기 호출에서 셀 [i]에 대한 의존성이 왜 생기지 않기 때문에 이것을 강조했습니다).

다음 한 블록에 대해 네 개의 주변 블록의 세부 수준 (LOD)을 고려해야합니다. 네 개의 이웃 블록 모두가이 블록과 동일한 LOD를 가지고 있다면, 이미 수행중인 것보다 더 할 일이 없습니다. 이 블록이 LOD가 낮은 블록에 연결되어 있으면 기사에서 참조 된 트릭을 적용하여 간격을 숨길 수 있습니다. 즉, 이러한 특정 경우에 대해 추가 사전 계산 된 인덱스 버퍼가 필요합니다. 매번 전체 인덱스 버퍼가 2^4 = 16 개의 인덱스 버퍼가되거나 테두리를 별도로 처리하기 위해 드로 콜을 분할 할 수 있습니다. 또한 기사의 트릭은 인접한 블록 사이의 한 수준 최대 간격에 대해서만 적용됩니다. 두 개의 인접한 블록이 LOD에서 1의 갭만을 갖는 방식으로 세부 사항의 레벨이 공간적으로 분산되어 있는지 확인해야합니다. 아니면 다른 트릭을 발견하거나이 것을 일반화하십시오. 마스킹 스커트 (블록 경계를 수직으로 돌출)를 사용하여 서로 다른 LOD가있는 블록 사이의 넓은 간격을 숨길 수 있습니다.