Rendering Ombak Laut Berbasis FFT yang Diimplementasikan di Godot
(github.com/2Retr0)GodotOceanWaves
Eksperimen rendering laut terbuka menggunakan Godot Engine, yang menghasilkan ombak dengan memanfaatkan transformasi Fourier invers dari spektrum ombak laut terarah. Menyediakan parameter sederhana yang memungkinkan properti ombak diubah secara real-time melalui skrip untuk meniru berbagai kondisi ombak laut.
Pengantar
Mengapa transformasi Fourier?
- Metode umum untuk menganimasikan air dalam video game adalah menggunakan Gerstner waves. Namun, metode ini cocok untuk memodelkan detail frekuensi rendah pada air yang tenang, tetapi kurang memadai untuk merepresentasikan permukaan kasar laut terbuka secara akurat.
- Untuk mengatasi hal ini, ombak disimulasikan dengan menggunakan transformasi Fourier invers dari spektrum ombak laut yang didasarkan pada data empiris yang dikumpulkan oleh para oseanografer.
- Keuntungan bekerja di ruang frekuensi adalah properti laut dapat dimodifikasi dengan mudah. Saat menggunakan Gerstner waves, tidak jelas bagaimana ombak dan parameternya harus diubah untuk meniru kondisi laut tertentu.
- Untuk menghitung transformasi Fourier, digunakan algoritme Fast Fourier Transform (FFT). Ini memiliki kompleksitas komputasi yang lebih rendah dibandingkan algoritme transformasi Fourier diskret klasik, dan cocok dijalankan di GPU.
Hasil
Shading ombak
Model pencahayaan
- Model pencahayaan laut terutama mengikuti BSDF yang dijelaskan dalam presentasi GDC 'Atlas'. Namun, distribusi GGX digunakan sebagai ganti distribusi Beckmann untuk distribusi microfacet.
- Peta normal/foam disampling dengan mencampurkan filtering bicubic dan bilinear berdasarkan kepadatan piksel ruang dunia.
Buih laut
- Tessendorf mengusulkan metode untuk menghasilkan buih ketika puncak ombak menggulung ke dalam dirinya sendiri.
- Buih terakumulasi secara linear dan menghilang secara eksponensial, serta dikendalikan dengan parameter "kecepatan pertumbuhan buih" dan "kecepatan peluruhan buih".
Semprotan laut
- Semprotan laut dimodelkan sebagai partikel menggunakan node GPUParticles3D di Godot.
- Partikel didistribusikan secara merata di dalam bounding box node GPUParticles3D.
- Setiap partikel semprotan laut menggunakan sprite billboard dengan satu tekstur statis.
Simulasi ombak
- Metode untuk menghasilkan ombak permukaan mengikuti Tessendorf.
- Fungsi spektrum ombak laut terarah mengembalikan energi ombak berdasarkan frekuensi dan arah.
Spektrum ombak laut
- Texel-Marsen-Arsloe (TMA) dipilih sebagai fungsi spektrum nondirectional.
- Campuran penyebaran flat dan penyebaran Hasselmann digunakan sebagai fungsi directional spreading.
Fast Fourier Transform
- Implementasi FFT khusus untuk GPU ditulis sendiri.
- Algoritme FFT Stockham digunakan untuk menghindari permutasi bit-reversal awal.
Cascade ombak
- Pada jarak yang jauh, artefak tiling menjadi sangat jelas.
- Sistem pembangkitan ombak dapat melapiskan beberapa cascade ombak secara bersamaan.
Distribusi beban
- Gerakan ombak dapat tetap terlihat halus meskipun displacement tidak diperbarui setiap frame.
- Parameter "kecepatan pembaruan" diperkenalkan untuk mengontrol seberapa sering cascade ombak diperbarui per detik.
Referensi
- 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).
Atribusi
- Evening Road 01 (Pure Sky) by Jarod Guest digunakan di bawah lisensi CC0 1.0.
- OTFFT DIT Stockham Algorithm by Takuya Okahisa digunakan dan dimodifikasi di bawah lisensi MIT.
Ringkasan GN⁺
- GodotOceanWaves adalah eksperimen rendering laut terbuka menggunakan Godot Engine yang menghasilkan ombak dengan memanfaatkan transformasi Fourier invers dari spektrum ombak laut terarah.
- Dengan menggunakan Fast Fourier Transform (FFT), proyek ini dapat dijalankan secara efisien di GPU dan dapat meniru berbagai kondisi ombak laut.
- Proyek ini mencakup berbagai elemen seperti shading ombak, buih laut, semprotan laut, dan simulasi ombak untuk mensimulasikan permukaan laut yang realistis.
- Proyek ini dapat berguna untuk menerapkan rendering laut yang realistis dalam video game dan simulasi.
1 komentar
Komentar Hacker News
Dua repositori Godot lain dari orang ini juga sangat menarik
Dua puluh tahun lalu, bahkan jika menghabiskan berbulan-bulan untuk merender permukaan laut, hasilnya tidak akan mencapai level ini
Klip demo terasa sedikit berlebihan
Saya berasumsi rendering di Godot dilakukan secara real-time
Hal-hal seperti inilah yang dulu membuat saya tertarik pada komputer, tetapi di tengah jalan saya lelah dengan library, endpoint, dan pekerjaan kantor
Jika tertarik pada simulasi gelombang/lautan, Acerola pernah mengunggah video yang keren tentang topik ini
Menarik betapa sulitnya masalah ini
Saya tinggal di dekat pantai selama beberapa tahun
Pendekatan ini punya sedikit keterbatasan untuk gelombang yang sangat besar
Ada juga contoh keren di Shadertoy
Fourier mengembangkan transformasi frekuensi gelombang saat mengukur gelombang pasang surut
Sangat mengesankan, tetapi ada sedikit masalah pada kelembutan gelombangnya