Akan GPU hesaplama suyu


15

İnşaat mühendisliği birikimim var ve düzenli olarak hidrolik ve hidrolojik analizler yapıyorum. Bu tür şeyler için derece satıyorlar, ama bu gerçekten roket bilimi değil. Son zamanlarda GPU'da bir arazi için tüm hidrolojik ve hidrolik süreci uygulamak aklıma geldi. Son zamanlarda hesaplama gölgelendiricileri öğrendim, bu yüzden şu anda mühendislikte paralel GPU iş akışları tasarlamaktan daha iyi durumda kaldım.

Bir yağış olayı sırasında üretilen su miktarını aşağıdaki formülü kullanarak hesaplayabilirsiniz:
Q (CF/S) = c * I (in/hr) * A (acres)

Ben bile ilk alanın "dönüm" hesaplamak ötesinde hareket zorlanıyorum.

Mevcut uygulamaya genel bakış:

  1. Arazi, 1 birim aralıklarla düzenli bir köşe noktası ızgarasıdır
  2. Bir yükseklik haritası, her köşe için bir R32 yükseklik değeri içerir
  3. Şu anda, sadece 4 kardinal yönde akışa izin veriyorum (köşegenler yok)
  4. Daha önce analiz ettiğim köşeler için şablon olarak bir Texture2D [int] kullanıyorum

Mevcut algoritma:

  1. Arazi aracı aktif olduğunda ve şimdi değilken ...
  2. "Şablonu" temizleyin.
  3. En düşük rakım için tüm araziyi tarayın.
  4. Bu tek nokta CS_Flood'a ilk girdi.
  5. CS_Flood bir X ekseni geçişi yapar.
  6. Her bir giriş tepe noktası, 2048 kereye kadar hem X- hem de X + yönlerinde yansıtılır.
  7. OOB koordinatıyla bitişik bir tepe noktası bulmak, arazinin kenarını bu yönde gösterir. CurrentPoint, BoundaryPoints arabelleğine eklenir ve bu yönde projeksiyon döngüsü sona erdirilir. Bu kolaydı ve her seferinde harika çalışıyor.
  8. Yükseklikleri> olan bitişik köşeler = = geçerli tepe noktasının yüksekliği şablonda işaretlenir ve NextPass arabelleğine eklenir.
  9. Yükseklikleri olan bitişik köşeler <geçerli tepe noktasının yüksekliği bir sırtın zirvesini gösterir ve projeksiyon döngüsünü sonlandırır. Sel dolgu bir gelecek yineleme olabilir bunun "geri" tarafı yukarı sırtın tabanını etrafında akış ve aynı sırtta ikinci kez algılar.
  10. Defadan fazla algılanır Herhangi zirve / mahya noktaları olacak değil bu amaçla, bir BoundaryPoint ol.
  11. Tam olarak bir kez tespit edilen pik / tepe noktaları BoundaryPoints'e eklenir ve bu yönde projeksiyon döngüsü sona erdirilir.
  12. CS_Flood, X ekseni geçişi tarafından üretilen noktaları giriş olarak kullanarak aynı kodla bir Z ekseni geçişi yapar.
  13. Şu anda, CS_Flood iki yön arasında süresiz olarak değişmeye devam ediyor. Sonunda, CS_Flood tamamlandığında ve NextPass arabelleği boş olduğunda genel döngüyü sonlandıracağım.

İdeal olarak, bu noktada, BoundaryPoints doğal drenaj bölünmesinde meydana gelen her bir tepe noktasını içerecektir. Sınır içine inen su damlaları sonunda aynı düşük noktaya akar. Sınırın dışına inen su damlaları "başka bir yere" gider.

Sonra:

  1. Şablonu temizlemeden araziyi en düşük, şablonsuz köşe için yeniden tarayın.
  2. CS_Flood'u yineleyin.
  3. Şablon dolana kadar (veya benzer bir şey) tekrarlayın.

