GLSL Copy POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

※当サイトにはプロモーションリンクが含まれます。

GLSL Copy POP のシェーダ複製・並列変形機能を示す図

記事更新の通知はXでアナウンス٩(๑❛ᴗ❛๑)
@maru6o6をフォロー

概要 📖 – 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

Tips

初心者の方は、以下日本語書籍も手元にあると安心です。

まる。
まる。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!


パラメータ解説 ⚙️

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 にコピーごとのオフセットを与えて格子状に並べる構成。

  1. Box POP / Sphere POP 等で元ジオメトリを生成し GLSL Copy POP の入力に接続
  2. Number of Copies を必要なコピー数 (例: 64) に設定
  3. Text DAT に Points Compute Shader を記述し Points Compute Shader パラメータで参照
  4. Point Output AttributesP を指定して書き込みバッファを確保
  5. 後段の 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 に流して挙動を追加する。

  1. Sphere POP 等で 1 セットの基準点群を生成
  2. Number of Copies を 10000 に設定
  3. Points Compute Shader で各コピーの P / v をシード値 + ノイズで分散配置
  4. Point Output AttributesP v を、Vert Output AttributesCd を指定
  5. 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 にディスプレースメントを適用する。

  1. Grid POP / Box POP で点群を生成し GLSL Copy POP の入力に接続
  2. Noise TOP / Movie File In TOP 等をテクスチャソースとして用意
  3. Samplers Page で新規 Sampler エントリを追加し TOP パラメータにテクスチャを指定
  4. Points Compute Shader 内で texture(<sampler_name>, uv) で値を取得し P にオフセット適用
  5. 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 🎯


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 CHOPerrors / 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 PageDelete Input Attributes で下流に不要な属性を切り落として帯域を節約
  • 頻繁に値が変わらない値は Constants Page の Specialization Constants としてシェーダに埋め込むとコンパイル時最適化が効く

❌ Problem: 出力ポイント数が想定と違う
✅ Solution:

  • Info CHOPnum_points を確認し、入力点数 × Number of Copies と一致しているか検証
  • Append Dimension 設定によって余分な次元が付与されていないか確認
  • 前段 POP の出力点数が想定どおりか上流から順に確認

参考資料 📚

その他 🔗

公式リソース 📖

この記事はLLMと共に内容を執筆、更新しています。
最新バージョンとの項目差異など、情報の不一致を見つけた心優しい方はXもしくはInsta、メールなどよりサイト管理者までご連絡ください😎


まる。

お仕事のご依頼はDM又はメールにて。
━━━━━━━━━━━━━━━━━
Python/Touchdesigner/M5Stackをこよなく愛すフルスタックエンジニア。
専門は生理心理学、趣味はヨガやサウナ、EMS電気風呂などヘルスケア全般。
脳波や筋電、心拍を中心とした生体情報のセンシング&インタラクティブアートづくりがライフワーク。

普段はワントゥーテンという会社で空間演出エンジニアをしています。
リファラル採用お繋ぎできますので、我こそはという尖った方は経歴と希望職種添えてDMください(エンジニア以外、営業職等もOK)。
ご飯行きましょう。

↓日常垢
Instagram:@malmal0v0

まる。をフォローする
その他の記事はこちら
Math Combine POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED Select TOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Window COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Widget COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

タイトルとURLをコピーしました