Shared Mem Out TOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

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

Shared Mem Out TOP の共有メモリ送信機能を示す図

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

概要 📖 – 画像を共有メモリへ送信

Shared Mem Out TOPは、入力されたテクスチャを OS の共有メモリブロックに書き出し、同一マシン内の別プロセスや外部アプリケーションがリアルタイムに読取可能にする TOPです。受信側で Shared Mem In TOP を同じ Shared Mem Name で設定するとテクスチャを共有でき、Commercial / Pro エディションで利用可能です。Download TypeNext Frame (Fast) を選ぶと GPU → CPU ダウンロードのストールを抑えてパフォーマンスが向上します。

主な用途 🎯

  • 別プロセスの TouchDesigner へテクスチャを共有メモリ経由で送信
  • 外部アプリケーション (C++ / Unity / Python 等) へリアルタイムにテクスチャを引き渡す同一マシン IPC
  • 重い描画プロセス軽い制御プロセスを分離してフレームレートを安定化
  • Shared Mem In TOP とペアで構築する低遅延テクスチャ共有 (NDI より低レイテンシ)
  • Download TypeNext Frame (Fast) 切替で GPU → CPU ダウンロード負荷を軽減

データフロー 🔄

入力: テクスチャ (上流 TOP)

Active によるクック制御

GPU から CPU へのダウンロード (Download Type 設定)

Shared Mem Name で識別される共有メモリブロックへ書込み

出力: OS 共有メモリ (Shared Mem In TOP / 外部アプリから読取可能)

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

SharedMemOut Page 📋

Active .active 🟢

共有メモリ書込みの有効化:

  • Active: active (有効) — オンの場合、毎フレーム入力テクスチャをクックして共有メモリブロックへ書き込みます。オフの場合は cook が停止し、外部プロセスから読まれる値は最後に書き込まれた状態のまま残ります

Shared Mem Name .name 🏷️

共有メモリブロックの識別名:

  • Shared Mem Name: name (共有メモリ名) — 書込み先の共有メモリブロックの識別名。受信側の Shared Mem In TOP や外部アプリケーションで同じ名前を指定することで接続されます (大文字小文字も区別)

Shared Mem Type .memtype 🗂️

ローカル共有メモリとグローバル共有メモリの切替

項目 内部名 説明
Local .local 指定名ごとに固有の共有メモリセグメントを使用。TouchDesigner 以外のアプリケーション (C++ / Unity / Python 等) とテクスチャを共有する場合は必ずこのモードを使う
Global .global 全ノードが共通の共有メモリセグメントを読み書きするモード。詳細は公式 docs の Global Shared Memory ページを参照

Download Type .downloadtype

GPU から CPU へのテクスチャダウンロード方式の選択 (パフォーマンスに直結)

項目 内部名 説明
Immediate (Slow) .immediate 現フレームでクック完了と同時に GPU → CPU ダウンロードを実行。GPU パイプラインがストールするためフレームレートが落ちやすい (デバッグ時や即時値が必要な場面向け)
Next frame (Fast) .nextframe ダウンロードを次フレームに遅延させ GPU パイプラインのストールを回避。1 フレームのレイテンシが発生するがパフォーマンスは大幅に向上 (リアルタイム用途で推奨)

Common Page 🔧

Output Resolution .outputresolution 🖼️

出力解像度の決定方式

項目 内部名 説明
Use Input .useinput 入力 TOP の解像度をそのまま継承
Eighth .eighth 入力解像度の 1/8
Quarter .quarter 入力解像度の 1/4
Half .half 入力解像度の 1/2
2X .2x 入力解像度の 2 倍
4X .4x 入力解像度の 4 倍
8X .8x 入力解像度の 8 倍
Fit Resolution .fit 指定解像度に縦横比を保持して収める
Limit Resolution .limit 指定解像度を上限としてクランプ
Custom Resolution .custom Resolution パラメータで任意指定

Resolution .resolution 📐

カスタム解像度の幅・高さ指定:

  • Resolution W: 出力幅 (ピクセル単位)。Output ResolutionCustom Resolution / Fit Resolution / Limit Resolution の時に有効
  • Resolution H: 出力高 (ピクセル単位)。同上

Resolution Menu .resmenu 📋

よく使う解像度プリセットのドロップダウン:

  • Resolution Menu: NTSC / PAL / HDTV 720 / HDTV 1080 / 4K UHD 等のプリセットから選択すると Resolution W / Resolution H が自動セットされる

Use Global Res Multiplier .resmult 🔢

プロジェクト全体の解像度倍率の適用:

  • Use Global Res Multiplier: Project Settings の Global Resolution Multiplier をこの TOP に適用するかどうか

