4分で40億年 – GPUで世界をシミュレーション
(davidar.io)- 事前レンダリングされたテクスチャなしで、GLSLフラグメントシェーダだけを使って地球型惑星の全歴史を数分で手続き的に生成し、最終シミュレーションは60fpsで更新される
- 初期地形は緯度・経度を3D座標に変換した後、5段階の詳細レベルのクレーターと fractional Brownian motion ノイズを重ねて原始惑星表面を作る
- プレートテクトニクスはピクセル単位の離散時間ステップでプレートを移動させ、衝突地点の標高上昇を熱侵食によって周囲へ広げ、山脈と大陸形成を近似する
- 水文侵食では各ピクセルが8近傍のうち最も急な下降方向へ水を送り、stream power lawで標高を削ることで、低解像度でも1ピクセル幅の川を作れる
- 気候、生命、人類の段階まで、平均海面気圧、風、降水、Lotka–Volterra拡散モデル、化石燃料燃焼を結び付け、長期的な惑星表面変化を1つのGPUシミュレーションに収めている
GPUシェーダで作った手続き型惑星シミュレーション
- 手続き型地球シミュレーションはGLSLフラグメントシェーダだけで実装されている
- 地球に似た惑星の全歴史を数分でシミュレーションし、画面は60fpsで更新される
- 最終シェーダの映像記録も提供されている
原始惑星の地形生成
- 初期の地球は、高温で小惑星衝突によるクレーターが多い原始惑星として扱われる
- 事前レンダリングされたテクスチャがないため、最初の段階は特定の緯度と経度における地形の高さを計算することになる
- 緯度と経度はまず3Dデカルト座標へ変換される
- 小惑星の大きさがさまざまなので、クレーターも複数のサイズで重ねられる
- シェーダは5段階の詳細レベルを反復する
- 大きなクレーターから小さなクレーターまで層状に配置される
- 地形を粗く見せるために fractional Brownian motion ノイズを混ぜる
- 最も大きいクレーターが地形に最も大きな影響を与えるようスケーリングする
- クレーターは3Dグリッド上で生成し、そのうち球表面を切り出して地形として使う
- 規則的なパターンを避けるため、クレーター中心は hash function によりグリッド点から擬似乱数オフセットを持つ
- 周辺グリッド点に属するクレーターの影響は、距離ベースの指数重みで平均する
- クレーターの縁は単純な正弦曲線で生成する
- 低地を水で満たすと、手続き的に作られた地形は科学者が考える初期地球の姿に似てくる
- 時間が経つと岩石が冷え、水蒸気が凝結して海になり、表面の液体の水の流れが谷を作り、堆積物を残す
プレートテクトニクスと大陸形成
- 山脈、海溝、見慣れた大陸地形を作るにはプレートテクトニクスモデルが必要になる
- プレートはランダムなシード位置から始まり、初期速度が与えられる
- プレートの成長は単純な集合モデルで処理される
- 隣接地点をランダムに選ぶ
- まだ他のプレートに割り当てられていない地点なら、そのプレートに追加する
- 各プレート内部のピクセルはプレート移動速度を保存する
- この方法は拡散のない diffusion-limited aggregation に似ている
- 連続的なプレート移動は、境界がピクセルの一部だけ移動した状態を扱う必要があるため実装が難しい
- その代わり、プレートは離散時間ステップで横または縦に正確に1ピクセルずつ移動する
- 移動時間は各プレートごとにランダム化される
- 設定した速度と方向の平均速度は維持される
- 隣接するプレートが同時に移動する可能性は低くなる
- プレート衝突は、あるプレートの境界ピクセルが別のプレートのピクセルがあった位置へ移動したときに発生する
- 衝突は subduction として扱われ、衝突位置の標高をわずかに上げる形でモデル化される
- 衝突効果は境界ピクセルにしか生じないが、熱侵食モデルが周囲のピクセルへ徐々に広げる
- 熱侵食は1つのピクセルの標高を近傍平均の方向へ押し出す
- この組み合わせにより、山脈を持つ大陸形成をある程度シミュレーションできる
水文侵食と流域
- 自然地形の粗い見た目は流域形成によって大きく生まれ、流域は見慣れた樹枝状パターンで風景を侵食する
- 惑星全体を収める地形マップは解像度が低いため、モデルは1ピクセル幅の川もシミュレーションできなければならない
- Barnes (2018) の単純なモデルがこの要件を満たす
- 各ピクセルは8近傍を調べ、標高低下が最も大きい方向を探す
- 対角近傍はより遠いため補正する
- 最も急な下降方向がそのピクセルから水が流れ出る方向になる
- 水は最初に降雨としてセルに分布し、各時間ステップごとに隣接ピクセル間を移動する
- 侵食は stream power law に従って処理される
- 現在セルの
elevation、water、水が移動する方向のslopeを使う - 標高の低下は、水が流れていく場所より低くならないよう制限される
- 現在セルの
- 水の流れと侵食が噛み合うことで、地形に流域が自然に形成される
- つながった水路を河口位置に応じて色分けすると、実際の流域地図 を思わせる可視化を作れる
- シミュレーション流域の original shader も提供されている
全球気候モデル
- 惑星全体の気候システムは複雑だが、このシミュレーションでは比較的単純に近似している
- 気候シミュレーションの中核となる駆動要素は、手続き的に生成した平均海面気圧(MSLP)マップである
- Climate Cookbook によると、MSLPマップ生成の主要要素は、陸地が海の間のどこにあるかと緯度の影響である
- 実際の地球のMSLPデータを陸と海に分けて緯度に対して描くと、少し形の異なる2つの正弦曲線が現れる
- 年平均気圧モデルは陸と海を区別し、緯度ベースの式で計算する
- 陸地:
1012.5 - 6. * cos(lat*PI/45.) - 海洋:
1014.5 - 20. * cos(lat*PI/30.)
- 陸地:
- 陸と海を別々に計算すると、境界で鋭い不連続が生じる
- 現実では気圧の局所拡散により、海と陸の遷移部でMSLPは滑らかに変化する
- この拡散過程は、MSLPマップにガウシアンブラーを適用して近似する
- 標準偏差は10〜15度の範囲である
- 季節変化は1月と7月のMSLP差を追加でモデル化して実装する
- この差も地球データにおける正弦パターンに従う
- パラメータを調整し、ガウシアンブラーを適用して年平均MSLPと結合する
- MSLPを基に風と気温を生成する
- 現実では気温が気圧を生むが、ここでは相関関係を利用する
seasonは1年の間に -1 と 1 の間を振動する
- 風は高気圧から低気圧へ移動する傾向があるが、全球規模ではコリオリ力も考慮しなければならない
- コリオリ力は風が気圧帯の周囲を循環するようにする
- 速度ベクトルはコリオリ項と気圧勾配を組み合わせて計算する
- この比較的粗いシミュレーションでも、現実的な 風循環パターンが生成される
- インド地域でモンスーン季の間に風向きが反転する現象も再現される
- 降水は海の水蒸気を風ベクトル場に沿って陸地へ移流させることでシミュレーションする
- 移流は流体シミュレーションに似た方法で実装される
生命分布と捕食者・被食者ダイナミクス
- 気候は惑星上の生命分布に影響する
- 降雨パターンと気温変化が植物の成長率を決める
- 季節が変わると草食動物は、自分たちを維持できるだけの植生が十分にある地域へ移動する
- 捕食者は植生を追って移動する草食動物を追う
- こうしたダイナミクスは Lotka–Volterra 拡散モデルで捉える
- 変数
cのxyz要素はそれぞれ植生、草食動物、捕食者の個体群を表す - 大規模な動物個体群ダイナミクスは興味深いパターンを作る
- 現実ではこうしたパターンはシャーレ内の微生物個体群で最も見やすいが、同じ法則が世界中の大型動物個体群にも適用される
人類と炭素排出
- 初期地球段階を過ぎると、シミュレーション速度は昼夜サイクルの速さまで落ち、プレートテクトニクスは検知しにくくなり、地形は固定される
- 夜になると、人類が惑星表面を植民していくにつれて、かつてない光のパターンが現れる
- 人類の急速な拡大は化石燃料の燃焼を伴う
- 数百年にわたり、人類は利用可能なすべての化石燃料資源を燃やし、大気中へ5兆トンの炭素を排出する
- この排出は温室効果を強め、全球平均気温をほぼ摂氏10度上昇させる
- 極端な高温のため、赤道周辺の広大な陸地は居住不能になる
- その結果、人類は惑星のかなりの部分から姿を消す
1件のコメント
Hacker Newsのコメント
すごいのは確かだが、最後に夜間照明を持つ文明は必然的にすべての化石燃料を燃やし尽くして惑星を砂漠にする、という部分は、私たちの文明のあり得る経路の一つだけに依拠した仮定のように見える
温暖化と砂漠化で死ぬことが、核戦争、クリーン核融合の開発、パンデミック、近くの手続き的に生成された地球型惑星からの侵略よりもっともっとらしいと見なせる根拠はない
実際に起きたことをシミュレーションする分には素晴らしいが、意見が入り込む前までがよかった
しかも熱を乾燥と同一視していて、追加のCO2が植物に与える影響も考慮していないようだ。赤道帯が人間が住めないほど暑くなったとしても、砂漠ではなくジャングルに覆われる可能性も十分にある
こうしたアプローチは上で述べられている二次効果をおおむね無視する
最後の砂漠化は、視覚的に物語を伝えやすくするための多少の芸術的誇張だという点は認める。現実はずっと複雑だろう
あくまで特定の可能シナリオ一つの話にすぎず、別の場所でもそう書かれていた: 「最後の部分は、あり得るがたぶん可能性は低い未来を見せようとしたものです。ドラマチックにしたかったので文字どおりすべての化石燃料が燃える極端な結果を描きましたが、それ以外の効果については、そのような仮定に関する科学論文を読み、できるだけ現実的に保とうとしました。」
https://www.vice.com/en/article/xgx7nq/watch-four-billion-ye...
1996/1997年に、数百万年にわたるプレートテクトニクス、温度、高度、降水量をシミュレートするCD-ROMゲームに取り組んでいた
28年間でコンピューティングのハードウェアとソフトウェアがどれほど進歩したかを見ると驚かされる: https://www.kmoser.com/evolution/
惑星とその上の動物をシミュレートするという発想自体が当時は完全に衝撃的で、今でもそうだ。一緒に入っていたポスターを取っておけばよかったが、いくつものサピエンス進化分岐が本当に興味深かった
タイムスライダー付きの3D地球儀でプレートの予想移動を操作し、現在の地形になる過程を可視化できたらいいのにと思った。そういうものを知っているだろうか?
[1] https://www.goodreads.com/book/show/19898.Assembling_Califor...
[2] excerpt: https://www.newyorker.com/magazine/1992/09/07/assembling-cal...
この話題と非常に関係の深い優れたハードSFの本に Permutation City がある。この投稿タイトルを見たとき、夢の中にいるような感覚になった
少し脇道にそれるが、短くて素晴らしい短編 "I don't know, Timmy, being God is a big responsibility" は、ある意味で世界シミュレーションを扱っていて本当に良い:
https://qntm.org/responsibility
何年ものあいだ、非常によく似た筋立ての話を書きたいと思っていたが、宇宙間の計算オーバーヘッドという大きなプロットホールがあり、量子コンピュータで解決するという発想は思いつかなかった
構想していた話のもう一つの違いは、登場人物たちがその物語を書き、それが「私の」物語になり、各宇宙ごとに値が1ずつ増える変数を作って、結末で読者が自分が何番目の深さにいるのか分かるようにする点だった
これをHNで読んでいる人は8474771628371839段階の深さにいる
教科書以外で複数の版に出会ったのは初めてかもしれない。論理や物理の穴を突き詰めない限り、こういう思考実験的な文章は本当に好きだ
すべての宇宙が事実上同一なので、その大半が無意味になってしまう多元宇宙という発想が好きだ
ドラマ、物理学、結末の扱いは違っていたが、同じように心地よい思索の余韻を残した。タイトルや監督名を書きかけたが、この文脈だけでも大きなネタバレになり得ると気づいてやめた
もしかするとこのコメントの中にその名前を暗号化してあるかもしれない。正直、試してはみたし、今は夜も更けているので、最近の検索エンジンなら見つけられるかもしれない
大学でいちばん好きだった授業の一つがエネルギー政策分析で、MITで開発されたEPPAモデルを使って実験していた。
エネルギー貯蔵コストが10分の1に下がったらどう展開するか、といった具合に特定のパラメータを変えてみた。とても面白かったが、残念ながら仕事では似たようなことを試す機会が見つからなかった。
[0]: https://globalchange.mit.edu/research/research-tools/eppa
正直に言うと、このシミュレーションはいくつかの細部を省略しているのは確か :)
理由は分からないが、ページに埋め込まれているすべてのShadertoyのサンプルが自分の環境では0.6 FPSくらいで再生される。
リンクされている「final shader」をShadertoyのWebサイトで開くと60fpsでちゃんと動く。
ときどきシミュレートされた宇宙で生きるとはどんな感じなのだろうと考える。
もし私たちが「宇宙」の「外側」を「見る」ことができたなら、もしかすると私たちの現実が外の「現実」と比べて非常に単純で制約の多いものだと理解するのかもしれない。この構造は無限に続いているのかもしれないし、外側の現実が私たちよりはるかに論理的で、有限であることを受け入れさせるのかもしれない。
しかし私たちには始まりと時間の流れがあるのだから、おそらく誕生や母、ひょっとすると目的さえあるのかもしれない。もちろん、これはとても人間的な考え方で、すべてがただのランダムなスープなのかもしれない。
私たちが作ったシミュレーションの中に自己認識する主体がいて、同じことを考え始めるところを想像してみてほしい。誰もが「私たちはただの偶然だ、神も設計図もない、こんな役にも立たない巨大な空虚の塊にどうしてそんなに多くのエネルギーを使うんだ」と嘲笑するだろうし、彼はある程度は同意しなければならないだろうが、同時にある程度は間違っている。
私たちを見つけても慰めにはならない。私たちもまた、自分たち自身の設計者については何も語れないからだ。同じ理由で、私たちが彼らを見つけたとしても慰めにはならない。だから神という概念は愚かだ。神にも神がいるなら、今度はどうすればいいのか。その存在を受け入れても何一つ問題は解決しない。
ある種の虚無主義なのかもしれないが、そのおかげで圧倒されずに済む。
シミュレーションが必ず半導体の上で動かなければならないなどと、誰が言ったのだろう。
なぜフラグメントシェーダーだけを使うのか分からない。高さマップ用の頂点シェーダーもあれば、表面までズームインできるだろうに。
「written entirely in GLSL fragment shaders」とあるが、それはどんな言語なんだろう。
音楽はかなり陳腐だ。ひょっとするとAIが作ったのかもしれない。
もともとはJohn Murphyが2007年の映画Sunshineのために作曲した。
https://en.wikipedia.org/wiki/Sunshine:_Music_from_the_Motio...