TouchDesigner

TouchDesignerでGLSLを書かずにGPU Instancingしてみる

TouchDesginerでGPUを使ったParticle Systemを作れるContainer群『PixelStorm』を公開しました。
スクリーンショット 2018-01-31 0.49.31のコピー.png

今回はこの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、というか移動方向とオブジェクトの回転方向に利用します。
001.png

2. AgeLoopTOPでInstancing Objectに寿命をつける

Instancing Objectは一定時間で初期位置かたまた生まれるようにしたいので、AgeLoopTOPで寿命のループを作るTOPを作成します。
002.png

3. POSCalculatorでInstancing Objectの現在座標を計算する

PosCalculator Containerを使って現在座標を計算させます。
初期位置はVertex座標、そしてVelocityが1フレームごとの移動量となります。
基本的には1フレームごとにVelocityをどんどん加算していくわけですが、AgeLoopTOPの見ているピクセルが真っ白になった場合はInstancingの寿命が尽きた、ということで初期位置に戻します。
Velocityはそのまま使うとすごい勢いで移動しているため、VelocityControllerというもので適当に速度を落としています。
003.png

4. Instancing Objectが時間経過で消えるように、AgeLoopTOPからScaleを作る

これだとInstancingしたObjectの消え方もちょっと工夫したいので、AgeLoopTopをLevel TOPを使ってポジネガ反転させます。
こうすると発生したての若いObjectはRGB値が1に近く、逆に年老いたObjectは0に近い値になるTOPができあがります。
これをScaleに入力することで発生時は大きいが、だんだん小さくなり、寿命が尽きると同時に消えて無くなってしまうObjectになります。
004.png

5. GPU Instancingを行う

出来あがた3つのTOPをTOPtoInstancingPhongに入力します。今回ColorはPosCalculatorの値をそのまま利用しています。
005.png

6.動きをカスタムしたければ・・・

基本的exampleはこれで以上です。もっとランダムな動きをさせたい場合はnull_rotate TOPのあとにAddを設定したComposite TOPとNoise TOPを置いて見てください。
GPU Instancingの場合はほぼ全て画像で計算を行うため、TOP系の処理をInsertすることで値を任意の値で任意のタイミングで動きや向き、サイズやスケールを変化させることが可能です。

まとめ

いかがでしょうか。
『GPUの恩恵は受けたいけどGLSLは書きたくない!』という方はぜひさわってみてください。