Output Aspect .outputaspect 📏

出力アスペクト比の決定方式

項目 内部名 説明
Use Input .useinput 入力 TOP のアスペクトを継承
Resolution .resolution 解像度から自動導出 (推奨デフォルト)
Custom Aspect .custom Aspect1 / Aspect2 で手動指定

Aspect .aspect 📐

カスタムアスペクト比の指定:

  • Aspect1: 横方向アスペクト値
  • Aspect2: 縦方向アスペクト値

Input Smoothness .inputfiltertype 🎚️

入力テクスチャのサンプリング方式

項目 内部名 説明
Nearest Pixel .nearest 最近傍ピクセルサンプリング (ピクセルアート向け)
Interpolate Pixels .linear バイリニア補間 (滑らか、デフォルト)
Mipmap Pixels .mipmap ミップマップ補間 (縮小時のモアレ抑制)

Fill Viewer .fillmode 🖥️

ビューア内でのテクスチャの収め方

項目 内部名 説明
Use Input .useinput 入力 TOP の Fill Viewer 設定を継承
Fill .fill ビューアいっぱいに引き伸ばす (アスペクト無視)
Fit Horizontal .width 横幅に合わせて収める
Fit Vertical .height 縦幅に合わせて収める
Fit Best .best アスペクト保持で内側に収まる最大サイズ
Fit Outside .outside アスペクト保持で外側まで覆う最小サイズ
Native Resolution .nativeres テクスチャのネイティブ解像度のまま等倍表示

Viewer Smoothness .filtertype 🎛️

ビューア表示時のサンプリング方式

項目 内部名 説明
Nearest Pixel .nearest 最近傍ピクセルサンプリング
Interpolate Pixels .linear バイリニア補間 (滑らか、デフォルト)
Mipmap Pixels .mipmap ミップマップ補間 (縮小ビュー時のモアレ抑制)

Passes .npasses 🔁

オペレータの反復実行回数:

  • Passes: TOP の処理を何パス繰り返すかの整数値。前回パスの結果が次回パスの入力になる

Channel Mask .chanmask 🎨

処理対象のチャンネルマスク (R/G/B/A 個別トグル):

  • Channel Mask: R / G / B / A 各チャンネルのオン/オフトグル

Pixel Format .format 🎨

出力テクスチャのピクセルフォーマット (ビット深度・チャンネル構成)

項目 内部名 説明
Use Input .useinput 入力 TOP のフォーマットを継承
8-bit fixed (RGBA) .rgba8fixed 標準 8 ビット固定小数 RGBA (デフォルト、軽量)
sRGB 8-bit fixed (RGBA) .srgba8fixed sRGB ガンマ補正済 8 ビット RGBA
16-bit float (RGBA) .rgba16float 16 ビット浮動小数 RGBA (HDR・中間処理向け)
32-bit float (RGBA) .rgba32float 32 ビット浮動小数 RGBA (最高精度、メモリ大)
10-bit RGB with 2-bit Alpha .rgb10a2fixed 10-10-10-2 ビット固定小数 (バンディング抑制)
16-bit fixed (RGBA) .rgba16fixed 16 ビット固定小数 RGBA
11-bit float (RGB) .rgb11float 11-11-10 ビット浮動小数 RGB (HDR 軽量)
16-bit float (RGB) .rgb16float 16 ビット浮動小数 RGB
32-bit float (RGB) .rgb32float 32 ビット浮動小数 RGB
8-bit fixed (Mono) .mono8fixed 8 ビット固定小数モノクロ
16-bit fixed (Mono) .mono16fixed 16 ビット固定小数モノクロ
16-bit float (Mono) .mono16float 16 ビット浮動小数モノクロ
32-bit float (Mono) .mono32float 32 ビット浮動小数モノクロ
8-bit fixed (RG) .rg8fixed 8 ビット固定小数 R+G 2 チャンネル
16-bit fixed (RG) .rg16fixed 16 ビット固定小数 R+G
16-bit float (RG) .rg16float 16 ビット浮動小数 R+G
32-bit float (RG) .rg32float 32 ビット浮動小数 R+G
8-bit fixed (A) .a8fixed 8 ビット固定小数アルファ単体
16-bit fixed (A) .a16fixed 16 ビット固定小数アルファ単体
16-bit float (A) .a16float 16 ビット浮動小数アルファ単体
32-bit float (A) .a32float 32 ビット浮動小数アルファ単体
8-bit fixed (Mono+Alpha) .monoalpha8fixed 8 ビット固定小数モノクロ+アルファ
16-bit fixed (Mono+Alpha) .monoalpha16fixed 16 ビット固定小数モノクロ+アルファ
16-bit float (Mono+Alpha) .monoalpha16float 16 ビット浮動小数モノクロ+アルファ
32-bit float (Mono+Alpha) .monoalpha32float 32 ビット浮動小数モノクロ+アルファ

