GPU'da arazi oluşturma


9

Motorumda, CPU'da hesaplanan Perlin gürültü alghoritm'i kullanarak sonsuz bir arazi yaratıyorum.

Arazi oluşturulması şu şekilde olur:

  • Kamera yüksüz yama yakınındaysa oluşturun
  • 513x513 gürültü dizisini verilen sınırlarla hesapla
  • Normalleri, teğet, binormal, endeksleri hesaplayın
  • Verileri vbo'ya aktarın

Artıları:

  • Yalnızca gerektiğinde oluşturulmalıdır
  • Kolay çarpışma

aleyhte

  • 3,1 saniyede (bir iplik) yavaş 64 513x513 yama oluşturulur. Her kiremit için ~ 20ms gürültü oluşturma, ~ 25ms köşeleri, normaller, teğet, bitanjant, endeksler. Kamera hızlı hareket ettiğinde, kullanıcı döşemelerin yüklendiğini fark edebilir.
  • bellek tüketen ???

Şimdi tamamen GPU'da arazi oluşturarak bunu nasıl hızlandıracağımı merak ediyordum ama bazı şüpheler var:

  • Gölgelendiriciler her kareyi çalıştırıyorsa, bu hesaplama gürültüyü defalarca hesaplamak için güç tüketmez mi? Sonuç RBGA dokusuna yazılarak önlenebilir ve daha sonra yer değiştirme için köşe gölgelendiricide kullanılabilir, ancak bellek kullanımını arttırır. Öte yandan, eğer yaratılış çok hızlı olacaksa, sadece görünür karolar bellekte kalmalıdır. Ancak arabelleği ayırmak, uygulamayı yavaşlatabilecek gpu-cpu senkronizasyonuna neden olur (haklı mıyım?)
  • Arazi sadece tepe gölgeleyici tarafından değiştirilen düz bir ızgara ise, aynı işin çarpma için belirli bir noktada yüksekliği ve normali hesaplamak için CPU üzerinde yapılması gerekir.
  • Bu sadece bir kavram, ancak her şeyi hızlandırmak için ızgarayı görüntü alanına yansıtmayı düşünüyordum, bu yüzden sadece minimum miktarda köşe kullanıldı. Bunun işe yarayacağını düşünüyor musunuz?

Son sorum:

GPU'da sonsuz arazi oluşturmak için en iyi / en hızlı / yaygın olarak kullanılan teknik nedir?


8
GPU'da arazi oluşturmanın çarpışma tespiti, toplama tespiti veya arazi ile her türlü etkileşimi zorlaştıracağını unutmayın.
MichaelHouse

1
GPU üzerindeki araziyi oluşturmak için bir hesaplama gölgelendiricisi (DX10 veya 11) kullanılabilir. Ancak Byte56'nın belirttiği gibi, etkileşimde bulunmak için değerleri GPU'dan geri çekmeniz gerekecektir. msdn.microsoft.com/tr-tr/library/windows/desktop/…
UnderscoreZero

bir GPU türünde arazi oluşturmak bana kötü bir fikir gibi geliyor. Çalışabilir ama CPU tarafında araziyi oluşturup standart çizim malzemelerini GPU'ya gönderirseniz muhtemelen biraz daha iyi çalışacağını düşünüyorum.
Benjamin Danger Johnson

Sadece benim deneyimim; Aslında bunu aparapi ile yaptım ve aslında çalışacak lanet şeyi aldım; ama aslında cpu'nun işi yapmasından daha yavaş oldu. Ben gpu / veri gönderme yükü nedeniyle düşünüyorum. Doğru hatırlıyorsam, gpu sadece hesaplama büyüklüğüne göre büyükse (ve mutlak olarak da büyükse) işe
yarıyorsa

Yanıtlar:


2

GPU'yu böyle bir şey için kullanmaya çalışsaydım, compute / opencl / cuda'ya gideceğimi düşünüyorum.

Bununla birlikte, GPU veya CPU'yu kullanmaya bakılmaksızın (aslında yaptığım şey budur), mevcut çerçeve için yeni bir araziye ihtiyacınız olduğuna karar vermek için eşzamansız bir şekilde yapacağım (örneğin 1000ms / 60 = 16.666ms, ve tüm çerçeve buna uymak istiyor).

Çalışan iş parçacığında arazi oluşturmaya (veya sıkıştırılmış dosyalardan yüklemeye) başlayın ve işçiyi bitirdikten sonra oyunun geri kalanında kullanılabilir hale getirin ve renderleme yapın, genellikle bu bir sonraki kare veya belki de bundan sonraki kare olacaktır. kullanıcı buradaki farkı gerçekten fark etmeyecek, ancak işleri daha pürüzsüz hale getiriyor.

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.