24 köşeden daha az bir küp inşa etmek mümkün mü


14

Minecraft gibi küp tabanlı bir dünyam var ve bellek kullanımını azaltabilmek için 24 köşeden daha az bir küp oluşturmanın bir yolu olup olmadığını merak ediyorum.

Benim için 2 nedenden dolayı mümkün görünmüyor: normaller doğru çıkmaz ve yüz dokuları işe yaramaz.

Durum bu mu yoksa yanılıyor muyum? Belki yardımcı olabilecek bazı yeni DX11 teknolojisi var mı?

Düzenleme: Sadece açıklığa kavuşturmak için, ben 2 gereksinimleri var: Düzgün aydınlatma yapmak için her küp yüz için yüzey normallere ihtiyacım var ve her küp yüz için bir doku dizisinde farklı bir dizin adreslemek için bir yol gerekir


1
Grafik kartı bellek kullanımını veya RAM kullanımını azaltmak istiyor musunuz ?
doppelgreener

1
Köşe verileri şu anda RAM'de ve GPU'da saklanıyor, böylece azaltmak her ikisini de azaltacaktır.
Telanor

Yanıtlar:


9

Sadece yüz başına normallere ihtiyacınız varsa ve bir yüz için texcoord'larınız kesinlikle 0/0, 0/1, 1/0, 1/1 ise (veya düzeninize uygunsa) 8 vert ile bir küp oluşturabilirsiniz ve 30 (yeniden başlatmalı şerit) veya 36 (liste) indeks. Tepe gölgelendiricinizde SV_VertexID değerine dayalı sabit bir dizi araması kullanarak normalleri ve texcoordları getirin.

Bunu yapmak, köşe arabelleğinize texcoord veya normaller eklemenize bile gerek olmadığı anlamına gelir, bu da size daha fazla bellek tasarrufu sağlar.

Daha da ileri giderek, küp başına 24 verte kadar gidebilir, ancak örnekleme kullanabilirsiniz. Her küp, köşe arabelleğinizde (1x1x1) sabit bir boyut olur ve örnek verileri olarak bir ölçeklendirme faktörüne ve konumunuza (küplerinizin dönmediği, varsa bir matris) sahip olacaksınız. Dönmeyen durumda 24 kerelik bir kerelik maliyetiniz var, ancak her küpün tam olarak belirtilmesi için sadece 6 float gerekir. Dönen durumda 16 şamandıra bakıyorsunuz, ancak bu bile önemli bir tasarruf (bu durumda matris dönüşümlerinde CPU tarafının tıkanması daha olasıdır - dönmeyen kasada anında bir matris oluşturan köşe gölgelendiriciniz - köşe başına yapılsa bile, aptalca hızlıdır, endişelenmenize bile gerek yoktur).

Yüz dokuları için bir doku dizisi kullanın. Elbette dizideki bu tür her bir dokunun aynı boyutta olduğundan emin olmanız gerekir ve dizinin kendisinin değişmesi gerekiyorsa mevcut toplu işinizi kırmanız gerekir, ancak aksi takdirde işi iyi yapar. Köşe tanımınıza, her bir yüz için kullanılacak dizi dilimini tanımlayan üçüncü bir texcoord ekleyin.

Bununla bir GS'ye ihtiyacınız yoktur ve geometri gölgelendirici aşamasının etkin olması kendi ek yükünü uygulayacağından birinden daha hızlı çalışmalıdır.

Motorumda, bu yöntemi kullanarak sadece bir grup küp çizen test kodunu aldım ve 60 fps'yi temizlerken, nispeten düşük uçlu bir GPU'da ve işlemi optimize etmek için başka bir şey yapmadan 300.000'den fazla küpü kolayca çiğneyebilirim . Kuşkusuz, ne aydınlatma ne de tekstüre yapıyorum, ancak alfa harmanlamayı etkinleştirdim, arka yüzey kaldırma devre dışı bıraktım ve genel olarak "optimize etmek için başka bir şey yapmıyorum" kısmımla dengeleniyor, bu yüzden size tür hakkında makul bir fikir vermeli basketbol topu bu yöntemle vurabilirsiniz.