実践アイデア 💡

Example 1: Python へ画像送信 🐍

Movie File In TOP → Composite TOP → Shared Mem Out TOP (Local, name='td_to_python', Download Type=Next Frame) → 外部 Python プロセス (NumPy で読取)

TouchDesigner で生成・合成したテクスチャを外部 Python スクリプトへリアルタイムに引き渡す構成。Shared Mem Out TOP の Shared Mem TypeLocal に設定し、外部 Python 側で同名の共有メモリブロックを mmap などで開いて NumPy 配列として読み取る。NDI や TCP/UDP 経由よりも低レイテンシで生のピクセルデータを共有できる。

  1. Movie File In TOP や Composite TOP 等で送信したいテクスチャを構成
  2. Shared Mem Out TOP を接続し、Shared Mem Nametd_to_python に設定
  3. Shared Mem TypeLocal に設定 (外部アプリ連携の必須条件)
  4. Download TypeNext Frame (Fast) に設定して GPU パイプラインのストールを回避
  5. 外部 Python 側で同名の共有メモリを開き、ヘッダ情報 (幅・高さ・ピクセルフォーマット) を取得してから NumPy 配列としてピクセルを読み取る

Example 2: 重い描画を別プロセスへ ⚡

Process A (機械学習推論 / 重い Render TOP) → Shared Mem Out TOP (Shared Mem Name=ml_result) → Process B (UI 制御専念) → Shared Mem In TOP → 表示

CPU / GPU 負荷の高い処理 (機械学習推論・複雑な GLSL TOP 等) を 1 つのプロセスに隔離し、もう 1 つのプロセスを UI 制御・出力専念にすることで UI のフレームレートを安定させる構成。Shared Mem Out TOP で計算結果のテクスチャを共有メモリへ書込み、UI プロセスがそれを受信して表示する。

  1. 計算プロセスで Render TOP や GLSL TOP / Script TOP 等の重い処理を実行
  2. 結果テクスチャの直後に Shared Mem Out TOP を配置し Shared Mem Nameml_result 等に設定
  3. Download TypeNext Frame (Fast) に設定して計算側 GPU の足を引っ張らないようにする
  4. UI プロセス側で Shared Mem In TOP を配置し同じ名前を指定
  5. UI プロセス側で受信したテクスチャを Container COMP や Composite TOP 等で表示

Example 3: Unity へ映像配信 🎮

Render TOP → Shared Mem Out TOP (Local, name='td_to_unity') → 共有メモリ → Unity / Unreal 側プラグイン → Texture2D / RenderTexture に反映

TouchDesigner でレンダリングした映像を Unity / Unreal Engine 等のゲームエンジン側にテクスチャとして取り込む構成。Shared Mem TypeLocal に設定し、Unity 側では Spout / Syphon ラッパや専用ネイティブプラグインで同名の共有メモリブロックを Texture2D として読み込む。NDI より低レイテンシかつ非圧縮で高品質な映像を渡せる。

  1. TouchDesigner 側で Render TOP / Composite TOP 等から最終映像を構築
  2. Shared Mem Out TOP を接続し Shared Mem Nametd_to_unity 等に設定
  3. Shared Mem Type = Local + Download Type = Next Frame (Fast) を設定
  4. Unity / Unreal 側で対応する共有メモリ読み込みプラグイン (Spout 互換等) を導入し同じ名前で開く
  5. 受信したテクスチャを Material の MainTex や RenderTexture に割り当てて 3D シーンに反映

関連オペレータ 🔗

類似機能OP 🔍

  • Shared Mem In TOP — 対となる受信側 TOP、同じ Shared Mem Name で接続
  • NDI Out TOP — ネットワーク経由でテクスチャを送信、別マシン宛にも到達可能 (高レイテンシ・圧縮あり)
  • DirectX Out TOP — DirectX 共有テクスチャ経由で別アプリへ送信 (Windows のみ、低レイテンシ)
  • Touch Out TOP — TouchDesigner 間限定のテクスチャ送信、Touch In TOP とペア
  • Video Stream Out TOP — RTSP / SRT 等のストリーミングプロトコルで映像送信、別マシン向け

