1 puan yazan GN⁺ 2024-09-29 | 1 yorum | WhatsApp'ta paylaş

GodotOceanWaves

Godot Engine kullanılarak yapılan bir açık deniz renderlama deneyi; yönlü okyanus dalgası spektrumunun ters Fourier dönüşümüyle dalgalar üretiyor. Betikler aracılığıyla dalga özelliklerini gerçek zamanlı değiştirmeye yarayan basit parametreler sunarak çeşitli okyanus dalga ortamlarını taklit edebiliyor.

Giriş

Neden Fourier dönüşümü?
  • Video oyunlarında suyu canlandırmanın yaygın bir yolu Gerstner waves kullanmaktır. Ancak bu yöntem sakin suyun düşük frekanslı ayrıntılarını modellemek için uygun olsa da, açık denizin kaba yüzeyini doğru biçimde ifade etmekte yetersiz kalır.
  • Bunu çözmek için, okyanus bilimcilerin topladığı ampirik verilere dayanan okyanus dalgası spektrumunun ters Fourier dönüşümü kullanılarak dalgalar simüle edilir.
  • Frekans uzayında çalışmanın avantajı, okyanus özelliklerinin kolayca değiştirilebilmesidir. Gerstner waves kullanıldığında, belirli bir deniz durumunu taklit etmek için dalgaların ve parametrelerinin nasıl değiştirilmesi gerektiği net değildir.
  • Fourier dönüşümünü hesaplamak için hızlı Fourier dönüşümü algoritması (FFT) kullanılır. Bu, klasik ayrık Fourier dönüşümü algoritmasına göre daha düşük hesaplama karmaşıklığına sahiptir ve GPU üzerinde çalıştırmaya uygundur.

Sonuçlar

Dalga gölgelendirmesi
Aydınlatma modeli
  • Okyanus aydınlatma modeli büyük ölçüde 'Atlas' GDC sunumunda açıklanan BSDF'yi izler. Ancak mikro yüzey dağılımı için Beckmann dağılımı yerine GGX dağılımı kullanılır.
  • Normal/köpük haritaları, dünya uzayı piksel yoğunluğuna göre bicubic ve bilinear filtrelemenin karıştırılmasıyla örneklenir.
Deniz köpüğü
  • Tessendorf, dalga tepeleri kendi üzerine kıvrıldığında köpük üretmenin bir yolunu önerir.
  • Köpük doğrusal olarak birikir ve üstel olarak yok olur; bu davranış "köpük büyüme hızı" ve "köpük sönme hızı" parametreleriyle kontrol edilir.
Deniz serpintisi
  • Deniz serpintisi, Godot'nun GPUParticles3D düğümü kullanılarak parçacıklarla modellenir.
  • Parçacıklar, GPUParticles3D düğümünün sınır kutusu içinde eşit biçimde dağıtılır.
  • Her deniz serpintisi parçacığı, tek bir statik dokuya sahip billboard sprite kullanır.
Dalga simülasyonu
  • Yüzey dalgaları üretme yöntemi Tessendorf'u takip eder.
  • Yönlü okyanus dalgası spektrumu fonksiyonu, frekans ve yöne göre dalganın enerjisini döndürür.
Okyanus dalgası spektrumu
  • Yönsüz spektrum fonksiyonu olarak Texel-Marsen-Arsloe (TMA) spektrumu seçilir.
  • Yönlü yayılım fonksiyonu olarak flat ve Hasselmann yayılımının karışımı kullanılır.
Hızlı Fourier dönüşümü
  • GPU için özel bir FFT uygulaması yazılır.
  • Başlangıçtaki bit-reversal permütasyonundan kaçınmak için Stockham FFT algoritması kullanılır.
Dalga kademeleri
  • Uzak mesafelerde tiling artefaktları çok belirgin hale gelir.
  • Dalga üretim sistemi aynı anda birden fazla dalga kademesini katmanlayabilir.
Yük dengeleme
  • Dalgaların hareketi, her karede yer değiştirme güncellenmese bile akıcı görünebilir.
  • Saniye başına dalga kademelerinin ne sıklıkla güncelleneceğini kontrol etmek için "güncelleme hızı" parametresi eklenir.

