TouchDesginerでGPUを使ったParticle Systemを作れるContainer群『PixelStorm』を公開しました。
今回はこのPixelStormのExampleに入れたGPU Instancingを紹介してみようと思います。
ファイルはこれ。
GPU Instancingの仕組み自体は以前紹介したGPGPU Particle Systemとほぼ同様です。
Shader上での大きな差異は4点、
- vertexIDごとの処理ではなくInstanceIDごとの処理にしていること
- SOPを引数として持ち、それをInstancingすること
- TOPからScaleを計算すること
- TOPからRotationを計算すること
です。これらはTOPtoInstancePhongに全て記述されています。
これにより、
- 大量のInstancingしたオブジェクトを
- 1つずつ色、スケール、位置、回転の4要素で
- 個別に操作すること
が、可能になります。
このExampleではさらに4つのContainerを使ってGPU InstancingなParticle Systemを作りました。
処理内容を左から説明していきます。
1. SOPtoTOP Containerを使い、Sphereから発生源とVelocityを作る
一般的なParticle Systemと同様にParticleの発生源と進行方向をオブジェクトから作成します。
まず、Sphere SOPからSOPtoTOPを使ってVertexの座標をTOPのRGBとして画像化し、これを初期位置として利用します。
また、Normalのベクトルも画像化し、これをVelocity、というか移動方向とオブジェクトの回転方向に利用します。
2. AgeLoopTOPでInstancing Objectに寿命をつける
Instancing Objectは一定時間で初期位置かたまた生まれるようにしたいので、AgeLoopTOPで寿命のループを作るTOPを作成します。
3. POSCalculatorでInstancing Objectの現在座標を計算する
PosCalculator Containerを使って現在座標を計算させます。
初期位置はVertex座標、そしてVelocityが1フレームごとの移動量となります。
基本的には1フレームごとにVelocityをどんどん加算していくわけですが、AgeLoopTOPの見ているピクセルが真っ白になった場合はInstancingの寿命が尽きた、ということで初期位置に戻します。
Velocityはそのまま使うとすごい勢いで移動しているため、VelocityControllerというもので適当に速度を落としています。
4. Instancing Objectが時間経過で消えるように、AgeLoopTOPからScaleを作る
これだとInstancingしたObjectの消え方もちょっと工夫したいので、AgeLoopTopをLevel TOPを使ってポジネガ反転させます。
こうすると発生したての若いObjectはRGB値が1に近く、逆に年老いたObjectは0に近い値になるTOPができあがります。
これをScaleに入力することで発生時は大きいが、だんだん小さくなり、寿命が尽きると同時に消えて無くなってしまうObjectになります。
5. GPU Instancingを行う
出来あがた3つのTOPをTOPtoInstancingPhongに入力します。今回ColorはPosCalculatorの値をそのまま利用しています。
6.動きをカスタムしたければ・・・
基本的exampleはこれで以上です。もっとランダムな動きをさせたい場合はnull_rotate TOPのあとにAddを設定したComposite TOPとNoise TOPを置いて見てください。
GPU Instancingの場合はほぼ全て画像で計算を行うため、TOP系の処理をInsertすることで値を任意の値で任意のタイミングで動きや向き、サイズやスケールを変化させることが可能です。
まとめ
いかがでしょうか。
『GPUの恩恵は受けたいけどGLSLは書きたくない!』という方はぜひさわってみてください。