Geniş bir arazi ağını nasıl verimli bir şekilde oluştururum?


10

Son zamanlarda, oyunumda bir arazi oluşturmanın en iyi yolunu düşünerek sorun yaşadım. Başka bir projede normalde yükseklik haritaları kullandım, bu nedenle tüm temel çalışma kullanılan motora dayanıyordu, ancak şimdi bu yapılamıyor çünkü arazide doğru bir şekilde çizilmesi gereken milyonlarca belirli çokgen var. Ayrıca, çoğu Y vektöründen ayrıştırılamaz (altında gizlenmiş çokgenler nedeniyle), yani bir yükseklik haritası burada yararlı değildir. Bu durumda bir COLLADA nesnesi kullanmak zorunda kaldım.

Birisi bana modeli Blender gibi bir yazılımın içine manuel olarak bölmemi söyledi, ancak maalesef bu da mümkün değil çünkü bu araziler başka bir yazılımdaki parçalarda oluşturuldu ve oyuna yüklendi (bu fikir). Bu nedenle bu, her seferinde manuel olarak dilimlemekle yükümlü olmak büyük bir iş olacaktır.

Böylece, bir haftadan beri bu sorunu nasıl çözebileceğimi ve bu örgü, arazi, kamera hayal kırıklığına göre prosedürel olarak nasıl yükleyebileceğimi araştırıyorum ve mümkün olduğunca fazla performans tasarrufu sağladım. Prosedürel ağ oluşturma hakkında birçok belgeye rastladım ve ağımın octrees ile eşleştirilmesiyle sorunumun çözülebileceğini düşünüyorum. Bu, en azından benim için BÜYÜK bir iş ve bu yüzden buradayım, çünkü deneyimli insanlardan duymadan önce yanlış yola girme riskini almak istemiyorum.

Kısacası, birlikte araziyi oluşturan milyonlarca köşe noktası ve indeksim var, ancak bariz nedenlerle onları aynı anda çizemiyorum. Bir çeşit prosedüre ihtiyaç var. Bunu yapmanın en büyük yolu, büyük bir ağa bir arazi olarak davranmak mı? Bununla ilgili özel bir kitap var mı? Uygulamanın en iyi yolu var mı?

Her türlü hata için özür dilerim, bu alanda çok acemi oldum.

Yanıtlar:


12

Temel parçalama başlamak için iyi bir yoldur. Gerekirse, daha sonra octrees gibi daha karmaşık veri yapılarına geçebilirsiniz. Şimdilik, modeli diskten yüklerken arazinizi belirli boyutlardaki parçalara bölün.

Verilerinize bağlı olarak, arazinizi tam yüksekliği kapsayan bir düzlemde sütunlara veya uzaydaki küplere bölmek isteyebilirsiniz. Kod tam değil (fmod, vektör başlatma, indeksler, ...) ancak size bir başlangıç ​​vermelidir.

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

Mesh'i şimdi böldüğünüz için, gizli parçaların oluşturulmasını atlamak için LOD ve culling teknikleri uygulayabilirsiniz.

  • Görüntüleme mesafesi başladığınız yerdir. Parçaları yalnızca belirli bir mesafe içinde, örneğin kameranızın görüş mesafesi içinde oluşturursunuz. Görüş mesafesi ne kadar küçük olursa, arazinin daha az parçası çizildiğinden daha fazla performans elde edersiniz.

  • Frustum ayıklama , yalnızca kameranın görüş frustumuyla kesişen ağları oluşturmak için yaygın bir tekniktir. Bu büyük olasılıkla size en büyük performans kazancını verecektir.

En iyi sonuçları almak için yığın boyutu ve görüntüleme mesafesiyle denemeler yapın. Yığın boyutu, doğru hesaplama ve kolay hesaplama arasında bir değiş tokuştur. Daha da optimize etmek için bu daha gelişmiş optimizasyonlara göz atabilirsiniz.

  • Oklüzyon ayıklaması CPU üzerindeki kafesleri çok düşük çözünürlükte oluşturarak yapılabilir. Bu, diğerlerinin arkasına gizlenmiş kafesleri erken tespit etmenizi sağlar. GPU'ya gönderilmeleri gerekmez, bu nedenle üçgenleri reddetmeden önce gerçekleştirilecek çok sayıda köşe gölgelendirici yürütmesi kaydedersiniz.

  • Ayrıntı düzeyi, parçalarınızın daha düşük çözünürlüklü ağlarını hesapladığınız anlamına gelir. Kameraya olan mesafeye bağlı olarak, çizilecek kafeslerden birini seçersiniz. Bu, uzaktaki parçalar çok fazla ayrıntıya ihtiyaç duymadığından köşe sayısını azaltmanıza izin verir. Bu yaklaşım oktrees ile iyi oynar çünkü kameradan uzak bölgeler için birden fazla küpü düşük çözünürlüklü bir ağda birleştirebilirsiniz. Bununla birlikte, kenarları farklı bir çözünürlükteki iki parça arasında sorunsuz bir şekilde birleştirmek önemsizdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.