
概要 📖 – GPU コンピュートシェーダでカスタム POP を実装
GLSL POPは、GLSL Compute Shader を読み込み、入力 POP の属性に対し GPU 並列でカスタム演算を行って属性バッファを出力する POPです。Compute Shader パラメータにシェーダコードを書いた DAT を指定すると、毎クック GPU 上で並列ディスパッチが行われ、宣言した Output Attributes に演算結果が書き込まれます。
主な用途 🎯
- GPU 並列演算でのポイント / 頂点 / プリミティブ属性処理を独自 Compute Shader として実装
- 大規模点群 (数十万〜数百万点) のフレームごとの位置・速度・寿命更新をネイティブ GPU 速度で実行
- カスタム属性の生成・書き込み (Output Attributes で任意名の
vec/float/int属性を確保) - Multi-pass シェーダパイプラインの構築 (
Passes+Copy Previous Pass Output to Inputで前パス出力を次パス入力に渡す) - ハードウェアレイトレーシング (Collisions Page の Acceleration Structure を介した GPU 衝突判定 / ray query)
データフロー 🔄
入力: 入力 POP (connected +In POPs参照)
↓
Compute Shader DAT (ユーザ定義の GLSL カーネル)
↓
GPU 並列ディスパッチ (Work Group Size×Dispatch Size)
↓
出力:Output Attributesに確保した属性バッファ
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
GLSL Page 📋
Compute Shader 指定 📜
Compute Shader .computedat 📜
– 実行する Compute Shader を保持する DAT への参照
– Text DAT / GLSL DAT 等を Drag & Drop するか、パスを直接入力
– 指定 DAT の内容がそのまま GLSL カーネルとしてコンパイル・ディスパッチされる
Attribute Class .attrclass 🏷️
POP が操作する属性クラスを決定
| 項目 | 内部名 | 説明 |
|---|---|---|
| Point | .point |
ポイント属性 (P / v / life 等点単位の属性) を対象に並列処理 |
| Vertex | .vertex |
頂点属性 (プリミティブを構成する各頂点の uv / Cd 等) を対象に並列処理 |
| Primitive | .primitive |
プリミティブ属性 (面 / カーブ単位のメタ属性) を対象に並列処理 |
スレッド数 / ディスパッチサイズ 🧵
Number of Threads .numthreadsmode 🔢
– カスタム Compute Shader ディスパッチ時のスレッド数の決定方式を選択するメニュー
– 入力 POP の要素数から自動算出するか、手動で Number of Elements や Dispatch Size を指定するかを切替
Threads Input .threadsinput 🎯
– スレッド数を取得する入力インデックスを指定
– Number of Threads を入力 POP の要素数に連動させる場合の参照入力
Number of Elements .numelems 📐
– 手動でスレッドが処理する要素数を指定する整数パラメータ
– Number of Threads モードによって有効 / 無効が切り替わる
POP .numelemspop 🔗
– 要素数を属性経由で決定する場合に参照する POP のパス
– その POP の属性クラスから要素数を抽出してスレッド数に反映
Num Elements Attrib .numelemsclass 🏷️
– POP 参照と組み合わせて、要素数を取得する属性クラスを指定するメニュー
– 点 / 頂点 / プリミティブの要素数のうちどれをスレッド数源とするかを選択
Work Group Size .workgroupsize 📦
– 手動スレッド数モード時の Compute Shader の Work Group サイズを 3 次元 (x, y, z) で指定
– シェーダ内の layout(local_size_x=..., local_size_y=..., local_size_z=...) 宣言と整合させる必要がある
Dispatch Size .dispatchsize 🚀
– 各次元で起動するスレッドグループ数を 3 次元 (x, y, z) で指定
– 総スレッド数 = Dispatch Size × Work Group Size となるよう計算
出力属性とパス制御 📤
Output Attributes .outputattrs 📤
– シェーダ内で書き込み可能として確保する属性名のリスト
– 新規属性も既存属性も指定可。指定属性のみが書き込みバッファとして allocate される
Output Access .outputaccess 🔒
– 出力属性バッファに対してシェーダから読み出しのみを許可するか、読み書き両方を許可するかを切替
– 読み書き両方にすると 1 ディスパッチ内で前回パスの値も参照可能
Initialize Output Attributes .initoutputattrs 🧹
– 既存属性は入力属性の値をコピー、新規属性はデフォルト値で初期化
– メイン Compute Shader ディスパッチの直前に別の初期化用 Compute Shader ディスパッチが走る
Copy Previous Pass Output to Input .prevpassoutput ♻️
– 前パスの出力を次パスの入力としてコピーする多段シェーダパイプライン用フラグ
– Passes > 1 の場合にパス間で属性値を受け渡す際に有効化
Passes .npasses 🔄
– 同じ Compute Shader を何回連続でディスパッチするかを指定する整数
– 反復ソルバや multi-iteration smoothing 等に使用
入力 POP / 補助機能 🔌
Input .input 📥
– POP の入力を管理する Sequential Parameter Block の起点
– 接続線で繋がれた入力 POP 群を本ブロックの各エントリで参照
In POPs .input0pops ➕
– 接続線で繋がれた POP に加えて、追加の入力 POP をパス参照で指定するパラメータ
– シェーダ内から名前付きの追加入力として参照可能
TDSimplexNoise() .simplexnoise 🌊
– シェーダ内で呼び出せる Simplex Noise 関数の実装を選択するメニュー
– TouchDesigner 提供のヘルパー TDSimplexNoise() の実装バリエーション (品質 / 速度のトレードオフ) を切替
Create Attributes Page 🏗️
New Attribute (新規属性の宣言) ✨
New Attribute .attr 🆕
– 新規属性を宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / Type / Array / Array Size / Value のサブパラメータが並ぶ
New Attribute Name .attr0name 🔤
– 作成する属性の名前を選択 (事前定義属性 or カスタム名)
– P / N / Cd 等の予約属性または任意の新規名
New Attribute Type .attr0type 🏷️
– 属性の型を決定 (float / vec2 / vec3 / vec4 / int 等)
– シェーダ内での読み書き型と整合させる
Array .attr0isarray 📊
– 属性を配列として扱うかどうかのフラグ
– 例: 5 個の vec3 を保持したい場合は配列フラグをオンにしてサイズ 5 を指定
Array Size .attr0arraysize 📏
– 配列属性の要素数を整数で指定
– Array フラグがオンの場合のみ有効
Value .attr0value 🔢
– 属性の初期値を指定
– Initialize Output Attributes がオンのときに新規属性の初期化に使用される
Matrix Attribute (行列属性の宣言) 🧮
Matrix Attribute .matattr 🆕
– 行列型の新規属性を宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / Rows / Columns / Array / Array Size / Qualifier が並ぶ
Custom Matrix Name .matattr0name 🔤
– 行列属性のカスタム名を指定
– シェーダ内ではこの名前で mat2 / mat3 / mat4 として参照
Rows .matattr0numrows 📐
– 行列の行数を整数で指定 (2 / 3 / 4)
– GLSL の matNxM 型に対応
Columns .matattr0numcols 📏
– 行列の列数を整数で指定 (2 / 3 / 4)
– GLSL の matNxM 型に対応
Array .matattr0isarray 📊
– 行列属性を配列として扱うかどうかのフラグ
– 例: 5 個の mat4 を保持したい場合は配列フラグをオン
Array Size .matattr0arraysize 📏
– 行列配列の要素数を整数で指定
– 配列フラグがオンのときのみ有効
Qualifier .matattr0qualifier 🔧
– 属性の解釈に関する追加情報 (例: ベクトル / 法線 / 色 等の qualifier) を指定するメニュー
– シェーダ間で意味付けを統一する目的
Colors Page 🎨
色 uniform 宣言 🎨
Pre-Multiply RGB by Alpha .premultcolor ✖️
– シェーダに渡す前に RGB をアルファで pre-multiply するかどうかのフラグ
– 透過合成計算で straight alpha と pre-multiplied alpha を切り替える
Color .color 🆕
– 色 uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / RGB / Alpha が並ぶ
Name .color0name 🔤
– 色 uniform の名前を指定 (シェーダ内で uniform vec4 <name> として参照)
RGB .color0rgb 🌈
– 色 uniform の RGB 値を指定するカラーピッカー
Alpha .color0alpha 🌫️
– 色 uniform のアルファ値を 0–1 で指定
Vectors Page ➡️
ベクトル uniform 宣言 ➡️
Vector .vec 🆕
– ベクトル uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / Type / Value が並ぶ
Name .vec0name 🔤
– ベクトル uniform の名前を指定 (シェーダ内で uniform vec<N> <name> として参照)
Type .vec0type 🏷️
– ベクトルの成分数 (vec2 / vec3 / vec4) を指定するメニュー
Value .vec0value 🔢
– ベクトル uniform の各成分値を入力
Samplers Page 🖼️
テクスチャ Sampler 宣言 🖼️
Sampler .sampler 🆕
– シェーダから読み込む Sampler uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / TOP / Extend U/V/W / Filter が並ぶ
Name .sampler0name 🔤
– Sampler uniform の名前を指定 (シェーダ内で uniform sampler2D <name> 等として参照)
TOP .sampler0top 🔗
– サンプリング対象とする TOP のパスを指定
– 指定した TOP のテクスチャがシェーダ内で読み出し可能になる
Extend U .sampler0extendu ↔️
– U 方向のテクスチャ座標が [0, 1] 範囲外のときの振る舞いを選択するメニュー
– 範囲外サンプリング時の値を制御 (反復 / 鏡像 / 端ホールド / ゼロ等)
Extend V .sampler0extendv ↕️
– V 方向のテクスチャ座標が [0, 1] 範囲外のときの振る舞いを選択するメニュー
Extend W .sampler0extendw 🔀
– W 方向 (3D テクスチャ等) のテクスチャ座標が範囲外のときの振る舞いを選択するメニュー
Filter .sampler0filter 🎚️
– TOP 入力画像に適用するピクセルフィルタを選択するメニュー (Nearest / Linear / Mipmap 等)
Arrays Page 📚
配列 uniform 宣言 📚
Array .array 🆕
– 配列 uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / Type / CHOP / Array Type が並ぶ
Name .array0name 🔤
– 配列 uniform の名前を指定
Type .array0type 🏷️
– 配列の各要素の成分数を選択するメニュー (float / vec2 / vec3 / vec4 相当)
CHOP .array0chop 🔗
– 配列ソースとして使用する CHOP のパスを指定
– CHOP のチャンネルがそのまま配列要素として読み込まれる
Array Type .array0arraytype 📦
– uniform 配列として渡すか、サンプラ経由で渡すかを切り替えるメニュー
– 巨大配列は uniform より sampler 経由のほうが GPU 上の取扱いが効率的
Matrices Page 🧮
行列 uniform 宣言 🧮
Matrix .matrix 🆕
– 行列 uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / Matrix が並ぶ
Name .matrix0name 🔤
– 行列 uniform の名前を指定 (シェーダ内で uniform mat4 <name> 等として参照)
Matrix .matrix0value 🔢
– シェーダに渡す行列値を保持するオブジェクトへの参照
– Object COMP の Transform 等から行列を取得して uniform として供給可能
Temp Buffers Page 🧰
Temp Buffer 宣言 🧰
Temp Buffer .tempbuffer 🆕
– シェーダに uniform として情報を渡すための一時バッファを宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / Initial Value が並ぶ
Name .tempbuffer0name 🔤
– 一時バッファの名前を指定
Initial Value .tempbuffer0initval 🔢
– 一時バッファの初期値を指定
– パス間で値を保持・受け渡しする際の初期状態として使用
Constants Page 🔒
Specialization Constants 🔒
Constant .const 🆕
– Specialization Constants を宣言する Sequential Parameter Block の起点
– コンパイル時定数としてシェーダに渡すことで最適化が効く
Name .const0name 🔤
– Specialization Constant の名前を指定
Value .const0value 🔢
– Specialization Constant の値を指定
– 変更時はシェーダが再コンパイルされる点に注意
Collisions Page 💥
Acceleration Structure (レイトレ衝突) 💥
Name .asname 🔤
– シェーダ内で参照する Acceleration Structure uniform の名前を指定
Collision POP .colpop 🎯
– ハードウェアレイトレーシング用の Acceleration Structure を構築する元となる POP のパスを指定
– 指定 POP のジオメトリから ray query 用構造が生成される
Build Flag .buildflag 🏗️
– Acceleration Structure を構築する際に、ビルド時間優先かトレース時間優先かを選択するメニュー
– 動的に変形する衝突ジオメトリと静的なジオメトリで使い分け
Opaque Collision Geometry .opaquecolgeo 🚪
– 衝突ジオメトリを完全不透明として扱うかどうかのフラグ
– オンにすると最も近いヒットのみ返され、シェーダ側のヒット判定が高速化される
Common Page 🔧
Bypass .bypass 🚫
POP の処理をスキップして入力をパススルーする設定:
- オン: 最初の入力 (input1) をそのまま出力にパススルー、POP 内部の処理を無効化
- 用途: デバッグ時に特定 POP の効果を一時的に外して比較する際に使用
Free Extra GPU Memory .freeextragpumem 🧠
蓄積した GPU メモリの解放:
- Free Extra GPU Memory パルス: 出力ポイント数が増減を繰り返した際に確保されたままの GPU メモリを明示的に解放するパルスパラメータ
- 用途: 大規模パーティクル系で出力サイズが大きく変動した後、未使用メモリを返却して VRAM を節約
Delete Input Attributes .delinputattrs 🗑️
出力属性の絞り込みパターン:
- Delete Input Attributes パターン: 出力に残したい属性名のパターン (例:
P N Cd) を指定。指定外の属性は破棄される - 用途: 下流で不要な属性を切り落として分岐ブランチを軽量化、メモリ・帯域を節約
実践アイデア 💡
Example 1: GPU パーティクルソルバ (位置・速度の並列更新) ✨
Sphere POP (seed) → GLSL POP (Compute Shader = particle_step.glsl, Attribute Class=Point) → Particle POP → Render TOP
Sphere POP で初期点群 (seed) を生成し、GLSL POP の Compute Shader 内で各点の位置 P と速度 v をフレームごとに GPU 並列で更新する基本的なパーティクルソルバ構成。Output Attributes に P v を指定して書き込みバッファを確保する。
- Sphere POP / Box POP 等で初期点群を生成し GLSL POP の入力に接続
- Text DAT に Compute Shader を記述し
Compute Shaderパラメータで参照 Attribute ClassをPoint、Output AttributesにP vを指定Copy Previous Pass Output to Input+Passesで前フレーム出力を次フレーム入力としてフィードバック- 後段の Particle POP / Render TOP でビジュアライズ
Example 2: Multi-pass スムージング (反復ソルバ) 🔄
In POP → GLSL POP (Compute Shader = smooth.glsl, Passes=8, prevpassoutput=on) → Out POP
ポイント属性に対し同じ Compute Shader を Passes 回連続実行する multi-pass パターン。Copy Previous Pass Output to Input をオンにすると前パスの出力が次パスの入力としてコピーされ、Laplacian smoothing や反復ソルバを 1 つの GLSL POP 内で完結できる。
- Compute Shader に 1 パス分のスムージング処理を記述
Passesを反復回数 (例: 8) に設定Copy Previous Pass Output to Inputをオンにしてパス間で属性をフィードバックOutput Attributesに対象属性 (P等) を指定し allocate- Out POP で結果を取り出し下流に渡す
Example 3: TOP テクスチャ参照によるノイズ駆動の点群変形 🖼️
Box POP → GLSL POP (Sampler = noise_top, Compute Shader = displace.glsl) → Render TOP
GLSL POP の Samplers Page で Noise TOP 等を Sampler uniform として登録し、Compute Shader 内で各点の UV / 位置に応じてテクスチャをサンプリングしてオフセットを与える例。テクスチャベースの displacement を点群に対して GPU 並列で適用できる。
- Box POP / Grid POP で点群を生成し GLSL POP の入力に接続
- Noise TOP / Movie File In TOP 等をテクスチャソースとして用意
- Samplers Page で新規 Sampler エントリを追加し
TOPパラメータにテクスチャソースを指定 - Compute Shader 内で
texture(<sampler_name>, uv)で値を取得しPにオフセット適用 Output AttributesにPを指定して書き込みバッファを確保
関連オペレータ 🔗
類似機能OP 🔍
- CPlusPlus POP — CPU 側 C++ プラグインで POP を実装する版。GPU 並列処理は GLSL / CPU 重処理は CPlusPlus という棲み分け
- GLSL TOP — TOP family の GLSL シェーダ版。ピクセル単位の GPU 並列処理
- GLSL MAT — マテリアル用の GLSL シェーダ。レンダリング時の頂点 / フラグメント処理
組み合わせ推奨OP 🔄
- Transform POP — シェーダ出力の点群を後段で座標変換 / 正規化
- Particle POP — シェーダで更新した位置・速度属性を後段の標準パーティクル系に流す
- Convert POP — GLSL 出力点群を SOP / メッシュへ変換
- Render TOP — シェーダ出力のジオメトリを 3D ビューに描画
- Info CHOP — シェーダ出力 POP の
num_points/cook_time等で性能をモニタ
前処理・後処理POP 🎯
Info CHOP情報 📊
GLSL POP は Info CHOP による詳細情報取得に対応しています。
POP固有情報 ✨
num_verts: POP に含まれる頂点 (vertex) 数num_points: POP に含まれるポイント数num_prims: POP に含まれるプリミティブ数
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号cook_abs_frame: 最後にクックされた絶対フレーム番号 (アプリケーション起動からの累積)cook_start_time: 最後のクック開始時刻 (ミリ秒)cook_end_time: 最後のクック終了時刻 (ミリ秒)cooked_this_frame: 現フレームでクックされたか (0 / 1)warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: シェーダがコンパイルエラーで動かない
✅ Solution:
- Compute Shader DAT のテキストを確認し、
#version宣言とlayout(local_size_x=..., local_size_y=..., local_size_z=...)の有無を確認 - Info CHOP で
errors/warningsを監視し、Compute Shader ノードの右クリックメニューからシェーダログを表示 Work Group Sizeパラメータとシェーダ内layout宣言の値が一致しているか確認
❌ Problem: Output Attributes に書き込んでも値が変わらない
✅ Solution:
Output Attributesに書き込み対象属性が明示的に登録されているか確認 (未登録だとバッファ自体が allocate されない)Output Accessが読み取り専用になっていないか確認 (書き込みには Read and Write が必要)Initialize Output Attributes設定によって毎パス値が初期化されていないか確認
❌ Problem: 出力ポイント数が想定と違う / 0 になる
✅ Solution:
Number of ThreadsモードとNumber of Elements/Dispatch Size/Work Group Sizeの組合せで総スレッド数を再計算- Info CHOP で
num_pointsを確認し、シェーダディスパッチが想定どおりの要素数で走っているか検証 Attribute Classが点 / 頂点 / プリミティブの目的に合っているか確認
❌ Problem: パフォーマンスが期待より低い
✅ Solution:
Work Group Sizeを GPU が効率的に処理できるサイズ (合計 64〜256 程度) に調整Common PageのDelete Input Attributesで下流に不要な属性を切り落として GPU 帯域を節約- 頻繁に値が変わらない値は
Specialization Constants(Constants Page) としてシェーダに埋め込むとコンパイル時最適化が効く
参考資料 📚
その他 🔗
- TouchDesigner Wiki — POP 概要
- TouchDesigner Wiki — Category:POPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

