1 ポイント 投稿者 GN⁺ 2024-09-29 | 1件のコメント | WhatsAppで共有

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)スペクトルを選択している。
  • 指向性拡散関数として flatHasselmann 拡散を混合して使用する。
高速フーリエ変換
  • 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件のコメント

 
GN⁺ 2024-09-29
Hacker Newsのコメント
  • この人のほかの2つのGodotリポジトリもとても興味深い

    • リポジトリの説明に詳細を追加しているやり方が気に入った
    • 特にこのリポジトリが興味深い: GodotGaussianSplatting
    • 学生である可能性があり、ほかの研究を頻繁に引用していて、最近公開された資料への理解度も高い
  • 20年前なら、海面のレンダリングに何カ月も費やしてもこのレベルには到達できなかった

    • この技術がどれほど優れているかに驚かされる
  • デモクリップは少し大げさに見える

    • 50,000Nm以上の航海経験がある
    • あれほど鋭く高い波には、もっと強い風が必要だ
    • これはパラメータ調整で解決できるはず
  • Godotでレンダリングがリアルタイムに行われているようだ

    • 強力なGPUが必要なのか気になる
  • こういうものがきっかけでコンピュータに興味を持ったが、その途中でライブラリやエンドポイント、会社の仕事に疲れてしまった

    • いつかまた挑戦したい
  • 波/海洋シミュレーションに興味があるなら、Acerolaがこのテーマについて素晴らしい動画を投稿している

  • この問題がどれほど難しいのか興味深い

    • 何十年も試みられてきたのに、いまだに不完全だ
    • フレームを止めると、波が雪をかぶった山のように見える
    • 水がこのように鋭い特徴を持つには、風が非常に強くなければならない
    • シミュレーションは波の滑らかな特性をうまく表現していた
  • 何年か海辺に住んでいた

    • 海辺に住んでいると、海を長い時間眺めることになる
    • このレンダリングは本物の海のように見える
  • このアプローチは非常に大きな波ではやや限界がある

    • 水の波は正弦波ではないが、小さな波ではこの方法がうまく機能する
    • 大きな波は非線形に相互作用するため、別のアプローチが必要だ
  • Shadertoyにも素晴らしい作例がある

  • Fourierは波の周波数変換を考案したとき、潮汐波を測定していた

    • ほとんど完璧な循環だ
    • とても印象的だ
  • とても印象的だが、波の滑らかさには少し問題がある

    • 高周波の波が低周波の波の上を移動する様子が、動画とは異なっている