1. はじめに
エンジニアの大場です。
昨日 2025/06/06にExperimentalでTouchDesigner 2025.30060がリリースされました。
普段は主にUnityを使って業務を行っていますが、追加されたPOPsを触ってみました。
今までTouchDesignerでパーティクルを制作してきたPOPs入門者向け、またUnity VFX Graphの経験者に向けても説明した記事になります。
制作するパーティクルはライティングされた3Dパーティクルです。

2. POPsとは
POPs(Point Operators)は、TouchDesignerに新しく追加されたオペレータファミリーで、GPUで ポイント、ポリゴン、ポイント クラウド、パーティクル、ライン ストリップ、および 3D のあらゆるものなど、3D データを操作を行うためのもの。
リンク
- https://derivative.ca/community-post/pops-new-operator-family-touchdesigner/69468
- https://touchdesigner.notion.site/Learning-About-POPs-3f7645a368a043f99cd143e2382b8ab0
3. Unity VFX Graphでのパーティクル制作 (※TouchDesignerのみの方は飛ばしてOK)
同じパーティクル表現をVFX Graphで作成します。

1. Spawn, Initialize
Capacityは10万、SpawnRateは1万に設定。

2. Update
Turbulenceで動きを加える。

3. Output
Lit MeshでCubeを出力。

Colorの設定はノードのみ公開し説明は割愛します。

このようにUnity VFX Graphでは15分もあれば作成できる。
上記の設定だとFPS60を下回ることはなかった。
Capacityを100万にし、SpawRateを10万すると生存しているパーティクル数は約50万でFPS30まで下がった。
4. TouchDesigner POPsでのパーティクル制作
1. Spawn, Initialize
PointGeneratorPOPでランダムにポイントを生成

AttributePOPでPointScale(パーティクルのサイズで使用)とRot(パーティクルの角度で使用)とDummyを追加。
これはParticlePOPに入っていないアトリビュートなので初めに追加する。

2. Update
ParticlePOPでMaximum Particles=10万とBirth Rate=1万を設定。
Life Expect=5s Life Variance=1に設定。
パーティクルの寿命=Life Expect ± Life Varianceとなり今回は寿命は4 ~ 6sのランダムになる。
Life ExpectはVFX Graphに置き換えるとLifeTime。
ParticlePOPはTarget Particle Update POPに指定したPOPとの間でFeedback Loopをする。
VFX Graphで置き換えるとUpdateコンテキストの役割。
AttributeのIn Attributeから先ほど追加したPointScale, Rot, Dummyを追加しアトリビュートを継承させる。


NoisePOPでノイズアトリビュートを追加する。
NoiseのLookup AttributeはP(ポジション)を参照する。

またNoisePOPでポジションにNoiseを加えたくないのでOutのCombine Attribute ScopeをDummyに設定することで回避する。
NoiseCurlのアトリビュートを追加する。

MathMixPOPでPartAgeOverLifeSpanを作成。
これは0 ~ 1で正規化された値。VFX GraphでいうAgeOverLifetimeの役割。
ここでNoisePOPのNoiseCurlをPに加算することでパーティクルの位置がノイズによって動く。
(※先ほどNoisePOPでDummyに設定したのはMathMixPOPで計算したほうが計算の自由度がきくため)
また余談ですがPartForceとPartVelというアトリビュートがあり、今回はNoiseCurlをPに加算したがPartForceにPartForceを加算することでもパーティクルに動きを加えることができる。
(※PartForceとPartVelはVFX GraphのForceとVeolcityの関係と同じで、Forceを加えるとVelocityにも影響がある)

LookupTexturePOPでパーティクルに色を適応する。
またPartAgeOverLifeSpanを利用してPointScaleをRamp(グラデーション)によって変化させる。
VFX Graphで置き換えるとSample GradientのTimeにAgeOverLifetimeをつなげて色をパーティクルSizeに適応した状態。



3. Output
CopyPOPで各ポイントにBoxPOPを複製。
従来のGeometory COMPのGPU Instancingと似たような感覚。
TempleteでTranslate, Rotate, Scaleを対応したアトリビュートを参照させる。
Templete Attributeで使用したいColorアトリビュートを継承させる。


Geometory COMPで描画する。
あとは従来のSOPと同様に描画処理をすれば終了。

Maximum Particles=10万とBirth Rate=1万だとFPS60は下回らなかった。
Maximum Particles=100万とBirth Rate=10万だと15FPSになりUnityより低くなった。
これはライティングやシャドウなども影響あるのでVFX GraphのがPOPsより優れていると結論付けることはできない。
5. まとめ
従来のTouchDesignerではパーティクルを作るのにも自力でパーティクルのLifetime(寿命)やAge(年齢)をTOPなどで作る必要があった。
しかしPOPsを使えばそれらがすでに機能として用意されている。
またUnity VFX Graph経験者であれば名称が違うだけで似たような機能が多く簡単に制作できる。
今後POPsに関するチュートリアルやブログが増え、学習環境がより充実していく一助となればと思い、この記事を執筆しました。