高速なシェーダの演算機能を利用して描き出されるフラクタルの美しき世界 Epimorphism!
数学の深遠なる世界に触れられる
今回ご紹介するのは、いわゆるフラクタルと呼ばれる幾何学模様を、フラグメントシェーダを利用することで高速に描画する WebGL 製のデモです。
作品の名称には「Epimorphism」とありますが、これは日本語に直訳すると「全射」と呼ばれるもののようです。
私のようなニワカにはまったく理解できない世界ではありましたが、少なくとも、その描き出される模様の面白さは、見る人すべてにとって平等なものでしょう。
とても興味深いデモ作品で、英語ですが、解説する記事も公開されていますので、一緒にご紹介したいとおもいます。
シェーダの高速な演算性能が活躍
個人的な話から始まってしまい恐縮ですが、私はフラクタルの描画というと、非常にメジャーなフラクタルのひとつである「マンデルブロ集合」くらいしか実装したことがありません。
今回のデモで描かれる世界は、いわゆるフラクタルであることは(たぶん)間違いないと思うのですが、いかんせん、数学的な理解がまったく追いつかないのでうまく説明することができないことをご了承ください。
そのあたりのきちんとした数学的な知見については、同時に公開されている記事のほうに、詳しく書いてあります。
これを見ると、やはりマンデルブロ集合などをプログラムで描く場合と同様に、たくさんの計算を連続して行なっていく過程でこれらの模様が描き出されているということは、なんとなく想像がつきます。
マンデルブロ集合に自身で取り組んだときも感じたことですが、比較的単純な数式をひたすら解いていく、というストイックな行動が、結果的にとても美しい形容しがたいグラフィックスを描き出すということがとても興味深いです。
数学の世界って、本当に不思議です。
当該記事には、いくつか作例のキャプチャ画像なども掲載されているので、実装や数学的側面の詳細について知りたい人は、そちらもぜひご覧になってみてください。
以下は、実際に私の環境で実行したときのキャプチャです。
さて、話を今回の作品に戻しましょう。
フラグメントシェーダをスクリーン全体に走らせる、という意味では、いわゆる Shadertoy などに見られるシェーダ芸と同じように、GPU のちからを使ってゴリゴリとグラフィックスを描き出しています。
ちょっとわかりにくいのですが、画面の右下あたりには、クオリティを変更することができるメニュー等も隠れているので、負荷が高すぎると感じた場合は、クオリティをちょっと落としてみるのもひとつの手です。
一方、ソースコードのほうを見れば、本当にフラグメントシェーダしか使っていない上に、結構シンプルなコードになっているのがわかると思います。
レイマーチングなんかもそうなんですが、シェーダによるグラフィックスは、時に驚くほど簡素なことがありますね。今回の作品も、その多彩な表情とは裏腹に、とてもシンプルな数式や計算が組み合わさって作られていることが、シェーダのソースコードを見るとわかると思います。
一応、いくつかテクスチャとして画像を読みこんだりはしているようですが、基本的にはシェーダで模様を生成しているような感じです。
先ほどの解説記事のほうに書かれている内容によれば、今回の WebGL 実装は、もともとは、Haskell に影響を受けた比較的新しい関数型言語 PureScript で書かれていたもの、みたいですね。
これを JS と GLSL に書き直したものが、今回の作品みたいです。
私は Haskell などはほとんどわからないのですが、やはり、数学的な知識を反映させやすい、そんな性質の言語から作られたものだというところが、なんとも味わい深いです。
シェーダには様々な可能性があるなって感じがしますね。
私に専門知識がなくてあまり詳細に解説できず、申し訳ない。
ただ、こういった比較的難解な数学のテーマの中から、今回のように誰にとっても楽しめる映像やイメージが出来上がってくるというのは、やはり神秘的な、不思議なロマンに満ちていますよね。
以前、数学をテーマにした勉強会でシェーダのハンズオンをやったことがありますが、あのときも、数学に強い方々がさらりとシェーダを使いこなしている様子を拝見して、本当にすごいなと感じたものです。
なかなかに難解で、そう簡単には理解できなさそうな世界の作品ではありますが、非常に美しい不思議な描画結果は、一見の価値があると思います。
ぜひチェックしてみてください。