GPU'da paylaşılan köşe normalleri oluşturma


9

Çoğunlukla Marching Cubes'ın CPU'dan OpenGL hesaplama shader'larına uygulanmasını başardım, ancak henüz normallerle mücadele etmedim ve bunun için en iyi yolu merak etmedim.

Benim uygulama özellikle ikili değer alanları ile ilgilenir (henüz bir mesafe tahmini olmayan 3D fraktal fonksiyonları modellemeye çalışıyorum), bu yüzden degrade ve ileri farklılıklar yöntemleri işe yaramaz. Çalışma köşelerini paylaştım ve CPU uygulamam, her komşu tepe noktasında yüz normalleri biriktirmek için burada açıklanan Quilez yöntemini kullanıyor .

Bu uygulamayı başka bir gölgelendiriciye taşıyabilirim, ancak bununla ilgili gördüğüm sorun, gereken çok sayıda atom. Atomikleri yalnızca skaler tamsayı tiplerinde kullanabileceğimiz ve 3 imzalı girişi 1'e toplanabilir şekilde paketlemenin bir yolunu düşünemediğim için, bu, 3 eksen * 3 köşe = gölgelendirici çağrısı başına 9 atomik ekleme anlamına gelir. Elbette bellek boyunca yayılacaklar, bu yüzden 9 kez tek bir atom sayacına vurmak gibi değil, ama yine de çok fazla cehennem gibi görünüyor.

Diğer alternatif, çokgen başına bir gölgelendirici çağırma çalıştırmak ve yüz normal listesini oluşturmak (muhtemelen x10y10z10'a bu şekilde paketlenebilir), daha sonra komşu yüzlerin tüm normallerini biriktirmek için köşe başına bir gölgelendirici kullanmaktır. Bu çok büyük bir hafıza domuzu olurdu, yüz endekslerinin depolama alanının en kötü durumla başa çıkmak için köşe başına 12 int'ye ihtiyacı olacaktır. Ayrıca, belirli bir tepe noktasına kaç yüzün zaten yazıldığını çözmek için tekrar atomiklere başvurmadan bu depoya nasıl yazılacağı sorunu da var.

Bunun nasıl yapılacağı hakkında daha iyi fikirleri olan var mı?

Yanıtlar:


5

Yalnızca nVidia çözümü için kayan noktalı atomik ekleme intrinsikleri kullanabilirsiniz (NvInterlockedAddFp32 gibi) HLSL'de GPU Intrinsics'in kilidini açma | NVIDIA Geliştiricisi

Bunu 80.000 köşe ağı üzerinde denedim ve oldukça hızlı (doğru hatırlıyorsam GTX980M'de 1 veya 2 ms gibi bir şey)

Sadece intrinseklerin çalışması için gölgelendiricilerinizi derlemeye dikkat edin (nvidia hatası / sınırlaması nedeniyle)

Ayrıca tepe bölümlerine dikkat edin (örneğin UV süreksizlikleri nedeniyle), bunları kullanmanız veya UV dikişlerinde istenmeyen sert kenarlara sahip olmanız gerekir.


Soru eski olduğu için bunun yerine size soracağım :-) Anladığım kadarıyla her köşe için bitişiklik bilgisine sahip olmak rus için yeterince iyi değildi?
Andreas

Bu, geçen yılki tez projem içindi, sadece aptal yolla devam ettim ve kesinliği en üst düzeye çıkarmak için ölçeklendirilmiş tamsayı atomik eklentileri kullandım, sonra vektörleri normal hale getirdim. En kötü durumda yer ayırmadan ve listeleri oluşturmak için atom sayaçlarını kullanmadan, her bir tepe noktasındaki yüzleri listelemenin bir yolu bulunamadı. Muhtemelen cehennem kadar verimsiz ama yine de CPU sürümünden ve birinci sınıf bir markadan birkaç büyüklük hızı siparişim var, bu yüzden yeterince mutlu oldum :)
russ
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.