1
Daha önce örnekleme kullanıyordum ve 40k küplerin altında harika çalışıyor. Ama en az 256 bin küpüm var ve örnekleme de onu idare etmiyordu. Bir arama ile SV_VertexID kullanmak çok umut verici geliyor.
Telanor

Örnek başına arabelleğiniz ne kadar büyüktü? Hepsini büyük bir arabellek içine doldurmaya çalışmak sonunda GPU'nuzu boğabilir; Genellikle örnek başına arabellekleri 64k nesneler için yeterli alan (gerekirse çizim çağrılarını bölme) olarak saklıyorum, sil / üzerine yaz kalıbını kullanıyorum ve çok iyi çalışan bir ara diziden kopyalamak yerine doğrudan eşlenen işaretçiye yazıyorum .
Maximus Minimus

Ayrıca - harita sayısını düşük tutmak esastır. Bir küpü eşleme / yazma / eşleme 40k kez eşleme, bir kerede 40k küp / eşleme kaldırma işleminden çok daha yavaş olacaktır. Eğer ilkini yapıyorsanız ikincisine geçmeyi deneyin.
Maximus Minimus

15

Sanırım yapabileceğiniz ana optimizasyon, her küpün aslında 24 köşeye ihtiyaç duymayacağı gerçeğine dayanıyor . Aslında, 24 köşeye ihtiyaç duyan tek küpler, muhtemelen nadir görülen bir olay olan havada havada yüzen küplerdir.

Genel olarak, sadece hava ile temas eden yüzler için dörtlü üretin . Bu, iki küp birbirine dokunuyorsa, dokundukları yüz için herhangi bir köşe oluşturmanıza gerek olmadığı anlamına gelir.

Aşağıdaki görüntü bu kavramı göstermektedir, ancak daha kolay anlaşılması için 2B olarak. Resimde normalde temsil etmek için 4 x 11 = 44 kenar gerektiren 11 dolu blok vardır (dolu gri dairelerle temsil edilir) (4 küp olduğu için kare olduğu için). Ancak gördüğünüz gibi, kenarları sadece boş bir kare ile temas halindeyken çizmeniz yeterlidir, bu durumda sadece 8 kenardır.

resim açıklamasını buraya girin

2D'de böyle basit bir örnek 44 kenarı 8 kenara indirmeyi başardıysa, büyük bir 3D dünyasındaki kazanımları hayal edin ...

Bu makalede açıklanan yaklaşım budur , OpenGL'yi hedeflemenize rağmen okumanızı tavsiye ettiğim . Ancak kavramlar oldukça evrensel olmalıdır.

Ayrıca , GPU üzerinde anında köşe noktaları oluşturmak için bir geometri gölgelendirici de kullanabilirsiniz , böylece bunları bellekte saklama ihtiyacını ortadan kaldırırsınız, ancak bununla ilgili bir deneyimim yok, ne de büyük bir performans için ne kadar iyi performans göstereceğini bilmiyorum dünya.


1
Çok ilginç bir yazı. Zaten kenar optimizasyonunu yapıyorum, bu kesinlikle çok yardımcı oluyor. Geometri gölgelendiricilerini bir deneyeceğim ve bunun işe yarayıp yaramadığını göreceğim.
Telanor

Yani, normalleri hesaplamak için geometri gölgelendiricisini ve çapraz ürünü kullanın? Bunu, düz yüzeyler için ayrı bir program oluşturmak gibi kullanmayı düşünüyordum (dokularla ilgilenmiyorum).
dreta

@dreta Sadece bu değil, aynı zamanda sadece küp sentroidlerini bir nokta listesi olarak gönderdiğiniz noktaya gitmek ve tüm köşeler GS tarafından yayılır. Belki de bazı komşu bilgileri noktalara kodlayın, böylece gölgelendirici sadece gerçekten gerekli olan yüzleri üretir, ancak nasıl yapıldığını düşünmüyorum.
David Gouveia

İstediğiniz performanssa, bir geometri gölgelendirici kullanmayın ... Neredeyse hiç. Boru hattını tamamen vidalarlar. GPU'da geometri oluşturmak istiyorsanız, bir hesaplama gölgelendiricisi veya openCL kullanın
Robert Fraser
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.