Black Hole Simulator — GLSLによるリアルタイム・レイマーチング

Black Hole Simulator は、GLSLのフラグメントシェーダによるレイマーチングでブラックホールをGPU上でリアルタイムに描画します。事前計算した画像やオフラインレンダリングは使っていません。Interstellar風の重力レンズ表現やドップラーシフトのヒートマップを含む5つのモードを備えています。

PythonGLSLOpenGLRay MarchingGPU Shaders

レイマーチングが何をしているか

レイマーチングは、カメラから光線を少しずつ前進させながら、各ステップで何かに当たったかを判定して画像を作る手法です。幾何学をスクリーンに投影するラスタライズとは異なり、ピクセルごとに距離関数を評価して像を組み立てるため、形状を三角形メッシュではなく数式として記述できます。

ブラックホールと相性が良いのはこの性質のためです。モデル化すべき「表面」が存在しません。見た目の特徴は質量の近傍で光の経路が曲がることに由来し、その経路は形状で近似するよりも、ピクセルごとに数値積分するほうが自然に表現できます。

代償は計算量です。すべてのピクセルが多数の反復を行うため、フラグメントシェーダがボトルネックになり、解像度が最も効く品質の調整項目になります。レンダラは解像度を落として対話的に動作し、ピクセル単位の処理はすべてCPUではなくGPUが担当します。

5つのモード

いずれのモードのレンズ表現も、歪み場による視覚的な近似です。シュヴァルツシルト計量やカー計量における測地線方程式の解ではありません。物理的に正確なシミュレーションを探してここに来た方にとっては重要な区別で、リポジトリにもその旨を明記しています。

  • シネマティック — Interstellarで知られた表現に近い、暖色の降着円盤と強いレンズ効果
  • ドップラーヒートマップ — 視線に対する相対速度で円盤を彩色し、近づく側と遠ざかる側を描き分けます
  • EHT風の近似 — イベント・ホライズン・テレスコープの画像に見られるリング状の見え方を視覚的に近似したもの
  • その他のモード — 別の配色やカメラ表現
  • 全モードでインタラクティブなカメラ操作に対応し、描画中でも視点を変更できます

近似でも作る価値がある理由

物理的に正確なレンダラは、曲がった時空計量に沿ってヌル測地線を積分する必要があり、コード量もピクセルあたりの計算量も大幅に増えます。歪み場による近似でも、ブラックホールだと分かる視覚的特徴 — 非対称なリングや、円盤の裏側が影の上下に回り込んで見える様子 — は捉えられ、しかも対話的に動かせます。

物理の問題ではなく描画の問題として捉えることで、プロジェクトの主張が正確になり、完成させられる範囲に収まります。測地線の積分を実際に実装するのは自然な次の段階であり、まったく別の仕事になります。

実装について

PythonとOpenGLバインディング、およびGLSLシェーダで書かれています。ピクセル単位のループはすべてGPU上で実行され、Pythonはウィンドウ生成、入力処理、uniformの更新を担当します。シェーダのコンパイルは起動時に行われるため、実行時のホットパスにCPU側のピクセル処理は含まれません。

カメラの状態は毎フレームuniformとしてシェーダに渡されるため、視点の回転はuniformの更新のみで完結し、形状を再構築する必要はありません。事前計算を行わないため、モードの切り替えはフラグメントシェーダの分岐が変わるだけです。

主な特徴

  • リアルタイム描画
  • 5つの可視化モード
  • インタラクティブなカメラ
  • 手続き型グラフィックス