T.TAO
Back to Works
2024/graphics / rendering

リアルな水のシミュレーション

リアルな水のシミュレーションとレンダリング:Phillips スペクトルによる FFT 海面、GPU Position-Based Fluids、スクリーンスペース流体レンダリング。

TechnicalArtComputerGraphicsSimulation
リアルな水のシミュレーション

このプロジェクトはリアルな水のシミュレーションとレンダリングの体系的な研究であり、CMU の Visual Computing Systems コースで Moussab Ibrahim、Weier Flora Xiao と共同執筆した論文です。プロシージャルな波の重ね合わせから FFT 海面スペクトルまで、パーティクルベースの流体からオイラー格子ソルバーまで、リアルタイム水表現の主要な技術ファミリーを実装・比較し、すべて Unity のコンピュートシェーダーで GPU アクセラレーションしました。

論文全文はページ末尾に埋め込んであります。以下はその内容のツアーです。

表面波:オシレーターから FFT 海面へ

サイン波の重ね合わせと Gerstner 波

最も単純な水面は、サインオシレーターで駆動されるハイトフィールドです。単一のサイン波は明らかに人工的ですが、異なる周波数・振幅・方向の波を重ね合わせるだけで、穏やかな水面らしく見えてきます:

h(x,t)=iAisin((kix)ωit+φi)h(\mathbf{x}, t) = \sum_i A_i \sin\big((\mathbf{k}_i \cdot \mathbf{x}) - \omega_i t + \varphi_i\big)

しかし実際の波には鋭い波頭と広い波谷があり、純粋なサイン波の和では表現できません。Gerstner 波は頂点を垂直方向だけでなく水平方向にも変位させることでこれを解決します——頂点が波頭に集まり、古典的なトロコイド形状を作り出します。

Phillips スペクトルによる統計的海洋モデリング

有限個の周期波の重ね合わせは、上空から見るといずれタイリングの繰り返しが露呈します。海洋学の研究では、波高を統計的規則性を持つ確率変数として扱います。Tessendorf の手法に従い、波高フィールドをフーリエ空間で合成します:各波数ベクトル k\mathbf{k} にガウスノイズからサンプリングした複素振幅を割り当て、その分布を Phillips スペクトルで整形します:

Ph(k)=Ae1/(kL)2k4k^w^2,L=V2gP_h(\mathbf{k}) = A \, \frac{e^{-1/(kL)^2}}{k^4} \, |\hat{\mathbf{k}} \cdot \hat{\mathbf{w}}|^2, \qquad L = \frac{V^2}{g}

ここには風速 VV と風向 w^\hat{\mathbf{w}} がエンコードされており、風に垂直な波は抑制されます。収束の悪い短波長成分はガウス係数 ek2l2e^{-k^2 l^2} で抑えます。

時間発展は分散関係 ω2(k)=gk\omega^2(k) = gk から与えられます。深水では波長の異なる波が異なる速度で伝播し、これこそが海面を「生きている」ように見せるのです:

h~(k,t)=h~0(k)eiω(k)t+h~0(k)eiω(k)t\tilde{h}(\mathbf{k}, t) = \tilde{h}_0(\mathbf{k}) e^{i\omega(k)t} + \tilde{h}_0^*(-\mathbf{k}) e^{-i\omega(k)t}

リアルタイム化を可能にする FFT

毎フレーム、スペクトルを空間ハイトフィールドに逆変換するには 512×512 グリッドの逆 DFT が必要です——O(N2)O(N^2) では絶望的、O(NlogN)O(N \log N) なら十分実用的です。論文では Cooley-Tukey FFT を第一原理から導出しています:回転としての複素数、オイラーの公式、4 点バタフライ演算、回転因子の対称性、そして分割統治の各ステージが「水平→垂直」の 1D FFT パスとして組み上がり、GPU 上で最終的なハイトマップを生成する仕組みです。

ボリューム流体:パーティクルとグリッド

