Godot'ta uygulanan FFT tabanlı okyanus dalgası renderlama
(github.com/2Retr0)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
Hacker News görüşleri
Bu kişinin diğer iki Godot deposu da oldukça ilginç
20 yıl önce deniz yüzeyini render etmek için aylar harcasaydım bile bu seviyeye ulaşamazdım
Demo klip biraz abartılı hissettiriyor
Godot'taki render işleminin gerçek zamanlı olduğunu varsayıyorum
Beni bilgisayarlara ilgi duymaya başlatan şeyler bunlardı, ama yolun bir yerinde kütüphanelerden, endpoint'lerden ve şirket işlerinden yoruldum
Dalga/okyanus simülasyonlarıyla ilgileniyorsanız Acerola bu konu hakkında harika videolar yayımladı
Bu problemin ne kadar zor olduğu ilginç
Birkaç yıl sahilde yaşadım
Bu yaklaşımın çok büyük dalgalarda bazı sınırları var
Shadertoy'da da harika bir örnek var
Fourier, dalga frekansı dönüşümünü geliştirirken gelgit dalgalarını ölçüyordu
Çok etkileyici, ancak dalgaların yumuşaklığı konusunda ufak bir sorun var