
概要 📖 – GLSLで複製と並列加工
GLSL Copy POPは、入力ジオメトリを Number of Copies の回数だけ複製し、各コピーの点・頂点・プリミティブ属性を GLSL コンピュートシェーダで GPU 並列に変形させる POPです。Number of Copies で複製回数を、Points / Verts / Prim Compute Shader に各属性クラス用のシェーダ DAT を指定すると、毎クック GPU 上で並列ディスパッチが行われ、宣言した Output Attributes に演算結果が書き込まれます。
主な用途 🎯
- 入力ジオメトリの GPU 並列複製と変形 (
Number of Copiesで N コピー生成し、各コピーをシェーダで個別変形) - コピー単位の差分演算 (各コピーに異なるオフセット・回転・スケールを
gl_GlobalInvocationID等から算出) - 点・頂点・プリミティブの 3 階層を独立カーネルで処理 (
Points Compute Shader/Verts Compute Shader/Prim Compute Shaderを個別に指定) - 大量インスタンス点群の動的変形 (数千〜数十万コピーをフレームごとに GPU 並列で更新)
- 外部データ駆動の複製変形 (
Samplers/Arrays/POP Buffersでテクスチャ・CHOP・他 POP の値をシェーダ uniform として取り込み)
データフロー 🔄
入力: 入力 POP (1 つ)
↓
Number of Copies (N) で複製
↓
Points / Verts / Prim Compute Shader (DAT) で各コピーの属性を GPU 並列計算
↓
出力: N コピー分の変形済み POP
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
GLSL Page 📋
コピー数 🔢
Number of Copies .ncy 🔢
– Number of Copies (コピー数) — 入力 POP を何回複製するかを指定する整数パラメータ
– コピーごとに異なる変形を Compute Shader 内で gl_GlobalInvocationID 等から算出可能
Points Compute Shader (点単位の処理) 📜
Points Compute Shader .ptcomputedat 📜
– Points Compute Shader (点単位シェーダ) — 点 (point) 単位で並列実行する GLSL Compute Shader を保持する DAT への参照
– Text DAT / GLSL DAT 等を指定すると、その中身が点属性カーネルとしてコンパイル・ディスパッチされる
Point Output Attributes .ptoutputattrs 📤
– Point Output Attributes (点出力属性) — Points Compute Shader が書き込み対象とする点属性名のリスト
– * 1 個でも個別の属性名でも指定可。指定属性のみが書き込みバッファとして allocate される
Verts Compute Shader (頂点単位の処理) 🔺
Verts Compute Method .vertcomputemethod 🎛️
– Verts Compute Method (頂点処理方式) — 頂点 (vertex) 単位 Compute Shader の処理方式を選択するメニュー
– デフォルトでは標準ディスパッチ方式 (Default) が使用される
Verts Compute Shader .vertcomputedat 📜
– Verts Compute Shader (頂点単位シェーダ) — 頂点単位で並列実行する Compute Shader を保持する DAT への参照
– プリミティブを構成する各頂点の uv / Cd 等を書き換える用途
Vert Output Attributes .vertoutputattrs 📤
– Vert Output Attributes (頂点出力属性) — Verts Compute Shader の書き込み対象頂点属性名のリスト
– 未指定の属性は書き込みバッファが allocate されず、シェーダから書いても無視される
Prim Compute Shader (プリミティブ単位の処理) 🟦
Prim Compute Method .primcomputemethod 🎛️
– Prim Compute Method (プリミティブ処理方式) — プリミティブ (primitive) 単位 Compute Shader の処理方式を選択するメニュー
– デフォルトでは標準ディスパッチ方式 (Default) が使用される
Prim Compute Shader .primcomputedat 📜
– Prim Compute Shader (プリミティブ単位シェーダ) — プリミティブ単位で並列実行する Compute Shader を保持する DAT への参照
– 面 / カーブ単位のメタ属性を書き換える用途
Prim Output Attributes .primoutputattrs 📤
– Prim Output Attributes (プリミティブ出力属性) — Prim Compute Shader の書き込み対象プリミティブ属性名のリスト
– * またはカンマ区切りで個別指定
Append Dimension .dimension 📐
出力に余分な次元を追加するかどうか
| 項目 | 内部名 | 説明 |
|---|---|---|
| When Template Points / Copies > 1 | .morethanone |
テンプレート点数またはコピー数が 1 を超えるときのみ次元を追加 |
| Always | .always |
コピー数に関係なく常に追加次元を付与 |
TDSimplexNoise() 実装 .simplexnoise 🌊
シェーダ内で呼び出せる Simplex Noise の実装バリエーション
| 項目 | 内部名 | 説明 |
|---|---|---|
| Performance | .performance |
速度優先実装 (低コスト・品質はやや低め) |
| Quality | .quality |
品質優先実装 (高コスト・滑らかなノイズ) |
Create Attributes Page 🏗️
New Attribute (新規属性の宣言) ✨
New Attribute .attr 🆕
– New Attribute (新規属性) — 新規属性を宣言する Sequential Parameter Block の起点
– 1 エントリごとに Class / Name / Type / Array / Array Size のサブパラメータが並ぶ
New Attribute Class .attr0class 🏷️
– New Attribute Class (属性クラス) — 新規属性を作成する対象クラスを決定するメニュー
– 点 (Point) / 頂点 (Vertex) / プリミティブ (Primitive) のどれに属性を作るかを選択
New Attribute Name .attr0name 🔤
– New Attribute Name (属性名) — 事前定義属性かカスタム名かを選択するメニュー
– P / N / Cd 等の予約属性または任意の新規名 (Custom Name) を指定
New Attribute Type .attr0type 🏷️
– New Attribute Type (属性型) — 属性の型 (float / vec2 / vec3 / vec4 / int 等) を決定するメニュー
– シェーダ内での読み書き型と整合させる必要あり
Array .attr0isarray 📊
– Array (配列フラグ) — 属性を配列として扱うかどうかのトグル
– 例: 5 個の float3 を保持する場合は配列フラグをオン + サイズ 5
Array Size .attr0arraysize 📏
– Array Size (配列サイズ) — 配列属性の要素数を整数で指定
– Array フラグがオンの場合のみ有効
Matrix Attribute (行列属性の宣言) 🧮
Matrix Attribute .matattr 🆕
– Matrix Attribute (行列属性) — 行列型の新規属性を宣言する Sequential Parameter Block の起点
– 1 エントリごとに Class / Name / Rows / Columns / Array / Array Size / Qualifier が並ぶ
Matrix Attribute Class .matattr0class 🏷️
– Matrix Attribute Class (行列属性クラス) — 行列属性を作成する対象クラス (点 / 頂点 / プリミティブ) を決定するメニュー
Custom Matrix Name .matattr0name 🔤
– Custom Matrix Name (行列名) — 行列属性のカスタム名を指定
– シェーダ内ではこの名前で mat2 / mat3 / mat4 として参照
Rows .matattr0numrows 📐
– Rows (行数) — 行列の行数を整数で指定 (2 / 3 / 4)
– GLSL の matNxM 型に対応
Columns .matattr0numcols 📏
– Columns (列数) — 行列の列数を整数で指定 (2 / 3 / 4)
– GLSL の matNxM 型に対応
Array .matattr0isarray 📊
– Array (配列フラグ) — 行列属性を配列として扱うかどうかのトグル
Array Size .matattr0arraysize 📏
– Array Size (配列サイズ) — 行列配列の要素数を整数で指定 (配列フラグがオンのときのみ有効)
Qualifier (行列属性の qualifier) .matattr0qualifier 🔧
行列属性に意味付け qualifier を付与
| 項目 | 内部名 | 説明 |
|---|---|---|
| None | .none |
意味付けなし (汎用行列として扱う) |
| Transform Matrix | .transformMatrix |
変換行列として解釈 (座標変換適用時に他属性と整合) |
Colors Page 🎨
色 uniform 宣言 🎨
Pre-Multiply RGB by Alpha .premultcolor ✖️
– Pre-Multiply RGB by Alpha (アルファ事前乗算) — シェーダに渡す前に RGB をアルファで pre-multiply するかどうかのトグル
– 透過合成計算で straight alpha と pre-multiplied alpha を切替
Color .color 🆕
– Color (色 uniform) — 色 uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに以下の Name / RGB / Alpha が並ぶ
Name .color0name 🔤
– Name (色 uniform 名) — シェーダ内で参照する色 uniform の変数名を指定
RGB .color0rgb 🌈
– RGB (色値) — RGB 各成分の値を 3 軸で指定
Alpha .color0alpha 💧
– Alpha (アルファ) — 色 uniform のアルファ値
Vectors Page ➡️
ベクトル uniform 宣言 ➡️
Vector .vec 🆕
– Vector (ベクトル uniform) — ベクトル uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに Name / Type / Value が並ぶ
Name .vec0name 🔤
– Name (ベクトル uniform 名) — シェーダ内で参照する変数名を指定
Type .vec0type 🏷️
– Type (型) — ベクトルの成分数 / 型を選択するメニュー
– float / vec2 / vec3 / vec4 / double / dvec2 / dvec3 / dvec4 / int / ivec2 / ivec3 / ivec4 / uint / uvec2 / uvec3 / uvec4 から選択
Value .vec0value 🔢
– Value (値) — ベクトル uniform の各成分値を指定 (x / y / z / w)
Samplers Page 🖼️
Sampler uniform 宣言 🖼️
Sampler .sampler 🆕
– Sampler (テクスチャ uniform) — Sampler uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに Name / TOP / Extend U/V/W / Filter が並ぶ
Name .sampler0name 🔤
– Name (Sampler 名) — シェーダ内で参照する Sampler uniform の変数名
TOP .sampler0top 🔗
– TOP (テクスチャソース) — Sampler のテクスチャ供給元となる TOP のパスを指定
– 指定 TOP のピクセルが texture() 関数経由でシェーダから読み出せる
Extend U .sampler0extendu ↔️
– Extend U (U 方向境界) — UV の U 座標が [0, 1] 範囲外のときのサンプリング挙動を選択するメニュー
– Hold (境界保持) / Zero (ゼロ返し) / Repeat (反復) / Mirror (反射) から選択
Extend V .sampler0extendv ↕️
– Extend V (V 方向境界) — V 座標が範囲外のときのサンプリング挙動を選択するメニュー
– 選択肢は Extend U と同じ (Hold / Zero / Repeat / Mirror)
Extend W .sampler0extendw 🔁
– Extend W (W 方向境界) — 3D テクスチャの W 座標が範囲外のときのサンプリング挙動を選択するメニュー
– 選択肢は Extend U / V と同じ
Filter .sampler0filter 🎚️
– Filter (フィルタ) — テクスチャサンプリング時のピクセル補間方式を選択するメニュー
– Nearest Pixel (最近傍) / Interpolate Pixels (線形補間) から選択
Arrays Page 📚
Array uniform 宣言 📚
Array .array 🆕
– Array (配列 uniform) — 配列 uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに Name / Type / CHOP / Array Type が並ぶ
Name .array0name 🔤
– Name (配列 uniform 名) — シェーダ内で参照する変数名
Type .array0type 🏷️
– Type (要素型) — 配列要素の型を選択するメニュー
– float / vec2 / vec3 / vec4 から選択
CHOP .array0chop 🔗
– CHOP (CHOP ソース) — 配列値の供給元となる CHOP のパスを指定
– CHOP のサンプル値がそのまま配列要素としてシェーダに渡される
Array Type .array0arraytype 📦
– Array Type (配列方式) — 配列 uniform の渡し方を選択するメニュー
– Uniform Array (uniform 配列) / Texture Buffer (テクスチャバッファ) から選択。サイズが大きい場合は Texture Buffer 推奨
Matrices Page 🧮
Matrix uniform 宣言 🧮
Matrix .matrix 🆕
– Matrix (行列 uniform) — 行列 uniform を宣言する Sequential Parameter Block の起点
– 1 エントリごとに Name / Matrix が並ぶ
Name .matrix0name 🔤
– Name (行列 uniform 名) — シェーダ内で参照する変数名
Matrix .matrix0value 📐
– Matrix (行列ソース) — シェーダに渡す行列への参照を指定
– 他オペレータの変換行列 (例: Camera COMP のビュー行列) を uniform として注入
Temp Buffers Page 🗂️
Temporary Buffer 宣言 🗂️
Temp Buffer .tempbuffer 🆕
– Temp Buffer (一時バッファ) — シェーダに uniform として渡す一時バッファを宣言する Sequential Parameter Block の起点
– 1 エントリごとに Name / Initial Value が並ぶ
Name .tempbuffer0name 🔤
– Name (一時バッファ名) — シェーダ内で参照する変数名
Initial Value .tempbuffer0initval 🔢
– Initial Value (初期値) — 一時バッファの初期値を指定
Constants Page 🔣
Specialization Constant 宣言 🔣
Constant .const 🆕
– Constant (Specialization Constant) — Specialization Constants を宣言する Sequential Parameter Block の起点
– コンパイル時定数としてシェーダに埋め込まれるため、定数畳み込み等の最適化が効く
Name .const0name 🔤
– Name (定数名) — シェーダ内で参照する Specialization Constant の名前
Value .const0value 🔢
– Value (定数値) — Specialization Constant の値を指定
– 変更時はシェーダが再コンパイルされる点に注意
POP Buffers Page 🧬
POP 属性バッファ uniform 宣言 🧬
Buffer .buffer 🆕
– Buffer (POP 属性バッファ) — 他 POP の属性をシェーダに uniform として渡すバッファを宣言する Sequential Parameter Block の起点
– 1 エントリごとに POP / Attribute Class / Attribute / Name が並ぶ
POP .buffer0pop 🔗
– POP (参照 POP) — 属性を取り出す POP のパスを指定
Attribute Class .buffer0attrclass 🏷️
– Attribute Class (属性クラス) — 取り出す属性のクラスを選択するメニュー (点 / 頂点 / プリミティブ)
Attribute .buffer0attr 🏷️
– Attribute (属性名) — 取り出す属性の名前を指定 (P / N / Cd 等)
Name .buffer0name 🔤
– Name (シェーダ内変数名) — シェーダ内で参照する POP 属性バッファの変数名
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: コピーごとの並列変形 🔁
Box POP → GLSL Copy POP (Number of Copies=64, Points Compute Shader=offset.glsl) → Render TOP
Box POP の点群を入力とし、Number of Copies を 64 に設定して 64 コピーを生成する基本フロー。Points Compute Shader 内で gl_GlobalInvocationID から各コピーのインデックスを取り出し、それを使って位置 P にコピーごとのオフセットを与えて格子状に並べる構成。
- Box POP / Sphere POP 等で元ジオメトリを生成し GLSL Copy POP の入力に接続
Number of Copiesを必要なコピー数 (例: 64) に設定- Text DAT に Points Compute Shader を記述し
Points Compute Shaderパラメータで参照 Point Output AttributesにPを指定して書き込みバッファを確保- 後段の Particle POP / Convert POP / Render TOP でビジュアライズ
Example 2: 大量複製点群のソルバ ✨
Sphere POP (seed) → GLSL Copy POP (ncy=10000, Points + Verts Compute Shader) → Particle POP → Render TOP
Sphere POP で初期点群を 1 つ用意し、Number of Copies を 10000 に設定して大量インスタンス点群を生成する応用例。Points Compute Shader でコピーごとの位置・速度を、Verts Compute Shader で頂点色 Cd を並列計算し、後段の Particle POP に流して挙動を追加する。
- Sphere POP 等で 1 セットの基準点群を生成
Number of Copiesを 10000 に設定- Points Compute Shader で各コピーの
P/vをシード値 + ノイズで分散配置 Point Output AttributesにP vを、Vert Output AttributesにCdを指定- Particle POP に渡してフォース・寿命を加え、Render TOP でビジュアライズ
Example 3: テクスチャ駆動の変形複製 🖼️
Grid POP → GLSL Copy POP (Sampler=noise_top, Points Compute Shader=displace.glsl, ncy=16) → Convert POP → Render TOP
Grid POP の平面点群を Samplers Page で登録した Noise TOP を参照して変形させる例。Number of Copies を 16 にして 16 枚のレイヤーを生成し、各コピーで異なる UV オフセットでテクスチャをサンプリングして位置 P にディスプレースメントを適用する。
- Grid POP / Box POP で点群を生成し GLSL Copy POP の入力に接続
- Noise TOP / Movie File In TOP 等をテクスチャソースとして用意
- Samplers Page で新規 Sampler エントリを追加し
TOPパラメータにテクスチャを指定 - Points Compute Shader 内で
texture(<sampler_name>, uv)で値を取得しPにオフセット適用 Number of Copiesを 16 に設定し、コピーごとに UV を少しずつずらしてレイヤー化
関連オペレータ 🔗
類似機能OP 🔍
- GLSL POP — 汎用 GLSL Compute Shader POP。Copy 機能を持たず、入力 1 セットに対してシェーダを並列実行
- GLSL Advanced POP — GLSL POP の上位版。ハードウェアレイトレーシング / 多段パス等の高度機能を提供
- GLSL Create POP — 入力なしで GLSL Compute Shader から点群を新規生成する POP
組み合わせ推奨OP 🔄
- Particle POP — シェーダで更新した位置・速度属性を後段の標準パーティクル系に流して挙動を追加
- Transform POP — コピーごとに変形した点群を後段で座標変換 / 正規化
- Convert POP — GLSL Copy 出力点群を SOP / メッシュ形式へ変換し他系統に渡す
- Render TOP — シェーダ出力ジオメトリを 3D ビューに描画
- Info CHOP — 出力 POP の
num_points/cook_time等で性能をモニタ
前処理・後処理POP 🎯
- 前処理: In POP、Box POP、Sphere POP、Grid POP、Line POP
- 後処理: Out POP、Null POP、Cache POP、Merge POP、Convert POP、Transform POP
Info CHOP情報 📊
GLSL Copy 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を監視し、GLSL Copy POP の右クリックメニューからシェーダログを表示 - Points / Verts / Prim Compute Shader のいずれが対象なのかを確認 — 該当しないクラスのシェーダを指定するとディスパッチされない
❌ Problem: Output Attributes に書き込んでも値が変わらない
✅ Solution:
Point Output Attributes/Vert Output Attributes/Prim Output Attributesのうち、書き込み対象クラスに属性が明示登録されているか確認- シェーダ内で書き込んでいる属性名と
Output Attributesの名前が一致しているか確認 (未登録だとバッファが allocate されない) Number of Copiesが 0 になっていないか確認 — 0 だとディスパッチが走らない
❌ Problem: コピー数を増やすと描画が極端に重くなる
✅ Solution:
Number of Copies× 入力点数 = 総点数。総点数が数百万を超える場合は GPU 帯域がボトルネックCommon PageのDelete Input Attributesで下流に不要な属性を切り落として帯域を節約- 頻繁に値が変わらない値は
Constants Pageの Specialization Constants としてシェーダに埋め込むとコンパイル時最適化が効く
❌ Problem: 出力ポイント数が想定と違う
✅ Solution:
- Info CHOP で
num_pointsを確認し、入力点数 ×Number of Copiesと一致しているか検証 Append Dimension設定によって余分な次元が付与されていないか確認- 前段 POP の出力点数が想定どおりか上流から順に確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — POP 概要
- TouchDesigner Wiki — Category:POPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – GLSL Copy POP
- Write a GLSL POP (公式ガイド)
- Points, Vertices and Primitives in POPs

