Godot में इम्प्लीमेंट किया गया FFT-आधारित ocean wave rendering
(github.com/2Retr0)GodotOceanWaves
Godot Engine का उपयोग करके open ocean rendering का एक प्रयोग, जिसमें directional ocean wave spectrum के inverse Fourier transform का उपयोग करके लहरें बनाई जाती हैं। यह script के जरिए real time में wave properties बदलने के लिए सरल parameters देता है, जिससे अलग-अलग समुद्री लहरों वाले environments की नकल की जा सकती है।
परिचय
Fourier transform क्यों?
- वीडियो गेम्स में पानी को animate करने का सामान्य तरीका Gerstner waves का उपयोग करना है। लेकिन यह शांत पानी के low-frequency details को model करने के लिए तो उपयुक्त है, पर open ocean की खुरदरी सतह को सटीक रूप से दर्शाने में कम पड़ता है।
- इसे हल करने के लिए, समुद्र-विज्ञानियों द्वारा एकत्र किए गए empirical data पर आधारित ocean wave spectrum के inverse Fourier transform का उपयोग करके लहरों का simulation किया जाता है।
- frequency space में काम करने का फायदा यह है कि समुद्र के गुणों को आसानी से बदला जा सकता है। Gerstner waves का उपयोग करने पर यह स्पष्ट नहीं होता कि किसी विशेष sea state की नकल करने के लिए waves और उनके parameters को कैसे बदला जाए।
- Fourier transform की गणना के लिए Fast Fourier Transform algorithm (FFT) का उपयोग किया जाता है। इसकी computational complexity पारंपरिक discrete Fourier transform algorithm से कम होती है, और यह GPU पर चलाने के लिए उपयुक्त है।
परिणाम
wave shading
lighting model
- ocean lighting model मुख्य रूप से 'Atlas' GDC talk में वर्णित BSDF का पालन करता है। हालांकि, microfacet distribution के लिए Beckmann distribution की जगह GGX distribution का उपयोग किया गया है।
- normal/foam map को world-space pixel density के आधार पर bicubic और bilinear filtering को मिलाकर sample किया जाता है।
ocean foam
- Tessendorf ने यह तरीका प्रस्तावित किया कि जब wave crest अपने ऊपर ही मुड़ने लगे तो foam पैदा किया जाए।
- foam रैखिक रूप से जमा होती है और घातीय रूप से खत्म होती है, और इसे "foam growth rate" तथा "foam decay rate" parameters से नियंत्रित किया जाता है।
ocean spray
- ocean spray को Godot के GPUParticles3D node का उपयोग करके particles के रूप में model किया गया है।
- particles को GPUParticles3D node के bounding box के भीतर समान रूप से वितरित किया जाता है।
- हर ocean spray particle एक single static texture वाले billboard sprite का उपयोग करता है।
wave simulation
- surface waves बनाने की विधि Tessendorf का अनुसरण करती है।
- directional ocean wave spectrum function frequency और direction के अनुसार wave energy लौटाता है।
ocean wave spectrum
- non-directional spectrum function के रूप में Texel-Marsen-Arsloe (TMA) spectrum चुना गया है।
- directional spreading function के रूप में flat और Hasselmann spreading को मिलाकर उपयोग किया गया है।
Fast Fourier Transform
- GPU के लिए एक custom FFT implementation लिखा गया है।
- शुरुआती bit-reversal permutation से बचने के लिए Stockham FFT algorithm का उपयोग किया गया है।
wave cascade
- बड़ी दूरी पर tiling artifacts बहुत स्पष्ट हो जाते हैं।
- wave generation system एक साथ कई wave cascades को layer कर सकता है।
load balancing
- waves की movement हर frame में displacement update किए बिना भी smooth दिखाई दे सकती है।
- "update rate" parameter जोड़ा गया है ताकि प्रति सेकंड wave cascades कितनी बार update हों, इसे नियंत्रित किया जा सके।
संदर्भ
- 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).
copyright notice
- Evening Road 01 (Pure Sky) by Jarod Guest का उपयोग CC0 1.0 license के तहत किया गया है।
- OTFFT DIT Stockham Algorithm by Takuya Okahisa का उपयोग और संशोधन MIT license के तहत किया गया है।
GN⁺ की संक्षिप्त जानकारी
- GodotOceanWaves, Godot Engine का उपयोग करने वाला open ocean rendering प्रयोग है, जो directional ocean wave spectrum के inverse Fourier transform से लहरें बनाता है।
- Fast Fourier Transform (FFT) का उपयोग करके इसे GPU पर कुशलता से चलाया जा सकता है, और यह विभिन्न समुद्री wave environments की नकल कर सकता है।
- इसमें wave shading, ocean foam, ocean spray, wave simulation जैसे कई तत्व शामिल हैं, जो एक यथार्थवादी समुद्री सतह का simulation करते हैं।
- यह प्रोजेक्ट वीडियो गेम्स और simulations में यथार्थवादी ocean rendering लागू करने में उपयोगी हो सकता है।
1 टिप्पणियां
Hacker News राय
इस व्यक्ति के अन्य दो Godot repositories भी बहुत दिलचस्प हैं
20 साल पहले समुद्र की सतह render करने में कई महीने लगा देने पर भी इस स्तर तक नहीं पहुँचा जा सकता था
demo clip थोड़ा बढ़ा-चढ़ाकर दिखाया गया सा लगता है
लगता है कि Godot में rendering real-time में हो रही है
ऐसी चीज़ों ने ही मुझे computers में दिलचस्पी दिलाई थी, लेकिन रास्ते में libraries, endpoints और company work से थक गया
अगर wave/ocean simulation में रुचि है, तो Acerola ने इस विषय पर शानदार videos पोस्ट किए हैं
यह समस्या कितनी कठिन है, यह दिलचस्प है
मैं कई साल समुद्र तट के पास रहा हूँ
बहुत बड़ी लहरों के मामले में इस approach की कुछ सीमाएँ हैं
Shadertoy पर भी एक शानदार example है
Fourier ने wave frequency transform बनाते समय ज्वारीय लहरों को मापा था
बहुत प्रभावशाली है, लेकिन लहरों की smoothness को लेकर थोड़ी समस्या है