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

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

GLSL Create POP のコンピュートシェーダによる形状生成機能を示す図

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

概要 📖 – 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 のジオメトリ群

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

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) の頂点座標を計算して三角形グリッドを生成するパターン。地形・波紋・プロシージャル背景の基本構成として使えます。

  1. Noise TOP で 256×256 の高さマップを生成
  2. GLSL Create POP の Samplers Page で heightmap Name + ソース TOP パスを設定
  3. Primitive Type を Triangles、Max Number of Primitives をグリッドサイズに合わせて 256×256×2 程度に設定
  4. Compute Shader DAT に gl_GlobalInvocationID をグリッド座標とみなして頂点 3 個を出力するコードを記述
  5. 出力 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 ビジュアライズに流す。

  1. Audio Spectrum CHOP で周波数帯ごとのスペクトル値を取得
  2. GLSL Create POP の Arrays Page で spectrum Name + Type を vec3 に設定し、CHOP パスを参照
  3. Primitive Type を Points、Max Number of Primitives を CHOP サンプル数以上に設定
  4. Compute Shader 内で spectrum[gl_GlobalInvocationID.x] を読み取り、各成分を XYZ 座標として頂点に書き出す
  5. 出力点群を 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 を実数カウンタとして併用します。

  1. Atomic Counters Page で primcount Name と Initial Value=0 のカウンタを定義
  2. Compute Shader 内で各スレッドが条件 (例: 速度しきい値超過) を満たすときのみ atomicCounterIncrement(primcount) でカウンタを進めてからプリミティブを書込
  3. Indirect をオンにし、間接ディスパッチで実カウンタ値ぶんだけ後続描画を起動
  4. 出力 POP を Cache POP で 1 フレーム遅延参照し、次フレームのフィードバックループへ接続
  5. 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 🎯


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 で破棄しメモリ帯域を削減

参考資料 📚

その他 🔗

公式リソース 📖

この記事は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をコピーしました