Fiziği geometri gölgelendiricisinden yordamsal olarak oluşturulmuş bir dünyaya nasıl dahil edebilirim?


10

Esasen CPU'dan GPU'ya tutarlı gürültü üretme ihtiyacını ortadan kaldırmak istiyorum. Oradan da, bu gürültüyü voksel noktalarındaki yoğunluk olarak kullanarak üç boyutlu bir dünya için arazi oluşturmak istiyorum. Bundan sonra, bu yoğunlukları almak ve onları dünya arazisini temsil eden poligonize etmek (köşe oluşturmak) istiyorum.

Bu iyi ve hepsi. Ama aynı zamanda dünyayı gerçek zamanlı olarak dinamik olarak deforme etmek istiyorum. Bu noktaya geldiğimde, çarpışma tespiti ve GPU'ya değil, CPU'ya dahil etmek istediğim tüm oyun hesaplamaları gibi şeyleri yapmak için köşeleri CPU'ya geri döndürmeye çalışırken bir sorunum var.

Öyleyse soru şu: Diğer şeylerin yanı sıra çarpışmalarla başa çıkmak için köşelerin bir alt kümesini CPU'ya nasıl geri getirebilirim?

Ve bir soru daha: GPU'da bir dizi köşe almanın ve bunlardan indeksler oluşturmanın kolay bir yolu var mı?

Bu farklı şeyler için ne tür gölgelendiriciler kullanmam gerektiği konusunda kafam karıştı. Yoğunlukları toplamak için bir piksel gölgelendirici kullanan ve daha sonra köşe noktalarından arazi üretimi ile başa çıkmak için bir geometri gölgelendirici kullanan ve daha sonra bir şekilde dinamik deformasyonları yapmak için bir tepe gölgelendirici kullanan insanlar duyuyorum.

C # 4.0, .NET 4.0 ve XNA Game Studio 4.0 kullanıyorum.


1
Başlıkta bir geometri gölgelendiricisi kullandığınızı söylüyorsunuz, ancak XNA 4.0'ın DirectX 10 gerektirdiğini bildiğim kadarıyla XNA4.0 kullandığınızı da söylüyorsunuz (daha düzgün bir platform için geliştirmeyi kolaylaştırmak için) ancak sadece SM3.0 özelliklerini destekler, bu nedenle geometri gölgelendiricisi yoktur. forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.

Ve şimdi XNA kullanmayacak veya tasarımımı yeniden yapmayacağım. Bunu işaret ettiğiniz için teşekkürler. Buna bakıyordum ve bu sınırlamayı fark etmedim (SM 4 yok). Bence soru hala XNA'nın dikkate alınmadan kalıyor.Yani, sadece DirectX açısından, istediğimi yapmanın bir yolu var mı? Ya da belki XNA'da bir tepe gölgeleyici ile?

1
Deformasyon ve üretimin çok yavaş olduğu kanıtlanmış bir test vakanız yoksa, XNA'nın kullanımı hala geçerlidir. Ve başka bir test durumunda GPU'nun + neslini deforme ettiğini ve daha sonra verileri CPU'ya geri döndürdüğünün daha hızlı olduğunu kanıtladınız :)
Roy T.

Aslında. XNA kullanmanın ve her şeyi CPU üzerinde tutmanın, Core i7'de 8 çekirdek ve 8 iş parçacığının her bir iş parçacığının birden çok bölümünü paralelleştirdiği yaklaşık 1 milyon köşe noktası verdiğini bulduk. Bunu gerçek zamanlı olarak yapmaya çalışırken ve umarım araziyi oyuncu görmeden önce oluştururken, saniyede yaklaşık 20 kare elde ettik. Bu nedenle, her bir yöntemle kesinlikle bir test vakası vardır.
Michael J. Gray

Yanıtlar:


3

XNA geometri gölgelendiricileri desteklemediğinden, DX 10 kullanıyormuşsunuz gibi cevaplayacağım. Temelde üç seçeneğiniz var.

Geometri gölgelendiricileri Geometri gölgelendiricileri, bir köşe arabelleğini gerçekten değiştirebilir ve köşe noktaları ekleyebilir. Bunu CPU'ya geri okuyabilirsiniz. Ben bakmadım, ama kesinlikle mümkün.

Sadece CPU'yu kullanın İkincisi, neden sadece CPU'da hesaplamıyorsunuz? Gölgelendiricilerde GPU üzerinde çalıştığı gerçeği, deformasyon algoritmanızın yerelleştirilebilir olduğunu gösterir, yani çarpışma kontrolünüz için sadece ilgili parçaları kolayca oluşturabilirsiniz.

Mesela bir süre önce bir yelkencilik oyunu yaptım. Okyanus, suyu dalgalarla deforme etmek için tepe ve geometri gölgelendiricileri kullandı. İşlemcide hesaplanan aynı algoritmayı teknenin dalgalardaki hareketi için teknenin altındaki birkaç noktada kullandım. Eminim voksel haritanız için benzer bir şey yapabilirsiniz.

Piksel gölgelendiriciler Son seçenek, sorunuzda da bahsettiğiniz: piksel gölgelendiricideki yoğunlukları oluşturun ve bir 3B dokuya yazın. Buna CPU'dan ve gölgelendiricilere oldukça zararsız olarak erişebilirsiniz. Piksel gölgelendirici bu görev için mükemmeldir, ancak bu yöntemin çok fazla yükü vardır. Hacim dokusunun işlenmesi ve tepe ve coğrafi örnekleme. CPU üzerindeki dokuyu okumak zorunda.

Projenizin özelliklerini bilmiyorum, ama bunun için daima CPU'yu kullanırdım. Elbette, gölgelendiricilerdeki yoğunlukları da hesaplayın, ancak render için grafik kartını kullanmaya devam edin.


Asıl sorun GPU-CPU bariyeriydi. GPU'da araziyi oluşturup oluşturduktan sonra, çarpışma ve diğer şeyleri yapmak için arazinin şeylerin CPU tarafında nasıl göründüğünü nasıl anlarız? CPU üzerinde tutmaya yönelik düşüncelerinizin geçerli olduğunu düşünüyorum. Yani, algoritmamızı muhtemelen biraz optimize edebilir ve daha az arazi üretebiliriz. Başka bir yanıtın olup olmadığını görmek için yanıtınızı bir veya iki gün içinde çözüm olarak işaretleyeceğim. Alternatif düşünceleri kışkırttığınız için teşekkürler.
Michael J. Gray

Yelken örneğinizle, dalgalardan sıçrayan bir teknenin dalga formu sonucunu GPU'ya kolayca bağlayamazsınız değil mi?
deceleratedcaviar

1
Aynı oluşturma sistemini koruyabilir, yani GPU üzerinde arazi oluşturabilir ve oluşturabilirsiniz, ancak arazide CPU'da ihtiyacınız olan parçaları yansıtabilirsiniz. Aynı algoritmayı ve aynı parametreleri kullanarak, ekranda gördüğünüzle aynı araziyi elde edersiniz.
Hannesh

@Daniel Doğrudan dalga algoritması ile değil, ancak her bir teknenin arkasında "sürüklediği" bir yer değiştirme dokusu ile su ağını teknenin uyanışına göre deforme etmek mümkündür.
Hannesh

Ah! Bu harika bir fikir :). Ama muhtemelen birden fazla deniz taşıtını çok iyi desteklemiyor.
deceleratedcaviar
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.