Drave氏のFlameアルゴリズムについて、日本語でごく簡単な解説をしつつopenFrameworksとGLSLの実装例を示します。当該アルゴリズムは、動画などで広く流布しています。出力が非常に美しく多彩で、こんなにも耽美な絵画群がいかにして1つのプログラムで生成できるのか解読したいと思ったのがきっかけで、作者の論稿を読み始めました。アルゴリズム自体は、その出力結果からは想像できないほど驚くほどシンプルでです。Drave氏に敬意をこめながら、コンピュータによる美しい画作りをしたいと思う方の少しでも参考になればと思い本記事を書きました。注意:数学的な記述については専門的知識を持ち合わせておらず、間違い等などあればご指摘いただけると幸いです。Dravesを中心として1999年に制作されたソフトウェアと、それを運用するアートプロジェクトです。当該ソフトウェアはフラクタル図形のアニメーションを描画するスクリーンセーバとし機能します。アニメーションは、高性能な中央サーバーがレンダリングし、クライアントコンピュータはインターネット経由でストリーミングするのみです。呼ぶシンプルなアルゴリズムによるものです。Mentionedを獲得しています。いったポピュラーなソフトで動作するプラグイン等が存在します。Flameはその特質上、とりうるパラメータが無数にあります。Sheepではできあがった絵(つまりFlameのとったパラメータ)を、ユーザーグループ間で共有し、気に入ったものに投票することができます。その結果を重み付けとした遺伝的アルゴリズムによって逐次あらたなパラメータを生みだし、絵を生成します。人間の好みを遺伝的アルゴリズムで学習させ、より美しい絵を永遠に生成していくということを意味します。この一連のプロセスは、人間と機械の協調によって美を追求する営みであり、人間が美しさを測る「審美」を再考する上でも興味深い試みです。人とマシンの協調による美学の発展を志向したことです。アートが「美」を追求するものでなくなった今、近未来の美しさを考える美学の発展を考えるにあたって大きなマイルストンのように思います。Latham等挙げられますが、また別の機会にまとめたいと思います。System)に属します。乱数を入力値として受け取り、再帰計算を経て座標変換します。再帰計算によって乱数の入力が、特定の系、集合による形をなすことがあります。上記の例はともにという座標変換に帰着させることができます。上記のa,b,c,d,e,fの6つのパラメータが、一点の確率で特定の値に決定され、再帰計算されることで、時として美しい形をなす事があるのです。逆に、秩序のないつまらない絵になるときもあります。詳述されていますが、概観すると以下のようになります。1)2次元ベクトルを入力し、座標変化をした上で2次元ベクトル出力する関数を、再帰的に計算する2)この関数(座標変換処理)は、「アフィン変換」部と「バリエーション」部に別れ、それぞれのパラメータを確率にしたがって決定し実行する・アフィン変換はパラメータを6つ、バリエーションは実質、無数のパラメータをとる・このアフィン+バリエーションの関数のとるパラメータを複数用意し、それぞれに出現率をわりあてる。上述した反復関数系(カオスゲーム)の通りです。これだけでも実に多様な系を生成することができます。バリエーション部それぞれの下位関数は、たとえば魚眼系の変換、天球系の変換など、上記の論稿では40種類以上定義されています。実質、オリジナルを定義することもできます。実装する際は、描画パフォーマンスと出力の好みによって決定します。上記論稿では、点のカラーリング、パラメータ変更時のモーフィングについても言及していますが、このあたりの詳細は原文を参考ください。実装ここでは上記原理をGPUによって並列計算させることを念頭に、openFrameworksとGLSLでの記述をします。APIを3.2にします。positionなど)を使えるからです。(というかこれを推奨とofBookに記述がありました。Materialを適用することで、頂点座標の計算、描画時の色計算をGLSLで記述することができます。計算内容やGPU性能によりますが頂点数100万くらいでも60fpsが十分でると思います。描画のときに必要な変数を用意し、Uniform変数としてShaderにわたるようにします。重要なのは、アフィン変換部、バリエーション部で使うパラメータです。Shaderで行います。Castellanos氏によるWebGLでの実装例を参考にし、コードとして分かりやすくなるよう変数名など改変をくわえつつ、バリエーション部分は私の好きなようにカスタマイズしました。一般的にメモリ確保をする変数宣言は少なくすると良いと考えられますが、このコードは結構変数宣言をしてるのでチューニングの余地あると思います...。Shader側で計算した結果を出力するのみです。GLSLはバージョンが違うことで出力の際の記法や、使える機能にかなり差異があるので、ご注意ください。openFrameworksはデフォルトはGLSL1.2になります。(この場合、varyingの宣言ができたりします。gl_FragColorで色出力したりします。LTしたことTOPSKETCHESPROFILELINKS。