
概要 📖 – 点や頂点に法線と接線を計算
Normal POPは、入力ジオメトリの位置属性から法線と接線を GPU 上で計算し、シェーディングや法線マッピングに使える属性として出力する POPです。Normals Action と Tangents Action でそれぞれ計算の有無や条件を切り替え、点法線の重み付けや頂点法線を分離する角度しきい値を細かく制御します。
主な用途 🎯
- インポートしたジオメトリに欠けている法線 (N) を計算してシェーディングを正しく表示
- 面の角度しきい値で頂点法線の共有/分離を切り替えてハードエッジとスムーズシェーディングを作り分け
- テクスチャ座標を基準に接線 (Tangent) を計算してノーマルマップ・法線マッピングに対応
- 点・頂点・プリミティブのどの属性クラスに法線を持たせるかを指定して下流処理に最適化
- 出力属性のデータ型・要素数・既定値を手動指定してカスタム属性として法線・接線を生成
データフロー 🔄
入力: 位置属性 (P) を持つジオメトリ
↓
Normals Action / Tangents Action で計算方法を選択 + 角度・重み付けを設定
↓
出力: 法線 (N) と接線が付与されたジオメトリ
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Normals Page 📋
Normals Action .nml 🎛️
Normals Action (法線の処理方法) — 法線をどう扱うかを決定するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| No Action | .noaction |
法線の計算を行わず、入力をそのまま通過させる |
| Always Compute | .alwayscompute |
既存の法線の有無にかかわらず、常に法線を計算し直す |
| Compute if it doesn’t exist | .computeifnone |
入力に法線が存在しない場合のみ計算する (既存の法線は温存) |
| Remove | .remove |
入力に含まれる法線属性を削除する |
法線の入力と属性クラス 🏷️
Input Position Attribute .inputposattrn 📍
– Input Position Attribute (入力位置属性) — 法線の計算に使う位置属性を指定
– 既定では位置属性 (P) を使うが、別の座標属性から法線を求めたい場合に切り替える
Attribute Class .attrclass 🗂️
– Attribute Class (属性クラス) — 点属性・頂点属性・プリミティブ属性のどれに対して処理するかを指定
– 該当する属性クラスがあるジオメトリでのみ有効になります
Normals Weighting .nmlweighting ⚖️
Normals Weighting (法線の重み付け) — 点法線を求める際、その点が属する面の法線をどう加重平均するかを選ぶメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Average | .average |
隣接する面の法線を単純平均する |
| Angle Weighted | .angleWeighted |
各面が点でなす角度の大きさで重み付けして平均する |
| Area Weighted | .areaweighted |
各面の面積の大きさで重み付けして平均する |
Compute Normals Technique .compnmltech ⚙️
Compute Normals Technique (点法線の計算手法) — 点法線を計算する GPU 上のアルゴリズムを選ぶメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Atomic Float (if supported) | .atomicfloat |
対応 GPU でアトミック浮動小数演算を使う手法 (利用可能な場合に高速) |
| Atomic Comp Swap | .atomiccompswap |
アトミック比較交換 (compare-and-swap) を使う互換性重視の手法 |
計算範囲としきい角度 📐
Max Number of Primitives per Point .maxprimsperpoint 🔢
– Max Number of Primitives per Point (点ごとの最大プリミティブ数) — 点ごとの一時作業領域を確保するための上限値
– 1 つの点が属し得るプリミティブ数の最大値に合わせて設定する
Angle .angle 📐
– Angle (しきい角度) — 頂点法線で、共有エッジの両側の面がなす角度がこの値を超えると頂点法線を共有しない
– 値を小さくするとハードエッジが増え、大きくするとスムーズシェーディング寄りになる
Normal Output Attribute Scope .outputattrscopen 🎯
Normal Output Attribute Scope (法線の出力属性スコープ) — 計算した法線をどの属性スロットに書き出すかを選ぶメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| P | .P |
位置属性 (P) に出力 |
| N | .N |
法線属性 (N) に出力 (標準的な法線スロット) |
| Color | .Color |
色属性 (Cd) に出力 |
| Color.i012 | .Color.i012 |
色属性の 0・1・2 番目の要素に出力 |
| Tex | .Tex |
テクスチャ座標属性に出力 |
| PointScale | .PointScale |
点スケール属性に出力 |
| LineWidth | .LineWidth |
線幅属性に出力 |
出力属性の手動指定 🛠️
Override Automatic Attribute .overrideautoattrn ✅
– Override Automatic Attribute (自動属性の上書き) — 入力とパラメータから自動決定される属性の種類を手動で上書きする
– オンにすると下記の型・要素数・既定値を自分で指定できます
Attribute Type (法線) .attrtypen 🔠
Attribute Type (属性のデータ型) — 法線出力属性のデータ型を選ぶメニューパラメータ (既定は float)
| 項目 | 内部名 | 説明 |
|---|---|---|
| float | .float |
単精度浮動小数 (既定) |
| double | .double |
倍精度浮動小数 |
| int | .int |
符号付き整数 |
| uint | .uint |
符号なし整数 |
| dir | .dir |
方向ベクトル型 (単精度) |
| dbl dir | .ddir |
方向ベクトル型 (倍精度) |
Components (法線) .attrnumcompsn 🔢
Components (要素数) — 新しいカスタム属性の要素数を選ぶメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1 | .1 |
1 要素 (スカラー) |
| 2 | .2 |
2 要素 (2 次元ベクトル) |
| 3 | .3 |
3 要素 (法線の標準: XYZ) |
| 4 | .4 |
4 要素 (XYZW) |
Default Value (法線) .attrdefaultvaln 🔧
計算不能時の出力属性既定値:
- Default Value (法線):
Default Value(既定値) — 計算できなかった場合に出力属性の各要素へ入れる既定値。要素ごとに最大 4 つ (attrdefaultvaln0〜attrdefaultvaln3) を指定
Tangents Page 📋
Tangents Action .tang 🎛️
Tangents Action (接線の処理方法) — 接線をどう扱うかを決定するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| No Action | .noaction |
接線の計算を行わず、入力をそのまま通過させる |
| Always Compute | .alwayscompute |
既存の接線の有無にかかわらず、常に接線を計算し直す |
| Compute if it doesn’t exist | .computeifnone |
入力に接線が存在しない場合のみ計算する |
| Remove | .remove |
入力に含まれる接線属性を削除する |
接線計算の入力属性 📥
Input Position Attribute .inputposattrt 📍
– Input Position Attribute (入力位置属性) — 接線の計算に使う位置属性を指定
Input Normal Attribute .inputnormalattr 🧭
– Input Normal Attribute (入力法線属性) — 接線の計算に使う法線属性を指定
Input Texture Coord Attribute .inputtexattrib 🗺️
– Input Texture Coord Attribute (入力テクスチャ座標属性) — 接線の計算に使うテクスチャ座標属性を指定
– ノーマルマップ用の接線はテクスチャ座標の張り方に依存します
Compute Tangents Technique .comptangtech ⚙️
Compute Tangents Technique (接線の計算手法) — 接線を計算する GPU 上のアルゴリズムを選ぶメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Atomic Float (if supported) | .atomicfloat |
対応 GPU でアトミック浮動小数演算を使う手法 (利用可能な場合に高速) |
| Atomic Comp Swap | .atomiccompswap |
アトミック比較交換 (compare-and-swap) を使う互換性重視の手法 |
Tangent Output Attribute Scope .outputattrscopet 🎯
Tangent Output Attribute Scope (接線の出力属性スコープ) — 計算した接線をどの属性スロットに書き出すかを選ぶメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| P | .P |
位置属性 (P) に出力 |
| N | .N |
法線属性 (N) に出力 |
| Color | .Color |
色属性 (Cd) に出力 |
| Color.rgb | .Color.rgb |
色属性の RGB 要素に出力 |
| Tex | .Tex |
テクスチャ座標属性に出力 |
| PointScale | .PointScale |
点スケール属性に出力 |
| LineWidth | .LineWidth |
線幅属性に出力 |
接線出力属性の手動指定 🛠️
Override Automatic Attribute .overrideautoattrt ✅
– Override Automatic Attribute (自動属性の上書き) — 入力とパラメータから自動決定される接線属性の種類を手動で上書きする
– オンにすると下記の型・要素数・既定値を自分で指定できます
Attribute Type (接線) .attrtypet 🔠
Attribute Type (属性のデータ型) — 接線出力属性のデータ型を選ぶメニューパラメータ (既定は float)
| 項目 | 内部名 | 説明 |
|---|---|---|
| float | .float |
単精度浮動小数 (既定) |
| double | .double |
倍精度浮動小数 |
| int | .int |
符号付き整数 |
| uint | .uint |
符号なし整数 |
| Color | .color |
色型 (単精度) |
| Color (double) | .dcolor |
色型 (倍精度) |
| Direction | .dir |
方向ベクトル型 (単精度) |
| Direction (double) | .ddir |
方向ベクトル型 (倍精度) |
Components (接線) .attrnumcompst 🔢
Components (要素数) — 新しいカスタム接線属性の要素数を選ぶメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1 | .1 |
1 要素 (スカラー) |
| 2 | .2 |
2 要素 (2 次元ベクトル) |
| 3 | .3 |
3 要素 (接線の標準: XYZ) |
| 4 | .4 |
4 要素 (XYZW、利き手符号を含む接線で使用) |
Default Value (接線) .attrdefaultvalt 🔧
計算不能時の接線出力属性既定値:
- Default Value (接線):
Default Value(既定値) — 計算できなかった場合に接線属性の各要素へ入れる既定値。要素ごとに最大 4 つ (attrdefaultvalt0〜attrdefaultvalt3) を指定
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 → Normal POP (Normals Action=computeifnone) → Attribute POP → Render TOP
外部 DCC からインポートしたジオメトリには法線 (N) が欠けていることがあり、そのままだと表面が真っ黒になったり陰影が破綻したりする。Normal POP の Compute if it doesn't exist で法線が無い場合のみ計算し、正しいシェーディングを取り戻す基本フロー。
- Alembic In POP でメッシュを読み込み
- Normal POP の Normals Action を
computeifnoneに設定 - Normals Weighting を
averageまたはareaweightedに設定 - Render TOP に接続して表面が正しく陰影付けされていることを確認
Example 2: 角度でハードエッジ表現 💎
Box POP → Normal POP (Normals Action=alwayscompute, angle=30) → Render TOP
デフォルトでスムーズに陰影付けされるジオメトリに対し、Normal POP の Angle しきい値を下げて鋭角エッジで頂点法線を分離することで、ロウポリゴン風のシャープな面表現を作るフロー。値を上げ下げするだけで丸みとシャープさを調整できる。
- Box POP で立方体ジオメトリを生成
- Normal POP の Normals Action を
alwayscomputeに設定 - Angle を
30度程度に設定 (小さいほどシャープ、大きいほど丸く) - Render TOP で面の境界がハードエッジとして見えることを確認
Example 3: ノーマルマップ用の接線計算 🗺️
File In POP → Normal POP (Tangents Action=alwayscompute) → Attribute POP → Render TOP
ノーマルマップで凹凸を表現するには、テクスチャ座標を基準にした接線 (Tangent) が必要になる。Normal POP の Tangents Action で接線を計算し、入力テクスチャ座標属性を基準にノーマルマッピングが正しく機能する状態に整えるフロー。
- File In POP でテクスチャ座標を持つメッシュを読み込み
- Normal POP の Normals Action を
computeifnoneにして法線を確保 - Tangents Action を
alwayscomputeに設定 - Input Texture Coord Attribute に使用するテクスチャ座標属性を指定
- Render TOP のマテリアルでノーマルマップを割り当てて凹凸が出ることを確認
関連オペレータ 🔗
類似機能OP 🔍
- Attribute POP — 属性の生成・編集を広く扱う POP。Normal が「法線・接線に特化」するのに対し Attribute は「任意属性の汎用編集」
- Facet POP — ポイント共有関係を整理する際に法線の再計算も行える POP。エッジの共有/分離という観点で機能が近い
組み合わせ推奨OP 🔄
- Attribute POP — 法線・接線の計算後に色 (Cd) や独自属性を追加・編集
- Transform POP — 法線付与後のジオメトリ全体を移動・回転・スケールして配置
- POP to SOP — 法線・接線を付与したジオメトリを SOP ワークフローへ受け渡し
前処理・後処理POP 🎯
- 前処理: Facet POP、Convert POP、Box POP
- 後処理: Attribute POP、Transform POP
Info POP情報 📊
Normal 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 汎用情報 📡
num_points: 出力ジオメトリのポイント数num_prims: 出力プリミティブ数num_point_attribs: 出力ジオメトリのポイント属性数 (法線 N が追加されたかの確認に使用)num_vertex_attribs: 出力ジオメトリの頂点属性数num_prim_attribs: 出力ジオメトリのプリミティブ属性数gpu_memory_used: この POP が使用している GPU メモリ量
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: 法線を計算してもシェーディングが真っ黒・破綻する
✅ Solution:
- Normals Action が
noactionのままになっていないか確認 (computeifnoneかalwayscomputeに設定) - Normal Output Attribute Scope が
Nになっているか確認 (別スロットだとマテリアルが法線を認識しない) - 前段で属性が壊れている場合は Facet POP で重複ポイントを統合してから法線を計算
❌ Problem: ハードエッジにしたいのにスムーズなまま陰影付けされる
✅ Solution:
- Angle パラメータが大きすぎないか確認 (90 度等にすると大半のエッジが共有のまま残る、30 度前後から試す)
- Normals Action を
alwayscomputeにして既存法線を計算し直す - Attribute Class が処理したい属性クラス (点 / 頂点) と一致しているか確認
❌ Problem: ノーマルマップ用の接線が正しく出ない
✅ Solution:
- Tangents Action が
noactionのままになっていないか確認 (alwayscomputeに設定) - Input Texture Coord Attribute に正しいテクスチャ座標属性が指定されているか確認 (接線はテクスチャ座標の張り方に依存)
- Input Normal Attribute に有効な法線が指定されているか確認 (接線計算には法線が必要)
参考資料 📚
その他 🔗
- TouchDesigner Wiki — POP 概要
- TouchDesigner Wiki — Category:POPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Normal POP
- POP 概要 (Points, Vertices and Primitives in POPs)
- Attribute POP (関連: 属性の汎用編集)
- 属性 (Attribute) の基礎

