
概要 📖 – GPU計算で形状を生成
GLSL Create POPは、コンピュートシェーダを実行して三角形・四角形・線・点などのプリミティブをゼロから GPU 上で並列生成する POPです。公式 docs では deprecated (将来削除予定) とされており、新規開発では GLSL Advanced POP (+ 必要に応じ Topology POP) の組み合わせへ移行することが推奨されています。
主な用途 🎯
- コンピュートシェーダによる三角形・四角形・線・点の GPU 並列生成
- 多数のスレッドで大量プリミティブを 1 ディスパッチでまとめて作成 (パーティクル・ボクセル・グリッド生成)
- Vectors / Samplers / Arrays / Matrices / Atomic Counters / Constants 各 Uniform 経由のパラメータ駆動ジオメトリ合成
- サンプラ TOP のテクスチャ値や CHOP 配列を読み取りプリミティブ位置・色・属性を動的計算
- レガシーパイプライン互換維持 (本 POP は deprecated 扱い、新規開発は GLSL Advanced POP + Topology POP へ移行)
データフロー 🔄
入力: コンピュートシェーダ DAT + Uniform 入力 (Vectors / Samplers TOP / Arrays CHOP / Matrices / Constants) + 任意の POP 入力
↓
GPU 並列実行 (各スレッドがプリミティブ単位の頂点座標・属性を計算)
↓
出力: 指定 Primitive Type のジオメトリ群
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
GLSL Page 🎨
Compute Shader .computedat 🧮
実行する GLSL コンピュートシェーダコードを保持する DAT のパス指定:
- Compute Shader:
computedat(コンピュートシェーダ DAT) — GLSL コンピュートシェーダのコードが書かれた Text DAT へのパス。シェーダ内でgl_GlobalInvocationIDをプリミティブ番号として参照し、各スレッドが 1 プリミティブの頂点・属性を計算する役割を担う
Primitive Type .primtype 🔺
生成するプリミティブの種類を選択するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Triangles | .triangle |
三角形プリミティブ (各プリミティブ 3 頂点) |
| Quads | .quads |
四角形プリミティブ (各プリミティブ 4 頂点) |
| Lines | .lines |
線プリミティブ (各プリミティブ 2 頂点) |
| Points | .points |
点プリミティブ (各プリミティブ 1 頂点) |
Max Number of Primitives .maxprims 🔢
出力プリミティブ数の上限指定:
- Max Number of Primitives:
maxprims(最大プリミティブ数) — このパラメータが定める上限までしかプリミティブが生成されない。GPU メモリ事前確保のため必須で、実際の生成数 (Atomic Counter 経由) は通常これ以下に収まるよう設計する
Indirect .indirect ↪️
間接ディスパッチによる可変スレッド数指定:
- Indirect:
indirect(間接ディスパッチ) — オンにすると Dispatch Size を CPU 側ではなく GPU バッファから読み取る間接ディスパッチに切替。事前に GPU 側で計算した可変スレッド数 (例: 前段で計算したパーティクル数) で本 POP を実行可能
Number of Threads .numthreadsmode 🧵
スレッド数の自動設定と手動設定の切替
| 項目 | 内部名 | 説明 |
|---|---|---|
| Auto | .auto |
Max Number of Primitives と GPU 標準ワークグループサイズから自動算出 (推奨デフォルト) |
| Manual | .manual |
Work Group Size (X/Y/Z) と Dispatch Size (X/Y/Z) を手動指定。高度な最適化やマルチディメンション処理で使用 |
Work Group Size .workgroupsize 📏
Manual モード時の 1 ワークグループ内スレッド数 (3 軸):
- Work Group Size X:
workgroupsizex(X 軸スレッド数) — 1 ワークグループ内の X 方向スレッド数。シェーダ側layout(local_size_x=N)と一致させる - Work Group Size Y:
workgroupsizey(Y 軸スレッド数) — 1 ワークグループ内の Y 方向スレッド数 - Work Group Size Z:
workgroupsizez(Z 軸スレッド数) — 1 ワークグループ内の Z 方向スレッド数
Dispatch Size .dispatchsize 📤
Manual モード時のワークグループ起動数 (3 軸):
- Dispatch Size X:
dispatchsizex(X 軸ワークグループ数) — X 方向のワークグループ起動数。総スレッド数は Work Group Size × Dispatch Size の積 - Dispatch Size Y:
dispatchsizey(Y 軸ワークグループ数) — Y 方向のワークグループ起動数 - Dispatch Size Z:
dispatchsizez(Z 軸ワークグループ数) — Z 方向のワークグループ起動数
POPs .pops 🧩
シェーダから参照する追加入力 POP のパス指定:
- POPs:
pops(入力 POP パス) — シェーダ内から属性バッファとして読み取る追加 POP のパスをスペース区切りで指定。シードジオメトリ参照や CPU 側計算結果の読み込みに使用
Vectors Page 📐
Vector シーケンス .vec 🔢
シェーダに渡す Uniform ベクトル変数のシーケンス設定:
- Vector:
vec(ベクトルシーケンスヘッダ) — シェーダで参照する全ベクトル Uniform を束ねるシーケンス - Name:
vec0name(ベクトル変数名) — シェーダ内uniform宣言で使用する識別子。シェーダコードの宣言と一致させる必要がある
Vector Type .vec0type 🔠
ベクトル Uniform の GLSL 型を選択するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| float | .float |
32-bit 単精度浮動小数スカラ |
| vec2 | .vec2 |
32-bit 単精度浮動小数 2 成分ベクトル |
| vec3 | .vec3 |
32-bit 単精度浮動小数 3 成分ベクトル |
| vec4 | .vec4 |
32-bit 単精度浮動小数 4 成分ベクトル |
| double | .double |
64-bit 倍精度浮動小数スカラ |
| dvec2 | .dvec2 |
64-bit 倍精度浮動小数 2 成分ベクトル |
| dvec3 | .dvec3 |
64-bit 倍精度浮動小数 3 成分ベクトル |
| dvec4 | .dvec4 |
64-bit 倍精度浮動小数 4 成分ベクトル |
| int | .int |
32-bit 符号付き整数スカラ |
| ivec2 | .ivec2 |
32-bit 符号付き整数 2 成分ベクトル |
| ivec3 | .ivec3 |
32-bit 符号付き整数 3 成分ベクトル |
| ivec4 | .ivec4 |
32-bit 符号付き整数 4 成分ベクトル |
| uint | .uint |
32-bit 符号なし整数スカラ |
| uvec2 | .uvec2 |
32-bit 符号なし整数 2 成分ベクトル |
| uvec3 | .uvec3 |
32-bit 符号なし整数 3 成分ベクトル |
| uvec4 | .uvec4 |
32-bit 符号なし整数 4 成分ベクトル |
Vector Value .vec0value 💎
ベクトル Uniform の各成分値設定:
- Value X:
vec0valuex(X 成分) — ベクトル Uniform の X 成分値 - Value Y:
vec0valuey(Y 成分) — ベクトル Uniform の Y 成分値 (2 成分以上の型で有効) - Value Z:
vec0valuez(Z 成分) — ベクトル Uniform の Z 成分値 (3 成分以上の型で有効) - Value W:
vec0valuew(W 成分) — ベクトル Uniform の W 成分値 (4 成分の型で有効)
Samplers Page 🗂️
Sampler シーケンス .sampler 🔢
シェーダから参照する TOP サンプラのシーケンス設定:
- Sampler:
sampler(サンプラシーケンスヘッダ) — シェーダで参照する全サンプラを束ねる - Name:
sampler0name(サンプラ名) — シェーダ内で使用する識別子。TOP の次元に合わせてsampler2D(2D TOP) またはsampler3D(3D TOP) として宣言する - TOP:
sampler0top(サンプリング対象 TOP パス) — シェーダから読み取る TOP へのパス。+ ボタンで Extend / Filter 等の境界処理オプションが展開される
Extend U .sampler0extendu ↔️
U 方向 (横) のテクスチャ範囲外サンプリング時の境界処理
| 項目 | 内部名 | 説明 |
|---|---|---|
| Hold | .hold |
範囲端の値を維持してクランプ |
| Zero | .zero |
範囲外を 0 (透明) で塗る |
| Repeat | .repeat |
テクスチャを繰り返しタイリング |
| Mirror | .mirror |
鏡映反転でタイリング |
Extend V .sampler0extendv ↕️
V 方向 (縦) のテクスチャ範囲外サンプリング時の境界処理
| 項目 | 内部名 | 説明 |
|---|---|---|
| Hold | .hold |
範囲端の値を維持してクランプ |
| Zero | .zero |
範囲外を 0 (透明) で塗る |
| Repeat | .repeat |
テクスチャを繰り返しタイリング |
| Mirror | .mirror |
鏡映反転でタイリング |
Extend W .sampler0extendw 🔁
W 方向 (奥行き、3D TOP のみ) のテクスチャ範囲外サンプリング時の境界処理
| 項目 | 内部名 | 説明 |
|---|---|---|
| Hold | .hold |
範囲端の値を維持してクランプ |
| Zero | .zero |
範囲外を 0 で塗る |
| Repeat | .repeat |
テクスチャを繰り返しタイリング |
| Mirror | .mirror |
鏡映反転でタイリング |
Filter .sampler0filter 🎚️
テクスチャサンプリング時の補間方式
| 項目 | 内部名 | 説明 |
|---|---|---|
| Nearest Pixel | .nearest |
最近傍ピクセル値をそのまま読む (ドット感維持、補間なし) |
| Interpolate Pixels | .linear |
周辺ピクセルを双線形補間 (滑らかなサンプリング) |
Arrays Page 🔣
Array シーケンス .array 📊
シェーダに渡す Uniform 配列のシーケンス設定:
- Array:
array(配列シーケンスヘッダ) — シェーダで参照する全配列 Uniform を束ねる - Name:
array0name(配列名) — シェーダ内で使用する識別子 - CHOP:
array0chop(ソース CHOP パス) — 配列として読み込む CHOP のパス。チャンネルサンプル列がそのまま GLSL 配列にマッピングされる
Array Type .array0type 🔠
配列要素の GLSL 型を選択するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| float | .float |
32-bit 単精度浮動小数スカラ配列 (1 チャンネル CHOP に対応) |
| vec2 | .vec2 |
32-bit 単精度浮動小数 2 成分ベクトル配列 (2 チャンネル CHOP に対応) |
| vec3 | .vec3 |
32-bit 単精度浮動小数 3 成分ベクトル配列 (3 チャンネル CHOP に対応) |
| vec4 | .vec4 |
32-bit 単精度浮動小数 4 成分ベクトル配列 (4 チャンネル CHOP に対応) |
Matrices Page 🔲
Matrix シーケンス .matrix 🧮
シェーダに渡す Uniform 行列のシーケンス設定:
- Matrix:
matrix(行列シーケンスヘッダ) — シェーダで参照する全行列 Uniform を束ねる - Name:
matrix0name(行列名) — シェーダ内uniform mat4等で使用する識別子 - Matrix:
matrix0value(行列値) — 4×4 同次変換行列。Object COMP のパスや tdu.Matrix オブジェクトを参照することも可能
Atomic Counters Page 🧷
Atomic Counter シーケンス .ac 🔂
シェーダの並列スレッドから安全に加算できる Atomic Counter 設定:
- Atomic Counter:
ac(Atomic Counter シーケンスヘッダ) — シェーダで参照する全 Atomic Counter を束ねる - Name:
ac0name(Atomic Counter 名) — シェーダ内layout(binding=N, offset=0) uniform atomic_uintで使用する識別子 - Initial Value:
ac0singlevalue(初期値) — フレーム開始時のカウンタ値。並列スレッドがatomicCounterIncrement()でアトミックに加算可能
Constants Page 💠
Constant シーケンス .const 🔢
シェーダコンパイル時に注入される定数値の設定:
- Constant:
const(定数シーケンスヘッダ) — シェーダで参照する全コンパイル時定数を束ねる - Name:
const0name(定数名) — シェーダ内#defineとして注入される識別子 - Value:
const0value(定数値) — シェーダコードに#define NAME VALUEとして埋め込まれる値。値を変更するとシェーダ全体が再コンパイルされる
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: 高さマップから地形生成 🗺️
Noise TOP → GLSL Create POP (Primitive Type=Triangles, sampler0top=heightmap) → Transform POP → Render TOP
TOP テクスチャを高さマップとして GLSL Create POP のサンプラに渡し、コンピュートシェーダが各スレッドで (u, height(u,v), v) の頂点座標を計算して三角形グリッドを生成するパターン。地形・波紋・プロシージャル背景の基本構成として使えます。
- Noise TOP で 256×256 の高さマップを生成
- GLSL Create POP の Samplers Page で
heightmapName + ソース TOP パスを設定 - Primitive Type を
Triangles、Max Number of Primitives をグリッドサイズに合わせて 256×256×2 程度に設定 - Compute Shader DAT に
gl_GlobalInvocationIDをグリッド座標とみなして頂点 3 個を出力するコードを記述 - 出力 POP を Render TOP 経由で可視化、Transform POP で原点合わせとスケール調整
Example 2: CHOP配列を点群化 🎆
Audio Spectrum CHOP → GLSL Create POP (Primitive Type=Points, array0chop) → Material SOP 経由ライティング → Render TOP
CHOP のサンプル列を GLSL Create POP の Arrays Page に vec3 型で渡し、各サンプルを 1 ポイントとして点群プリミティブを生成するパターン。オーディオスペクトル・センサーデータ・パーティクル位置などをそのまま GPU 上で 3D ビジュアライズに流す。
- Audio Spectrum CHOP で周波数帯ごとのスペクトル値を取得
- GLSL Create POP の Arrays Page で
spectrumName + Type をvec3に設定し、CHOP パスを参照 - Primitive Type を
Points、Max Number of Primitives を CHOP サンプル数以上に設定 - Compute Shader 内で
spectrum[gl_GlobalInvocationID.x]を読み取り、各成分を XYZ 座標として頂点に書き出す - 出力点群を Render TOP で 3D ビジュアライザとして表示
Example 3: 可変数の並列生成 ⚛️
Input POP → GLSL Create POP (Indirect=on, Atomic Counter で実数カウント) → Cache POP → Render TOP
Atomic Counter を用いて実際に生成するプリミティブ数をシェーダ側で動的に決定するフロー。条件付きでプリミティブを間引いたり、衝突判定で生存個体のみ出力する用途に有効。Max Number of Primitives を上限、Atomic Counter を実数カウンタとして併用します。
- Atomic Counters Page で
primcountName と Initial Value=0 のカウンタを定義 - Compute Shader 内で各スレッドが条件 (例: 速度しきい値超過) を満たすときのみ
atomicCounterIncrement(primcount)でカウンタを進めてからプリミティブを書込 - Indirect をオンにし、間接ディスパッチで実カウンタ値ぶんだけ後続描画を起動
- 出力 POP を Cache POP で 1 フレーム遅延参照し、次フレームのフィードバックループへ接続
- Render TOP で最終ビジュアル化
関連オペレータ 🔗
類似機能OP 🔍
- GLSL Advanced POP — 本 POP の現行後継。コンピュートシェーダで頂点・プリミティブ・属性を自由に生成・編集できる
- GLSL POP — 既存ジオメトリの属性をシェーダで変換する POP (新規ジオメトリ生成はしない)
- GLSL Copy POP — シェーダによる属性コピー・上書き専用
組み合わせ推奨OP 🔄
- GLSL Advanced POP — 移行先。同様の用途で deprecation を回避できる
- Topology POP — GLSL Advanced POP と組み合わせ、頂点接続情報 (トポロジ) を別途定義する公式推奨パターン
- Transform POP — 生成ジオメトリの位置・回転・スケール調整
- Attribute POP — 出力属性の追加・編集 (色・法線・UV 等)
- Cache POP — 生成結果を 1 フレーム遅延参照しフィードバックループ構成
- POP to CHOP — 出力属性を CHOP に変換しデバッグ・ロギング
- Render TOP — 生成プリミティブの最終ビジュアル化 (Geometry COMP 経由)
前処理・後処理POP 🎯
- 前処理: In POP、Box POP、Sphere POP、Particle POP、Cache POP
- 後処理: Transform POP、Attribute POP、Convert POP、Group POP、Cache POP、Out POP
Info POP情報 📊
GLSL Create POP は Info CHOP 経由でジオメトリ統計と GPU メモリ情報を取得する。
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: エラー数
POP汎用情報 📡
num_points: 出力ジオメトリの総ポイント数 (生成プリミティブ × 頂点数)num_prims: 出力ジオメトリの実際のプリミティブ数 (Atomic Counter による動的カウントを反映)num_point_attribs: 出力ジオメトリのポイント属性数num_prim_attribs: 出力ジオメトリのプリミティブ属性数gpu_memory_used: この POP が確保している GPU メモリ量 (Max Number of Primitives ぶんの上限値)compile_time: コンピュートシェーダのコンパイルにかかった時間 (ms)
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: deprecated 警告が表示され、将来削除される旨が docs に明記されている
✅ Solution:
- 公式 docs の指示通り GLSL Advanced POP へ移行 (頂点・属性生成は同等の自由度)
- プリミティブ接続情報を別途扱いたい場合は Topology POP を併用
- 本 POP は当面動作するが、新規プロジェクトでは互換性維持以外の用途で採用を避ける
❌ Problem: プリミティブが出力されない / 0 個になる
✅ Solution:
- Max Number of Primitives が 0 でないか確認 (上限が 0 だと何も生成されない)
- Compute Shader がコンパイルエラーを起こしていないか Texture Viewer / TextPort で確認
- Number of Threads が
Autoでも Work Group Size / Dispatch Size の積が 0 にならないか Manual で明示確認
❌ Problem: Sampler から TOP の値が読めない / すべて 0 になる
✅ Solution:
- Sampler 0 Name とシェーダ内
uniform sampler2D宣言の識別子が完全一致しているか確認 - TOP の次元 (2D / 3D) と宣言型 (
sampler2D/sampler3D) を一致させる - Extend U / V / W と Filter の設定が意図と合致しているか確認 (範囲外サンプル時の挙動)
❌ Problem: Atomic Counter の値が期待値と異なる
✅ Solution:
- Atomic Counter Initial Value がフレーム冒頭で正しくリセットされているか確認 (Cook 単位でリセット)
- シェーダ内で
atomicCounterIncrement()を使用し、通常代入で書き換えていないか確認 layout(binding=N, offset=0)のbinding番号がシーケンスインデックスと一致しているか確認
❌ Problem: パフォーマンスが想定より重い
✅ Solution:
- Max Number of Primitives を実用上限ギリギリまで絞って GPU メモリ確保量を最小化
- Common Page の
Free Extra GPU Memoryパルスで蓄積メモリを解放 - 後段で不要な属性を
Delete Input Attributesで破棄しメモリ帯域を削減
参考資料 📚
その他 🔗
- TouchDesigner Wiki — POP 概要
- TouchDesigner Wiki — Category:POPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – GLSL Create POP
- POP 概要 (Points, Vertices and Primitives in POPs)
- TouchDesigner公式ドキュメント – GLSL Advanced POP (推奨移行先)
- TouchDesigner公式ドキュメント – Topology POP (推奨併用 POP)
- Texture Sampling Parameters (サンプラ設定詳細)