Referanslar

  • Flügge, Fynn-Jorin. Realtime GPGPU FFT Ocean Water Simulation. Hamburg University of Technology. (2017).
  • Gunnell, Garrett. I Tried Simulating The Entire Ocean. (2023).
  • Horvath, Christopher J. Empirical Directional Wave Spectra for Computer Graphics. DigiPro. (2015).
  • Tessendorf, Jerry. Simulating Ocean Water. SIGGRAPH. (2004).
  • Matusiak, Robert. Implementing Fast Fourier Transform Algorithms of Real-Valued Sequences. Texas Instruments. (2001).
  • Mihelich, Mark. Wakes, Explosions and Lighting: Interactive Water Simulation in 'Atlas'. GDC. (2019).
  • Pensionerov, Ivan. FFT-Ocean. GitHub. (2020).

Telif bildirimi

  • Evening Road 01 (Pure Sky) by Jarod Guest, CC0 1.0 lisansı altında kullanılmaktadır.
  • OTFFT DIT Stockham Algorithm by Takuya Okahisa, MIT lisansı altında kullanılmış ve değiştirilmiştir.

GN⁺ Özeti

  • GodotOceanWaves, Godot Engine ile yapılmış bir açık deniz renderlama deneyi olup, yönlü okyanus dalgası spektrumunun ters Fourier dönüşümüyle dalgalar üretir.
  • Hızlı Fourier dönüşümü (FFT) kullanarak GPU üzerinde verimli şekilde çalışabilir ve çeşitli okyanus dalga ortamlarını taklit edebilir.
  • Dalga gölgelendirmesi, deniz köpüğü, deniz serpintisi ve dalga simülasyonu gibi çeşitli unsurları içererek gerçekçi bir okyanus yüzeyi simüle eder.
  • Bu proje, video oyunları ve simülasyonlarda gerçekçi okyanus renderlaması uygulamak için yararlı olabilir.

1 yorum

 
GN⁺ 2024-09-29
Hacker News görüşleri
  • Bu kişinin diğer iki Godot deposu da oldukça ilginç

    • Depo açıklamalarına ayrıntı ekleme biçimini beğeniyorum
    • Özellikle şu depo ilginç: GodotGaussianSplatting
    • Muhtemelen bir öğrenci; başka araştırmalara sık sık atıf yapıyor ve yakın zamanda yayımlanan materyalleri iyi anlıyor
  • 20 yıl önce deniz yüzeyini render etmek için aylar harcasaydım bile bu seviyeye ulaşamazdım

    • Bu tekniğin ne kadar iyi olduğuna şaşırıyorum
  • Demo klip biraz abartılı hissettiriyor

    • 50.000 deniz milinden fazla seyir deneyimim var
    • Bu kadar keskin ve yüksek dalgalar daha güçlü rüzgar gerektirir
    • Bu muhtemelen parametre ayarıyla çözülebilir
  • Godot'taki render işleminin gerçek zamanlı olduğunu varsayıyorum

    • Güçlü bir GPU gerekip gerekmediğini merak ediyorum
  • Beni bilgisayarlara ilgi duymaya başlatan şeyler bunlardı, ama yolun bir yerinde kütüphanelerden, endpoint'lerden ve şirket işlerinden yoruldum

    • Bir gün buna tekrar dönmek istiyorum
  • Dalga/okyanus simülasyonlarıyla ilgileniyorsanız Acerola bu konu hakkında harika videolar yayımladı

  • Bu problemin ne kadar zor olduğu ilginç

    • On yıllardır deneniyor ama hâlâ kusursuz değil
    • Kareyi durdurduğunuzda dalgalar karla kaplı dağlar gibi görünüyor
    • Suyun bu kadar keskin özelliklere sahip olması için rüzgarın çok güçlü olması gerekir
    • Simülasyon, dalgaların yumuşak karakterini iyi yansıtmış
  • Birkaç yıl sahilde yaşadım

    • Sahilde yaşayınca denize uzun uzun bakıyorsunuz
    • Bu render gerçek deniz gibi görünüyor
  • Bu yaklaşımın çok büyük dalgalarda bazı sınırları var

    • Su dalgaları sinüs dalgaları değildir ama küçük dalgalarda bu yöntem iyi çalışır
    • Büyük dalgalar doğrusal olmayan şekilde etkileşime girdiği için farklı bir yaklaşım gerekir
  • Shadertoy'da da harika bir örnek var

  • Fourier, dalga frekansı dönüşümünü geliştirirken gelgit dalgalarını ölçüyordu

    • Neredeyse kusursuz bir döngü
    • Oldukça etkileyici
  • Çok etkileyici, ancak dalgaların yumuşaklığı konusunda ufak bir sorun var

    • Yüksek frekanslı dalgaların düşük frekanslı dalgaların üzerinde ilerleme biçimi videodakinden farklı