
概要 📖 – ポイント共有・カスプ・統合によるジオメトリ整理
Facet POPは、入力ジオメトリのポイント共有関係を整理し、ユニーク化・カスプ化・統合のいずれかを GPU 上で適用する POPです。Operation で 3 種類の整理モードと無操作を切替え、Consolidate Points では Brute Force / Shared Memory / Spatial Grid / Spatial Grid Per Voxel の 4 種類の統合 Technique を選択できます。
主な用途 🎯
- 同一座標に重なった重複ポイントを統合してジオメトリのトポロジを整理 (Consolidate Points)
- 面と面の角度しきい値でエッジを共有/分離させてハードエッジ・ソフトエッジを作り分け (Cusp Polygons)
- 頂点参照のみで実質的に同一なポイントをユニーク化して属性編集の独立性を確保 (Unique Points)
- 生成系 POP やインポートメッシュの後段で退化プリミティブと未使用ポイントを掃除してクリーンアップ
- シェーディング時の法線連続性をしきい値ベースで制御して立体感とフラット表現を切替
データフロー 🔄
入力: ポリゴンジオメトリ (重複ポイント・共有エッジを持つ可能性)
↓
Operation 選択 (none / unique / cusp / conspoints) + Technique 設定
↓
出力: ポイント共有関係が整理されたジオメトリ
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Facet Page 📋
Group .group 🏷️
処理対象とする入力グループの絞り込み:
- Group パターン: 入力にグループが存在する場合、ここで指定したグループ名にマッチするポイント・プリミティブのみが Facet 処理の対象となる
- 空欄時の挙動: 未指定時は入力ジオメトリ全体に対して処理を適用
Operation .operation 🎛️
Facet POP が実行する整理操作の種類を決定するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| No Operation | .none |
整理操作を実行せず入力をそのままパススルー (Remove Degenerate / Remove Unused Points のみ適用したい場合に使用) |
| Unique Points | .unique |
プリミティブ間で共有されているポイントを各プリミティブごとに独立した新規ポイントとして複製し、頂点参照をユニーク化 |
| Cusp Polygons | .cusp |
隣接面の法線角度が Angle しきい値を超えるエッジ上のポイントを分離してハードエッジを生成 (シェーディング不連続化) |
| Consolidate Points | .conspoints |
Distance しきい値以内に存在する近接ポイントを 1 点に統合してジオメトリのトポロジを整理 |
カスプ / 統合のしきい値 📐
Angle .angle 📐
– 隣接面の法線がなす角度のしきい値 (度単位)、これを超える共有エッジの頂点はポイントを共有しない
– Cusp Polygons モードでのみ有効、値を小さくするとハードエッジが増え、大きくするとスムーズシェーディング寄りになる
Distance .dist 📏
– ポイント統合時に同一とみなす最大距離 (ワールド空間)
– Consolidate Points モードでのみ有効、小さい値で厳密一致、大きい値で許容範囲を広げて積極的に統合
Max Tries .maxtries 🔁
– 統合対象ポイントが既に他のポイントへ統合済の場合に、次の候補を探す最大反復回数
– 連鎖統合が深い大規模ジオメトリで値を増やすと取りこぼしが減る
クリーンアップ 🧹
Remove Degenerate .removedegenerate 🗑️
– 連続する頂点が同一ポイントを参照するプリミティブ (退化プリミティブ) を削除
– 統合後にゼロ面積三角形・ゼロ長線分が発生したケースの後処理として有効
Remove Unused Points .removeunusedpoints 🧽
– どのプリミティブからも参照されていない未使用ポイントを削除してポイント配列を圧縮
– Unique Points / Consolidate Points 適用後の孤立ポイントを掃除する用途に使う
Technique .technique ⚙️
Consolidate Points 実行時のポイント統合アルゴリズムを選択するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Brute Force | .bruteforce |
全ポイント組み合わせを総当たりで比較する最も正確だが計算量 O(N^2) の手法 (小規模ジオメトリ向け) |
| Shared Memory | .sharedmemory |
GPU の共有メモリを活用して比較を並列化する手法 (中規模ジオメトリ向けの精度と速度のバランス) |
| Spatial Grid | .spatialgrid |
空間を一様グリッドに分割し近傍ポイントのみを比較する高速手法 (大規模ジオメトリ向け) |
| Spatial Grid Per Voxel | .spatialgridpervoxel |
ボクセル単位でグリッドを構築して局所統合を行う手法、Voxels Grid Resolution + Bounding Box と組み合わせて使用 |
ボクセルグリッド設定 🧊
Voxels Grid Resolution .gridres 🧊
– Spatial Grid Per Voxel 手法で使用するボクセルグリッドの解像度 (XYZ)
– 値を上げると統合精度は向上するが GPU メモリ消費が増加
Specify Bounding Box .specifybbox ✅
– Spatial Grid 系手法で統合範囲となるバウンディングボックスを明示指定するかを切替
– オフ時は入力ジオメトリの bbox を自動使用、オン時は bbox パラメータで参照 SOP を指定
Bounding Box .bbox 📦
– Specify Bounding Box がオンのときに参照するバウンディングボックス SOP のパス
– 特定領域内のポイントのみを統合対象にしたい場合に使用
後処理オプション 🔧
Compute Point Normals .computenormals 🧭
– 整理操作後にポイント法線 (N) を後処理として再計算
– Cusp Polygons / Consolidate Points でトポロジが変化した後のシェーディング整合に必須
Copy Topology Info Back to CPU .cpureadback 💾
– GPU 上のポイント数とトポロジ情報を CPU 側へコピーバックして読み出せるようにする
– Info CHOP 等から num_points / num_prims を参照したい場合にオン
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: インポートメッシュの重複ポイント統合 🧱
Alembic In POP → Facet POP (Operation=conspoints, Technique=spatialgrid, dist=0.001) → Render TOP
外部 DCC からインポートしたジオメトリでは座標は同一でも別ポイントとして格納されていることが多く、そのままだと法線分割やシェーディングが意図せず分断される。Facet POP の Consolidate Points で微小距離内のポイントを 1 点に統合し、シームレスなサーフェスとして扱える状態に整える基本フロー。
- Alembic In POP でメッシュを読み込み
- Facet POP の Operation を
conspointsに設定 - Technique を
spatialgrid、Distance を0.001程度に設定 - Compute Point Normals をオンにして統合後の法線を再計算
- Render TOP に接続して継ぎ目が消えていることを確認
Example 2: ハードエッジ生成によるロウポリ表現 💎
Box POP → Facet POP (Operation=cusp, angle=30) → Render TOP
デフォルトでスムーズシェーディングされるジオメトリに対して Facet POP の Cusp Polygons を適用し、Angle しきい値を超える鋭角エッジでポイントを分離することで、ロウポリゴン風のシャープな面表現を作るフロー。
- Box POP で立方体ジオメトリを生成
- Facet POP の Operation を
cuspに設定 - Angle を
30度程度に設定 (値を下げるとよりシャープに、上げると丸みが増す) - Compute Point Normals をオンにしてカスプ後の法線を再計算
- Render TOP で面の境界がハードエッジとして見えることを確認
Example 3: 生成系 POP の後段クリーンアップ 🧹
Convert POP → Facet POP (Operation=conspoints, Remove Degenerate=on, Remove Unused Points=on) → POP to SOP
Convert POP やプロシージャル生成で構築したジオメトリには、退化プリミティブや孤立ポイントが残ることがある。Facet POP の Consolidate Points + Remove Degenerate + Remove Unused Points を同時に適用し、後段の処理が安全に動作する状態に整えるクリーンアップフロー。
- Convert POP 等の生成系 POP の直後に Facet POP を接続
- Operation を
conspointsに設定して重複ポイントを統合 - Remove Degenerate と Remove Unused Points を両方オンに
- Distance を入力ジオメトリのスケールに合わせて調整
- POP to SOP 等の後段に流して問題なくジオメトリが扱えることを確認
関連オペレータ 🔗
類似機能OP 🔍
- Convert POP — プリミティブタイプの変換を行う POP。Facet が「ポイント共有関係を整える」のに対し Convert は「プリミティブ表現そのものの変換」
組み合わせ推奨OP 🔄
- Attribute POP — Facet 適用後に法線 (N) や色 (Cd) を再計算・編集
- Transform POP — Facet 後のジオメトリ全体を移動・回転・スケールして配置
- POP to SOP — 整理済みジオメトリを SOP ワークフローに渡して後段処理を継続
前処理・後処理POP 🎯
- 前処理: Alembic In POP、Box POP、Convert POP、Connectivity POP
- 後処理: Attribute POP、Transform POP、POP to SOP
Info POP情報 📊
Facet 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: エラー数
POP 汎用情報 (Info CHOP 経由) 📊
num_points: 整理操作後のポイント数 (Consolidate Points / Unique Points の効果確認に使用)num_prims: 出力プリミティブ数 (Remove Degenerate の効果確認に使用)num_point_attribs: 出力ジオメトリのポイント属性数num_vertex_attribs: 出力ジオメトリの頂点属性数num_prim_attribs: 出力ジオメトリのプリミティブ属性数gpu_memory_used: この POP が使用している GPU メモリ量
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: Consolidate Points を実行してもポイント数が減らない
✅ Solution:
- Distance パラメータが入力ジオメトリのスケールに対して小さすぎないか確認 (オブジェクトのスケールに対して 0.001〜0.01 程度から試す)
- Operation が
conspointsになっているか確認 (none/uniqueでは統合が行われない) - Technique を
bruteforceに切り替えて取りこぼしが原因か検証、その後 Max Tries を増やして連鎖統合を強化
❌ Problem: Cusp Polygons を適用してもシェーディングがスムーズなまま
✅ Solution:
- Compute Point Normals がオンになっているか確認 (オフだと統合前の法線が残りカスプ効果が見えない)
- Angle パラメータが大きすぎないか確認 (90 度等にすると大半のエッジが共有のまま残る、30 度前後から試す)
- 前段で既に共有ポイントが分離されている場合は
uniqueモードで一度ユニーク化してからcuspを適用
❌ Problem: Spatial Grid Per Voxel で意図しない領域のポイントが統合される
✅ Solution:
- Specify Bounding Box をオンにして
bboxパラメータに参照 SOP を指定し、統合対象領域を明示的に制限 - Voxels Grid Resolution を上げてボクセルセルのサイズを小さくし、誤統合を抑制
- Distance を小さくして同一ボクセル内でも距離しきい値で除外するよう調整
❌ Problem: 整理後に Info CHOP で num_points / num_prims が更新されない
✅ Solution:
- Copy Topology Info Back to CPU をオンにして GPU から CPU へトポロジ情報をコピーバック
- 下流の Info CHOP が Facet POP の出力を直接参照しているか確認
- GPU の処理完了待ちで遅延が生じることがあるため、後段で 1 フレーム遅延を許容するパイプライン構成を検討
参考資料 📚
その他 🔗
- TouchDesigner Wiki — POP 概要
- TouchDesigner Wiki — Category:POPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Facet POP
- POP 概要 (Points, Vertices and Primitives in POPs)
- Convert POP (関連: プリミティブタイプ変換)
- 属性 (Attribute) の基礎

