Godotに実装されたFFTベースの海洋波レンダリング
(github.com/2Retr0)GodotOceanWaves
Godot Engineを用いた外洋レンダリングの実験で、指向性海洋波スペクトルの逆フーリエ変換を使って波を生成する。スクリプトからリアルタイムで波の特性を変更できるシンプルなパラメータを用意しており、さまざまな海の波環境を再現できる。
紹介
なぜフーリエ変換なのか?
- ビデオゲームで水をアニメーション化する一般的な方法は、Gerstner waves を使うこと。しかしこれは、穏やかな水面の低周波ディテールをモデリングするには適している一方で、外洋の荒れた表面を正確に表現するには不十分。
- これを解決するために、海洋学者が収集した経験的データに基づく海洋波スペクトルの 逆フーリエ変換 を使って波をシミュレーションする。
- 周波数空間で作業する利点は、海の特性を簡単に変更できること。Gerstner wavesを使う場合、特定の海況を再現するために波やそのパラメータをどう変更すべきかが明確ではない。
- フーリエ変換の計算には 高速フーリエ変換 アルゴリズム(FFT)を使う。これは古典的な離散フーリエ変換アルゴリズムより計算量が少なく、GPUでの実行に適している。
結果
波のシェーディング
ライティングモデル
- 海のライティングモデルは主に『Atlas』のGDC講演で説明されたBSDFに従う。ただし、マイクロファセット分布にはBeckmann分布ではなくGGX分布を使用する。
- ノーマル/フォームマップは、ワールド空間のピクセル密度に応じてbicubicとbilinearフィルタリングを混合してサンプリングする。
海の泡
- Tessendorfは、波の頂点が自分自身に巻き込まれるときに泡を生成する方法を提案している。
- 泡は線形に蓄積し、指数関数的に減衰し、"泡の成長速度" と "泡の減衰速度" パラメータで制御される。
海の飛沫
- 海の飛沫はGodotのGPUParticles3Dノードを使って粒子としてモデル化される。
- 粒子はGPUParticles3Dノードの境界ボックス内に一様に分布する。
- 各海の飛沫粒子は、単一の静的テクスチャを持つビルボードスプライトを使用する。
波のシミュレーション
- 表面波の生成方法はTessendorfに従う。
- 指向性海洋波スペクトル関数は、周波数と方向に応じて波のエネルギーを返す。
海洋波スペクトル
- 非指向性スペクトル関数として Texel-Marsen-Arsloe(TMA)スペクトルを選択している。
- 指向性拡散関数として flat と Hasselmann 拡散を混合して使用する。
高速フーリエ変換
- GPU向けのカスタムFFT実装を作成している。
- 初期ビット反転順列を避けるために Stockham FFTアルゴリズムを使用する。
波のカスケード
- 遠距離ではタイリングアーティファクトが非常に目立つ。
- 波生成システムでは、複数の波カスケードを同時に階層的に重ねることができる。
負荷分散
- 波の動きは、毎フレーム変位を更新しなくても滑らかに見せることができる。
- "更新速度" パラメータを導入し、1秒あたりに波カスケードが更新される頻度を制御する。
参考文献
- 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).
著作権表示
- Evening Road 01 (Pure Sky) by Jarod Guest is used under the CC0 1.0 license.
- OTFFT DIT Stockham Algorithm by Takuya Okahisa is used and modified under the MIT license.
GN⁺の要約
- GodotOceanWavesは、Godot Engineを用いた外洋レンダリングの実験で、指向性海洋波スペクトルの逆フーリエ変換を使って波を生成する。
- 高速フーリエ変換(FFT)を使うことでGPU上で効率的に実行でき、さまざまな海の波環境を再現できる。
- 波のシェーディング、海の泡、海の飛沫、波のシミュレーションなど多様な要素を含み、現実的な海面をシミュレーションする。
- このプロジェクトは、ビデオゲームやシミュレーションで現実的な海洋レンダリングを実装するのに役立つ可能性がある。
1件のコメント
Hacker Newsのコメント
この人のほかの2つのGodotリポジトリもとても興味深い
20年前なら、海面のレンダリングに何カ月も費やしてもこのレベルには到達できなかった
デモクリップは少し大げさに見える
Godotでレンダリングがリアルタイムに行われているようだ
こういうものがきっかけでコンピュータに興味を持ったが、その途中でライブラリやエンドポイント、会社の仕事に疲れてしまった
波/海洋シミュレーションに興味があるなら、Acerolaがこのテーマについて素晴らしい動画を投稿している
この問題がどれほど難しいのか興味深い
何年か海辺に住んでいた
このアプローチは非常に大きな波ではやや限界がある
Shadertoyにも素晴らしい作例がある
Fourierは波の周波数変換を考案したとき、潮汐波を測定していた
とても印象的だが、波の滑らかさには少し問題がある