大垣にきてはや1ヶ月ですが、元気に生きてます。掲題の件について説明とコードを書きます。こんなのができます。

#Unity + #generativeart . Mesh tunnel motif.

Ayumu Nagamatsuさん(@ayumu_naga)が投稿した動画 –

Unityはマルチプラットフォームなので、ProcessigとかoFみたいな気軽なGenerative Artのスケッチを、VRやモバイルプラットフォームに気軽に移植できるので、とてもうれしいです。本当にありがとうございます。掲題の件、カンタンではあるのですが、ググってもこれっぽい情報は無かったので記事にしておきます。

Monobehaviour

Unityでのコーディングは基本的には Monobehaviour というクラスの継承を記述します。Monobehaviourは、ライフサイクルに応じて、特定の関数が引かれます。インスタンス生成時にはStart()、Frame更新のループ内ではUpdate()という感じです。ライブラリ側が用意した、setup() や draw() をオーバーライドして記述するあたりProcessingも同じと言えるので、Monobehaviourライフサイクルを理解できれば移植はしやすいです。

GameObject

Monobehaviourを継承したスクリプトは、GUI側でつくった GameObject にくっつけます。
GameObjectの内部には、位置・回転・スケールの情報(Transform)、材質情報(Material)、頂点配列を持った形状情報(Mesh)などを、Componentという単位で複数持ちます。MonobehaviourスクリプトもこのComponentのひとつです。Monobehavior以外にも、ShaderとかプログラマブルにできるComponentは多くあるっぽいですが、その点はまたの機会に書きたいと思います。
今回は、Monobehaviourスクリプトを普通のGameObjectでなく Camera にくっつけます。

OpenGLほぼそのままのGLクラス

UnityにはありがたいことにOpenGLをほぼそのまま使えるよう GL クラスが存在します。
なぜありがたいかというと、ProcessingやopenFrameworks、WebGLなど、OpenGLを利用しているライブラリの記述の経験があれば、交換が効き応用できるからです。(とくにopenFrameworksでは、OpenGLの生のAPIの関数を使えます。)

こういう感じで書けます。

注意としては、GLクラスは、MonobehaviourのUpdate()に記述しても、実際のレンダリング時には反映されないということです。では、どこに書くかというと、Camera を継承したGameObjectにアタッチされたMonobehaviourスクリプト内の OnPostRender()内に記述します。この関数は、一通りCamera視点の描画が完了した後に引かれ、追加の直接描画の処理もできるということです。Update()は、データの更新はできるけど、直接描画はUnity側の内部処理のため、直接描画処理はできないということと理解できます。OnPostRender()はCamera以外のGameObjectのライフサイクルには引かれるタイミングが存在しないので記述しても意味がありません。

OpenGL APIをOnPostRender()で記述する方法は、GenerativeArtっぽい表現をするのにとても適しているとおもいます。oFやProcessingで転用が効くということが個人的には意義あることだと思ったりします。

MonoBehaviourスクリプト

最後に、お好みでSkyBoxつけたりPostProcessingしたり絵として良い感じになればOKです。
上の動画では、Bloomを加えています。

私も助けられた読むとためになる他者の記事

Generative Art with Unity

SlideShareでコードはないけど、Trail RendererというUnityの機能を使った素敵な作品を紹介されています。ヒントとなるアイディア満載。

Unity入門 : UnityでGenerative Artっぽい表現をしてみる。

EmptyObjectにアタッチするスクリプトを書かれている例です。GLオブジェクトではなくLineRendererで線を書かれています。私のより、こっちのがもっとProcessingっぽいか。