Visitar URL original
Reaction-Diffusion:Gray-Scott反応拡散シミュレーター | Playground

Reaction-Diffusion

WebGPUコンピュートシェーダーでGPU上で動作するGray-Scott反応拡散シミュレーション。2つの仮想化学物質が反応・拡散し、斑点・縞模様・珊瑚のような有機的パターンを生み出します。

0 fps

How it works

反応拡散(Reaction-Diffusion)は、2 種類の仮想的な化学物質が 反応(化学変化)と拡散(空間的な広がり)を同時に行うことで、生物の模様に似た自己組織化パターンを生み出す数理モデルです。このデモでは Gray-Scott モデル を WebGPU コンピュートシェーダーで GPU 上にリアルタイム計算しています。

Gray-Scott モデルとは

Gray-Scott モデルは 2 つの物質 A と B の濃度変化を連立偏微分方程式で記述します。

  • 物質 A は一定速度 f で供給される
  • 物質 B は A + 2B → 3B の自触媒反応で A を消費しつつ増殖する
  • 物質 B は速度 f + k で除去される
  • 両物質はそれぞれ異なる拡散速度 dA、dB で空間的に広がる

feed(供給率)と kill(除去率)の 2 つのパラメータだけで、珊瑚・斑点・縞模様・泡・指紋など驚くほど多様なパターンが出現します。

コンピュートシェーダー

WebGPU のコンピュートシェーダーで 256x256(モバイルは 192x192)のグリッドを並列更新しています。各セルは 8x8 ワークグループで処理され、5 点ステンシルのラプラシアンで拡散項を近似します。

// ラプラシアン(5 点ステンシル)
let lap_a = src[u].a + src[d].a + src[l].a + src[r].a - 4.0 * c.a;
let lap_b = src[u].b + src[d].b + src[l].b + src[r].b - 4.0 * c.b;
 
// Gray-Scott 反応項
let reaction = c.a * c.b * c.b;
let na = c.a + (p.dA * lap_a - reaction + p.feed * (1.0 - c.a)) * p.dt;
let nb = c.b + (p.dB * lap_b + reaction - (p.feed + p.kill) * c.b) * p.dt;

グリッドの端はトーラス状に接続(ラッピング)されているため、パターンが端で途切れることなく連続します。

ピンポンバッファ

カールノイズと同様、読み込み用と書き込み用の 2 つのバッファを毎フレーム交互に使うダブルバッファリングを採用しています。これにより同じフレーム内での読み書き競合を回避しています。

プリセット

8 種類の Pearson 分類に基づくプリセットが用意されています。

  • Coral — 珊瑚のように枝分かれしながら成長
  • Mitosis — 細胞分裂のように球が分裂を繰り返す
  • Spots — 均一な斑点が並ぶ
  • Stripes — ゼブラ模様のような縞
  • Worms — 迷路状のうねうねした模様
  • Bubbles — 泡が安定して並ぶ
  • Waves — 波紋が伝播する
  • Fingerprint — 指紋のような複雑な曲線

ポインターインタラクション

画面をタッチ/クリックすると、その位置を中心に物質 B が注入されます。ガウシアン風の減衰でキャンバスの 2.5% の半径に影響を与え、既存のパターンに干渉する新しいシード点を作り出します。