1 poin oleh GN⁺ 2024-09-29 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-09-29
Komentar Hacker News
  • Dua repositori Godot lain dari orang ini juga sangat menarik

    • Saya suka cara dia menambahkan detail pada deskripsi repositori
    • Yang ini khususnya menarik: GodotGaussianSplatting
    • Mungkin dia seorang mahasiswa, sering mengutip penelitian lain dan punya pemahaman yang baik tentang materi yang baru dipublikasikan
  • Dua puluh tahun lalu, bahkan jika menghabiskan berbulan-bulan untuk merender permukaan laut, hasilnya tidak akan mencapai level ini

    • Menakjubkan betapa hebatnya teknik ini
  • Klip demo terasa sedikit berlebihan

    • Saya punya pengalaman berlayar lebih dari 50.000 Nm
    • Gelombang setinggi dan setajam itu membutuhkan angin yang lebih kencang
    • Ini kemungkinan bisa diatasi dengan penyesuaian parameter
  • Saya berasumsi rendering di Godot dilakukan secara real-time

    • Saya penasaran apakah ini membutuhkan GPU yang kuat
  • Hal-hal seperti inilah yang dulu membuat saya tertarik pada komputer, tetapi di tengah jalan saya lelah dengan library, endpoint, dan pekerjaan kantor

    • Suatu hari saya ingin mencoba lagi
  • Jika tertarik pada simulasi gelombang/lautan, Acerola pernah mengunggah video yang keren tentang topik ini

  • Menarik betapa sulitnya masalah ini

    • Sudah dicoba selama puluhan tahun, tetapi masih belum sempurna
    • Jika frame dihentikan, gelombangnya terlihat seperti gunung bersalju
    • Agar air memiliki karakteristik setajam itu, anginnya harus sangat kuat
    • Simulasi ini berhasil merepresentasikan sifat gelombang yang halus dengan baik
  • Saya tinggal di dekat pantai selama beberapa tahun

    • Saat tinggal di pantai, Anda jadi menatap laut dalam waktu lama
    • Rendering ini terlihat seperti laut sungguhan
  • Pendekatan ini punya sedikit keterbatasan untuk gelombang yang sangat besar

    • Gelombang air bukan gelombang sinus, tetapi untuk gelombang kecil metode ini bekerja dengan baik
    • Gelombang besar saling berinteraksi secara nonlinier, jadi dibutuhkan pendekatan lain
  • Ada juga contoh keren di Shadertoy

  • Fourier mengembangkan transformasi frekuensi gelombang saat mengukur gelombang pasang surut

    • Ini hampir seperti lingkaran yang lengkap
    • Sangat mengesankan
  • Sangat mengesankan, tetapi ada sedikit masalah pada kelembutan gelombangnya

    • Cara gelombang frekuensi tinggi bergerak di atas gelombang frekuensi rendah berbeda dari yang terlihat di video