Làm thế nào để có hiệu quả làm cho một lưới địa hình lớn?


10

Gần đây tôi đã bị mắc kẹt trong một vấn đề khi nghĩ về cách tốt nhất để tạo địa hình vào trò chơi của mình. Trong các dự án khác, tôi thường sử dụng các bản đồ chiều cao, vì vậy tất cả các công việc cốt lõi đều dựa trên động cơ được sử dụng, nhưng bây giờ điều này không thể thực hiện được vì địa hình có hàng triệu đa giác cụ thể phải được vẽ chính xác. Ngoài ra, nhiều trong số chúng không thể được phân tích cú pháp từ vectơ Y (do đa giác ẩn bên dưới), nghĩa là, một sơ đồ chiều cao không hữu ích ở đây. Trong trường hợp này, tôi đã phải sử dụng một đối tượng COLLADA.

Có người bảo tôi tự chia mô hình bên trong một phần mềm như Blender, nhưng thật không may, điều này cũng không thể xảy ra vì những địa hình này được tạo thành từng khối trong một phần mềm khác và được tải vào trò chơi (đó là ý tưởng). Do đó, đây sẽ là một công việc lớn bắt buộc phải tự cắt chúng mọi lúc.

Do đó, kể từ một tuần tôi đã nghiên cứu về cách tôi có thể giải quyết vấn đề này và tải thủ tục lưới này, địa hình, theo đó để làm phiền máy ảnh, tiết kiệm càng nhiều hiệu suất càng tốt. Tôi đã đi qua nhiều tài liệu về việc tạo lưới thủ tục và tôi nghĩ rằng vấn đề của tôi có thể được giải quyết bằng cách ánh xạ lưới thành các quãng tám. Đây là công việc LỚN, ít nhất là đối với tôi, và đó là lý do tôi ở đây, vì tôi không muốn mạo hiểm đi sai đường mà không nghe thấy từ những người có kinh nghiệm.

Nói tóm lại, tôi có hàng triệu đỉnh và chỉ số cùng nhau tạo thành địa hình, nhưng vì những lý do rõ ràng, tôi không thể vẽ chúng cùng một lúc. Nó cần một số loại thủ tục. Cách tốt nhất để làm điều đó là gì, coi một tấm lưới lớn như một địa hình? Có cuốn sách cụ thể nào về điều đó không? Có cách nào tốt nhất để thực hiện nó?

Xin lỗi vì bất kỳ sai lầm nào, tôi rất mới làm quen với lĩnh vực này.

Câu trả lời:


12

Chunking cơ bản là một cách tốt để bắt đầu. Bạn có thể di chuyển đến các cấu trúc dữ liệu phức tạp hơn như octrees sau, nếu bạn cần. Hiện tại, chỉ cần chia địa hình của bạn thành các khối có kích thước nhất định khi tải mô hình từ đĩa.

Tùy thuộc vào dữ liệu của bạn, bạn có thể muốn chia địa hình của mình thành các cột trên một mặt phẳng trải dài toàn bộ chiều cao hoặc theo hình khối trong không gian. Mã không hoàn thành (fmod, khởi tạo vectơ, chỉ mục, ...) nhưng sẽ cho bạn một sự khởi đầu.

// 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
// ...

Vì bạn đã tách lưới ngay bây giờ, bạn có thể thực hiện LOD và loại bỏ các kỹ thuật trên nó để bỏ qua kết xuất các khối ẩn.

  • Xem khoảng cách là nơi bạn bắt đầu. Bạn sẽ chỉ hiển thị các khối trong một khoảng cách nhất định, ví dụ như khoảng cách xem của máy ảnh của bạn. Khoảng cách xem càng nhỏ, hiệu suất bạn nhận được càng nhiều do phải thu được ít khối địa hình hơn.

  • Loại bỏ Frustum là một kỹ thuật phổ biến để chỉ hiển thị các mắt lưới giao nhau với sự thất vọng của máy ảnh. Điều này rất có thể sẽ cung cấp cho bạn mức tăng hiệu suất lớn nhất.

Thử nghiệm với kích thước khối và khoảng cách xem để có kết quả tốt nhất. Kích thước khối là một sự đánh đổi giữa việc loại bỏ chính xác so với tính toán dễ dàng. Để tối ưu hóa hơn nữa, bạn có thể xem những tối ưu hóa nâng cao hơn này.

  • Loại bỏ loại trừ có thể được thực hiện bằng cách hiển thị các mắt lưới trên CPU ở độ phân giải rất thấp. Điều này cho phép bạn sớm phát hiện các mắt lưới ẩn đằng sau những cái khác. Chúng không phải được gửi đến GPU, vì vậy bạn lưu rất nhiều lần thực hiện shader đỉnh mà nếu không thì sẽ được thực hiện trước khi từ chối các hình tam giác.

  • Mức độ chi tiết có nghĩa là bạn tính toán các mắt lưới có độ phân giải thấp hơn. Dựa trên khoảng cách đến máy ảnh, bạn chọn một trong các mắt lưới để vẽ. Điều này cho phép bạn giảm số lượng đỉnh do các khối ở xa không cần quá nhiều chi tiết. Cách tiếp cận này chơi tốt với các quãng tám vì bạn có thể hợp nhất nhiều hình khối thành một lưới có độ phân giải thấp cho các khu vực cách xa máy ảnh. Tuy nhiên, việc kết hợp liền mạch các cạnh giữa hai khối có độ phân giải khác nhau là không đơn giản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.