대형 터 레인 메쉬를 효율적으로 렌더링하는 방법은 무엇입니까?


10

최근에 게임에 지형을 생성하는 가장 좋은 방법에 대해 생각하는 문제에 봉착했습니다. 다른 프로젝트에서는 일반적으로 하이트 맵을 사용 했으므로 모든 핵심 작업은 사용 된 엔진을 기반으로했지만 지형에 정확하게 그려야하는 수백만 개의 특정 다각형이 있기 때문에이 작업을 수행 할 수 없습니다. 또한 그 중 많은 부분이 Y 벡터에서 분석 될 수 없습니다 (아래에 다각형이 숨겨져 있기 때문에). 즉, 하이트 맵은 여기서 유용하지 않습니다. 이 경우 COLLADA 객체를 사용해야했습니다.

누군가 나에게 블렌더와 같은 소프트웨어 내에서 모델을 수동으로 나눠달라고 말했지만 불행히도 이러한 지형은 다른 소프트웨어의 덩어리로 만들어져 게임에로드되기 때문에 불가능합니다 (아이디어). 따라서 이것은 매번 수동으로 슬라이스해야하는 큰 작업입니다.

따라서 일주일 후이 문제를 어떻게 해결하고 카메라 프러스 텀에 따라이 메시, 지형을 절차 적으로로드하여 가능한 한 많은 성능을 절약 할 수 있는지에 대해 연구했습니다. 절차 적 메쉬 생성에 대한 많은 문서를 접했으며 메쉬를 octree에 매핑하여 문제를 해결할 수 있다고 생각합니다. 이것은 적어도 나에게 큰 일이며, 그래서 나는 여기에 있습니다. 왜냐하면 경험 많은 사람들의 의견을 듣지 않고 잘못된 길을 가고 싶지 않기 때문입니다.

요컨대, 지형을 구성하는 수백만 개의 정점과 색인이 있지만 분명한 이유로 동시에 그릴 수는 없습니다. 일종의 절차가 필요합니다. 큰 메쉬를 지형으로 취급하는 가장 좋은 방법은 무엇입니까? 그것에 관한 특정 책이 있습니까? 그것을 구현하는 가장 좋은 방법이 있습니까?

어떤 종류의 실수로 유감스럽게도, 나는이 분야에서 초보자입니다.

답변:


12

기본 청크를 시작하는 것이 좋습니다. 필요한 경우 나중에 octree와 같은보다 정교한 데이터 구조로 이동할 수 있습니다. 지금은 디스크에서 모델을로드 할 때 지형을 지정된 크기의 덩어리로 나누기 만하면됩니다.

데이터에 따라 지형을 전체 높이에 걸쳐있는 평면의 기둥으로 또는 공간의 큐브로 기둥으로 분할 할 수 있습니다. 코드는 완전하지 않지만 (fmod, 벡터 초기화, 인덱스 등) 시작해야합니다.

// Load vertices from disk
struct point { double x, y, z; };    
vector<point> vertices;

// Create container for chunks
typedef pair<int, int> key;
unordered_map<key, vector<point>> chunks;
const int chunksize = 10;

// For each vertex
for (int i = 0; i < vertices.size(); ++i) {
    // Fetch global coordinates
    int x = vertices[i].x,
        y = vertices[i].y,
        z = vertices[i].z;

    // Find containing chunk
    key k;
    k.first  = x / chunksize;
    k.second = z / chunksize;

    // Calculate local coordinates
    point p;
    p.x = x % chunksize;
    p.y = y;
    p.z = z % chunksize;

    // Add to chunk
    chunks[k].push_back(p);
}

// Create separate buffers for each chunk
// ...

이제 메시를 분할 했으므로 LOD 및 컬링 기술을 수행하여 숨겨진 청크의 렌더링을 건너 뛸 수 있습니다.

  • 시야 거리는 시작하는 곳입니다. 주어진 거리 (예 : 카메라의 가시 거리) 내에서만 청크를 렌더링합니다. 시야 거리가 작을수록 더 적은 수의 지형 덩어리를 그려야하므로 성능이 향상됩니다.

  • 프러스 텀 컬링 은 카메라의 뷰 프러스 텀과 교차하는 메시 만 렌더링하는 일반적인 기술입니다. 이것은 아마도 가장 큰 성능 향상을 줄 것입니다.

청크 크기와 시야 거리를 실험하여 최상의 결과를 얻으십시오. 청크 크기는 정확한 컬링과 쉬운 계산 간의 절충점입니다. 더 최적화하기 위해 이러한 고급 최적화를 살펴볼 수 있습니다.

  • CPU에서 메쉬를 매우 낮은 해상도로 렌더링하여 폐색 제거 를 수행 할 수 있습니다. 이를 통해 다른 메시 뒤에 숨겨진 메시를 조기에 감지 할 수 있습니다. GPU로 보낼 필요가 없으므로 삼각형을 거부하기 전에 수행했을 많은 버텍스 쉐이더 실행을 저장합니다.

  • 세부 수준은 청크의 저해상도 메쉬를 계산 함을 의미합니다. 카메라까지의 거리를 기준으로 그릴 메시 중 하나를 선택합니다. 멀리 떨어져있는 청크에는 많은 디테일이 필요하지 않기 때문에 정점 수를 줄일 수 있습니다. 이 접근 방식은 카메라에서 멀리 떨어진 영역에 대해 여러 큐브를 하나의 저해상도 메쉬로 병합 할 수 있기 때문에 octree와 잘 작동합니다. 그러나 다른 해상도의 두 청크 사이의 가장자리를 매끄럽게 병합하는 것은 쉽지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.