ハイトフィールドは飛沫を上げられません。真に三次元的な挙動のために、3 つのシミュレーションパラダイムを実装・比較しました。すべて Unity コンピュートシェーダーで並列化しています。

Position-Based Fluids(PBF)

PBF は位置に直接作用することで、力ベースの SPH が抱える剛性問題を回避します:速度と重力から粒子位置を予測し、非圧縮性制約へ反復的に射影します:

Ci=ρiρ01=0C_i = \frac{\rho_i}{\rho_0} - 1 = 0

密度 ρi\rho_i は poly6 平滑化カーネルで近傍から推定し、位置補正 Δpi\Delta \mathbf{p}_i は粒子ごとのラグランジュ乗数で分配します。一様グリッドによる近傍探索(セル寸法 = 相互作用半径、27 セル参照)により近傍クエリは O(n2)O(n^2) から実質 O(n)O(n) に削減され、数万粒子のインタラクティブなシミュレーションが可能になります。

Smoothed Particle Hydrodynamics(SPH)

Navier-Stokes 運動方程式の古典的な力ベース定式化:圧力、粘性力、密度をすべて平滑化カーネルで評価します(密度は poly6、圧力は spiky 勾配、粘性はラプラシアン)。GPU の indirect instancing により約 10,000 粒子をリアルタイムで実現しました。SPH は水滴や飛沫を美しく捉えますが、タイムステップと剛性パラメータの調整に非常に敏感です——この「教育的な苦労」が PBF 実装の動機になりました。

オイラー格子ソルバー

正反対の世界観:粒子ではなく空間を固定します。速度と密度はスタガードグリッド上に置かれ、各ステップでセミラグランジュ移流を行い、Gauss-Seidel の圧力射影v=0\nabla \cdot \mathbf{v} = 0 を強制します。隣接セルがエッジを共有するため GPU での Gauss-Seidel 並列化は自明ではありません——セルを互いに素な 2 グループに分けるチェッカーボード分割を使い、競合状態なしに半分ずつ並行更新しました。グリッド法は SPH より明らかに安定で、10,000 セル超までスケールしました。

スクリーンスペース流体レンダリング

パーティクルは表面ではありません。PBF シミュレーションを連続した水として描画するために、スクリーンスペース流体レンダリングパイプラインを実装しました:

  1. パーティクル球——ジオメトリシェーダーで各粒子をカメラ向きのクアッドに展開し、球外のピクセルを破棄。
  2. 深度パス——粒子の深度をレンダリングしてエンコード。
  3. バイラテラルブラー——シルエットを保ちながら深度バッファを平滑化し、個々の粒子を連続した表面へ「溶かす」。
  4. 法線再構築——深度勾配から外積で視空間法線を再構築。
  5. 厚みパス——深度テストなしの加算ブレンディングで、各視線が通過する流体量を測定。
  6. シェーディング——拡散 + 環境光 + スペキュラ、Beer-Lambert 減衰 I=ekdI = e^{-kd} による体積吸収、Schlick 近似による Fresnel 反射。

結果は透明で屈折感のある液体ボリュームとして描画されます——メッシュ化ステップなしに、すべてパーティクルデータから計算されています。

このプロジェクトが示すもの

  • 水表現スタック全体への広がり——プロシージャル波、スペクトル海面合成、3 つの流体シミュレーションパラダイム、完全なスクリーンスペースレンダリングパイプラインを、サーベイではなく実装として。
  • エフェクトの背後にある数学——複素解析と FFT をゼロから導出。スペクトル、分散関係、平滑化カーネルそれぞれの適用限界を理解した上での応用。
  • GPU エンジニアリングの判断力——コンピュートシェーダー並列化、競合のない Gauss-Seidel、グリッド近傍アクセラレーション、そして SPH・PBF・オイラー法の安定性・ディテール・スケーラビリティ間の率直なトレードオフ分析。

13 ページの論文全文:

Realistic Water Simulation — 論文全文Open ↗