組み合わせ推奨OP 🔄

  • Shared Mem In TOP — 受信側 TOP として常にペアで使用
  • Render TOP — 3D シーンのレンダリング結果を共有メモリ経由で別プロセスへ転送
  • Composite TOP — 複数 TOP を合成してから単一テクスチャとして送信
  • Movie File In TOP — 動画ファイルを共有メモリ経由で別プロセスへ渡す
  • Cache TOP — 送信前にフレームをキャッシュし安定したレートで配信
  • Null TOP — 上流 TOP の出力固定点として Shared Mem Out の直前に配置

前処理・後処理TOP 🎯


Info情報 📊

Shared Mem Out TOP は Info CHOP / Info DAT による詳細情報取得に対応しています。

TOP固有情報 🖼️

  • resx: TOP の出力解像度 X (ピクセル単位)
  • resy: TOP の出力解像度 Y (ピクセル単位)
  • aspectx: アスペクト比 X
  • aspecty: アスペクト比 Y
  • depth: 3D テクスチャ / テクスチャ配列の深度 (2D テクスチャでは 1)
  • gpu_memory_used: TOP が消費している GPU メモリ量 (MB 単位)

汎用オペレータ情報 🔄

  • total_cooks: プロセス開始からのクック回数
  • cook_time: 最後のクック時間 (ミリ秒)
  • cook_frame: 最後にクックされたフレーム番号
  • warnings: 警告数
  • errors: エラー数
  • cooked_this_frame: 現在のフレームでクックされた場合は 1

TOP 共通情報 🖼️

  • resx: 出力テクスチャの幅 (ピクセル単位)
  • resy: 出力テクスチャの高さ (ピクセル単位)
  • aspectx: テクスチャの横方向アスペクト値
  • aspecty: テクスチャの縦方向アスペクト値
  • depth: テクスチャの奥行 (3D テクスチャ時)

トラブルシューティング ⚠️

よくある問題と解決策 🔧

❌ Problem: 受信側 Shared Mem In TOP やアプリでテクスチャが取得できない
✅ Solution:

  • 送信側と受信側で Shared Mem Name が完全一致しているか確認 (大文字小文字も区別)
  • 送信側の Active パラメータがオンになっているか確認 (オフだと cook が止まり書込みも停止)
  • 送信側と受信側のプロセスが同じマシン上で動作しているか確認 (共有メモリは同一マシン内 IPC 専用、LAN 跨ぎは不可)
  • TouchDesigner のエディションが Commercial / Pro かを確認 (Non-Commercial では Shared Mem TOP は利用不可)

❌ Problem: フレームレートが落ちる / 描画が重くなる
✅ Solution:

  • Download TypeImmediate (Slow) になっていないか確認し、リアルタイム用途では Next Frame (Fast) に切り替え
  • テクスチャ解像度を必要最小限に抑える (Common Page の Output ResolutionHalfQuarter に下げて検証)
  • Pixel Format を 32-bit float から 8-bit fixed (RGBA) に下げて GPU → CPU ダウンロード負荷を削減
  • 前段に Cache TOP を入れてフレームを安定化し、必要なフレームだけクック対象にする

❌ Problem: 外部アプリ (C++ / Unity / Python) から接続できない
✅ Solution:

  • Shared Mem TypeLocal になっているか確認 (Global は TouchDesigner 内部限定の用途)
  • 外部側で共有メモリヘッダの読み取り順序が公式 docs の仕様 (幅・高さ・ピクセルフォーマット) と一致しているか確認
  • Windows のセキュリティポリシーで Global 名前空間にアクセス権がない場合があるため、Local 名前空間を使用
  • 公式 docs の Shared Memory ページに掲載されている C++ / Python サンプルコードと一致した API 呼び出しになっているか確認

❌ Problem: 送信側プロセスを再起動するとリンクが切れる
✅ Solution:

  • 受信側 Shared Mem In TOP の Active を一度オフ → オンでリンクを再確立
  • 送信側プロセスが先に起動するように起動順を決める (送信側がメモリブロックを作成し、受信側がそこへアタッチする想定)
  • 起動順を制御できない場合は受信側で定期的に再アタッチを試行する仕組みを用意

❌ Problem: マシン跨ぎ (LAN 経由) でテクスチャを送りたい
✅ Solution:

  • Shared Mem Out TOP は同一マシン内 IPC 専用のため LAN 経由には使えない
  • ネットワーク経由でテクスチャを送るには NDI Out TOPTouch Out TOP / Video Stream Out TOP を使用
  • 低レイテンシ・非圧縮が必要なら NDI HX ではなく NDI Full 規格や Touch Out TOP を選択

参考資料 📚

その他 🔗

公式リソース 📖

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