
概要 📖 – C++ プラグインによる TOP 拡張
CPlusPlus TOPは、C++ で記述したプラグイン (DLL) をロードして独自の GPU 処理や外部 SDK 統合をフレーム単位で実行する TOPです。Custom Operators API を用いて Pixel Format / Anti-Alias / 出力バッファ数まで制御し、テンプレート TOP では実現できない処理を C++ ネイティブで組み込めます。
主な用途 🎯
- C++ で記述したカスタム TOP プラグイン (DLL) のロードと実行
- 独自の GPU シェーダ処理 (テンプレ TOP では実現できないアルゴリズムの実装)
- 外部 SDK (カメラ・キャプチャデバイス・GPU SDK 等) との統合
- マルチカラーバッファ出力 (1 つのプラグインから複数 RGBA バッファを同時出力)
- 独自のフレームバッファ設定 (Anti-Alias / Depth Buffer / Stencil Buffer のカスタム制御)
データフロー 🔄
入力: 上流 TOP の画像 (任意)
↓
C++ プラグイン (DLL) の execute コールバック
↓
出力: フレームバッファ (Pixel Format / Anti-Alias 設定に従う)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Load Page 📋
プラグインロード .plugin_load 🔌
ロードする C++ プラグイン (DLL) のパスと再初期化制御
Plugin Path .plugin 📂
– ロードする C++ プラグイン (DLL) ファイルのパス
– 絶対パスまたは TouchDesigner プロジェクトからの相対パスで指定
Re-Init Class .reinit 🔁
– オンにするとプラグインが生成したクラスインスタンスを破棄し、新しいインスタンスを生成
– プラグイン内部状態をリセットしたいときに使用
Re-Init Class (Pulse) .reinitpulse ⚡
– パルス入力で即座にクラスインスタンスを再初期化
– reinit パラメータと違い、トグル維持せず 1 フレームだけ発火する
Unload Plugin .unloadplugin 📤
– 値が 1 を超えるとクラスインスタンスを破棄しプラグイン DLL 自体をアンロード
– DLL ファイルのロックを解放したいときに使用
Anti-Alias .antialias 🪞
プラグイン用フレームバッファのアンチエイリアスレベル
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1x | .aa1 |
アンチエイリアスなし (1 サンプル / ピクセル) |
| 2x | .aa2 |
2 サンプル / ピクセル |
| 4x | .aa4 |
4 サンプル / ピクセル |
| 8x | .aa8 |
8 サンプル / ピクセル |
| 16x | .aa16 |
16 サンプル / ピクセル |
| 32x | .aa32 |
32 サンプル / ピクセル (最高品質、最も VRAM 消費) |
バッファ設定 .buffer_settings 🧰
Depth / Stencil / マルチカラーバッファのフレームバッファ構成
Depth Buffer .depthbuffer 📐
– 作成するフレームバッファに付与する深度バッファのピクセルフォーマットを指定
– 不要な場合は None を選択
Stencil Buffer .stencilbuffer 🪧
– ステンシルバッファを付与する場合にオン
– マスク処理などステンシル機能が必要なシェーダで使用
# of Color Buffers .numcolorbufs 🎨
– 1 つのプラグインから同時出力するカラーバッファ (RGBA) の本数
– 2 本以上に設定した場合、シェーダ側で gl_FragData[i] に書込む必要あり
実践アイデア 💡
Example 1: 独自シェーダエフェクトプラグイン 🎨
Movie File In TOP → CPlusPlus TOP (custom_effect.dll) → Out TOP
GLSL TOP では届かない高度な GPU 処理 (独自フィルタ・カスタム合成など) を C++ プラグインで実装し、上流の映像ソースに適用してから下流に流す基本構成。
- Visual Studio で TouchDesigner Custom Operators SDK をベースにプラグイン DLL をビルド
- CPlusPlus TOP の Plugin Path にビルド済 DLL を指定
- Re-Init Class でロード、上流 TOP を入力に接続
- ソースを変更したら DLL を差し替えて Re-Init Class (Pulse) で再ロード
Example 2: 外部 SDK によるカメラキャプチャ統合 📷
External Camera SDK → CPlusPlus TOP (capture_plugin.dll) → 下流 TOP チェーン
テンプレ Video Device In TOP では対応していない産業用カメラや独自プロトコルのキャプチャデバイスの SDK を C++ プラグインで包み、フレームを TOP として下流に供給するパターン。
- ベンダー SDK のサンプルを参考にキャプチャループを実装
- execute コールバック内で取得したフレームを OpenGL テクスチャに転送
- Pixel Format をデバイス特性に合わせて選択 (8-bit / 16-bit float 等)
Example 3: マルチカラーバッファ出力 (G-Buffer 風レンダリング) 🖼️
CPlusPlus TOP (gbuffer.dll, # of Color Buffers=3) → Select TOP × 3 → 下流合成
1 回のプラグイン実行で Albedo / Normal / Depth など複数の RGBA バッファを同時出力し、後段の Select TOP でそれぞれを取り出してデファード合成に使うフロー。
- # of Color Buffers を 3 に設定
- シェーダ内で
gl_FragData[0]/gl_FragData[1]/gl_FragData[2]に各成分を書込む - 下流で Select TOP の Output Index を 0 / 1 / 2 にして個別取り出し
関連オペレータ 🔗
類似機能OP 🔍
- GLSL TOP — GPU シェーダを GLSL で直接記述する代替手段
- Script TOP — Python でピクセル処理を実装する代替手段 (低速)
組み合わせ推奨OP 🔄
- GLSL TOP — 前段で標準的なシェーダ処理、後段で CPlusPlus TOP に独自処理を委譲
- Select TOP — マルチカラーバッファ出力時に個別バッファを取り出す
- Movie File In TOP — プラグインへの入力ソースとして映像ファイルを供給
- Info CHOP — プラグイン出力 TOP の解像度・チャンネル情報を取得
前処理・後処理TOP 🎯
Info CHOP情報 📊
CPlusPlus TOP は Info CHOP による詳細情報取得に対応しています。
TOP固有情報 🖼️
resx: TOP の出力解像度 X (ピクセル単位)resy: TOP の出力解像度 Y (ピクセル単位)aspectx: アスペクト比 Xaspecty: アスペクト比 Ydepth: 3D テクスチャ / テクスチャ配列の深度 (2D テクスチャでは 1)gpu_memory_used: TOP が消費している GPU メモリ量 (MB 単位)
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
TOP 共通情報 📊
resx: 出力フレームバッファの横解像度 (ピクセル)resy: 出力フレームバッファの縦解像度 (ピクセル)aspectx: 出力アスペクト比 X 成分aspecty: 出力アスペクト比 Y 成分depth: ピクセルフォーマットのビット深度情報num_color_channels: 出力カラーバッファの本数 (numcolorbufs設定に対応)
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: プラグインがロードされない
✅ Solution:
- Plugin Path のパスが正しく解決されているか確認 (絶対パス推奨)
- プラグイン DLL のビット数 (x64) が TouchDesigner と一致しているか確認
- TouchDesigner Custom Operators SDK のバージョンが現行 build と互換か確認
❌ Problem: プラグイン書き換え後も古い挙動のまま
✅ Solution:
Re-Init Classをオン → オフでクラスインスタンスを再生成- DLL 自体を入れ替えた場合は
Unload Pluginで完全アンロードしてから再ロード - 同じプラグインを別の CPlusPlus TOP もロードしている場合は全インスタンスでアンロードする
❌ Problem: マルチカラーバッファ出力が空 (黒) になる
✅ Solution:
# of Color Buffersが 2 以上のとき、シェーダ内でgl_FragColorではなくgl_FragData[i]に書き込んでいるか確認- 下流の Select TOP の Output Index がバッファ番号と一致しているか確認
- Anti-Alias 設定や Pixel Format が想定どおりか確認
❌ Problem: Depth / Stencil バッファが効かない
✅ Solution:
Depth BufferがNone以外になっているか確認- Stencil テストを使う場合は
Stencil Bufferをオンに設定 - シェーダ側で深度書込・ステンシル書込が正しく発行されているか確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — Category:TOPs
- TouchDesigner Wiki — Pixel Formats 解説
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