3D'nin bu renklerle algılanması zordur; bu, integral yüksekliklerde kontur çizgilerini gösterir:
(kenara yakın bir berm ile çevrili bir delik) kenar berm deliği

Bir tepe noktasında süzülmenin yaklaşık 10 benzersiz yolu vardır; her birine benzersiz bir renk vermek gibi
görünür : (görünür dairesel takım işaretleri, "sırtlar" güzel görünür) resim açıklamasını buraya girin

Bu, sınır veya başka bir şekilde CS_Flood tarafından oluşturulan her noktayı POINTLIST olarak gösterir: resim açıklamasını buraya girin

Algoritma her zaman neredeyse çalışır . Bazen, düzgün çalışıyor bile. Diğer zamanlarda, algoritma açıkça doğru şekle dahil edilir, ancak noktaları süresiz olarak çıkarmaya devam eder. 3. ekran görüntüsünde görüldüğü gibi, bazen kafası karışır. Göz ardı ettiğim başka bir durum / faktör olmalı. Gözetimimi veya soruna saldırmak için daha basit ve / veya daha zarif yollarla ilgili önerileri bulma konusunda herhangi bir yardımı takdir ediyorum.

eksik nokta

MissingPoint! NextPass arabelleğine algılanan her yeni BoundaryPoint'i eklemek için algoritmaya bant yardımı ile eklenebilir. Bir sonraki geçişte, bu yara bandı tarafından üretilen puanların% 99'u, hiçbir yere gidemediklerini ve hiçbir şey yapamayacaklarını belirleyerek az miktarda GPU harcayacaktır. İlk geçiş sırasında, diğer NextPass noktalarıyla birlikte LowPoint göndermek de bu özel senaryoyu işleyecektir.

Bunun mantıklı olduğunu biliyorum ve yeterli zaman verildiğinde, istediğimi yapacak kadar bando yardımı yapabilirim. Mümkünse daha iyi, daha akıllı, daha hızlı bir şekilde yapmak istiyorum ve daha iyi bilmek için henüz yeterli tecrübem yok.


Yani arazideki tüm suyun nereye aktığını hesaplamak mı istiyorsunuz?
EvilTak

@EvilTak, bence iyi bir algoritmaya yerleştim, ama yine de açıklamak için deneyimim olmayan "tuhaf şeyler" alıyorum. Paralel GPU'larda iyiyseniz, lütfen şuna bakın
Jon

Yanıtlar:


1

Bir damla bir tepe noktasını ziyaret etmeye "çalıştığında", şablon ( zaten üzerine yazmış olsam da) zaten şablon InterlockedExchangeolup olmadığını belirlemek için "orijinal değer" kullanılarak işaretlendi .

Geldiğim en iyi algoritma sele bir "not defteri" ve tek bir kural verdi: "yokuş aşağı akma" (yükseklik eşit veya daha büyük). Bu neredeyse tüm karmaşık testleri ortadan kaldırdı. Tepeler / çıkıntılar üzerinden akmamakta genellikle iyi olmakla birlikte , bitişik köşeler "düz" olduğu için bunlar boyunca akar . Bu bazen damlaların sırt çizgilerini geçmesine izin verir.

resim açıklamasını buraya girin

"Çok uzak" noktaların her biri daha sonra "akar" ve drenaj alanına (1'de durur) ya da değil (0'da durur) akar. "Notlar" atılır ve düzeltilmiş not defteri "final" e kopyalanır. Final zaten şablondaysa, not defteri atılır. (Gelecek: bu çarpışmalar toplu olarak mevcut drenaj alanının dış sınırını temsil etmelidir.)

10FPS'de:

resim açıklamasını buraya girin

Büyük alanlar finale kopyalandıktan ve yeşil hale geldikten sonra "notlar" kırmızı renkle gösterilir, algoritma kalan stenclenmemiş alanlar için tekrarlanır.

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.