
概要 📖 – Diffuse / Specular ライティングの標準シェーダ
Phong MATは、Diffuse / Specular / Ambient の古典ライティングモデルでオブジェクトを陰影付けし、各種テクスチャマップを合成する TouchDesigner 標準の MATです。PBR が物理ベースの新世代モデルである一方、Phong はパフォーマンス重視 / 軽量シェーディング向け。アーティスティックなコントロールが必要なケースで今でも広く使われます。
主な用途 🎯
- Diffuse + Specular + Ambient による標準的なライティングシェーディング
- Color Map / Normal Map / Specular Map 等の各種テクスチャマップ適用
- Bump / Parallax / Displacement マッピングによる擬似 3D 凹凸
- Environment Map による疑似反射 (Sphere Map / Cube Map)
- Two-Sided Lighting でポリゴンの両面ライティング制御
データフロー 🔄
入力: Diffuse / Specular / Ambient カラー + 各種マップ TOP + Light COMP
↓
古典 Phong シェーディング計算 (Diffuse + Specular + Ambient + Emit)
↓
出力: Geometry COMP の Material 入力へ
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
RGB Page 🎨
Base Colors .basecolors 🎨
Diffuse / Ambient / Specular / Emit / Constant のライティング色設定
| 項目 | 内部名 | 説明 |
|---|---|---|
| Ambient uses Diffuse | .ambdiff |
オンのとき Ambient に Diffuse 値を流用する |
| Diffuse | .diff |
ディフューズ (拡散光) として反射される色。最も基本的なマテリアル色 |
| Ambient | .amb |
アンビエント (環境光) として反射される色 |
| Specular | .spec |
スペキュラ (鏡面反射) の色。光沢のあるハイライト部分の色味 |
| Emit | .emit |
ライトが当たっていなくても自発的に発する色 (自己発光) |
| Constant | .constant |
最終色に加算される定数色。finalcolor += Point Color * Constant Color |
| Shininess | .shininess |
スペキュラハイライトの収束度。高いほどプラスチック / 金属のように鋭い光沢 |
Maps Overview .mapsoverview 🖼️
Phong MAT は多数のマップ TOP を受け付けます。各マップに対し独立した Extend / Filter / Sampling Mode パラメータが提供されます (詳細は公式 docs):
- Color Map: ライティング結果に乗算される TOP テクスチャ
- Normal Map (Bump): 法線マップ。タンジェント属性を持つジオメトリが必要
- Height Map / Parallax / Displacement: 高さマップで凹凸 / パララックス / 実頂点変位を表現
- Diffuse / Specular / Emit Map: Diffuse / Specular / Emit カラーに個別に乗算される TOP
- Environment Map: 疑似反射用のスフィアマップ / キューブマップ
Alpha Page 🌫️
Alpha Settings .alphasettings 🌫️
アルファマップとビューイングアングル依存のアルファ制御
| 項目 | 内部名 | 説明 |
|---|---|---|
| Alpha Map | .alphamap |
オブジェクトのアルファに乗算される TOP マップ。Red チャンネルのみ使用 |
| Uniform Alpha | .alphamode |
オフのとき、ポリゴン法線とカメラの角度でアルファが変化する |
| Alpha Front | .alphafront |
法線がカメラを向いているピクセルのアルファ値 |
| Alpha Side | .alphaside |
法線がカメラに対して横向きのピクセルのアルファ値 (非 Uniform 時) |
| Alpha Rolloff | .rolloff |
Front / Side 間のアルファ補間の急峻さ |
Lighting Page 💡
Two-Sided Lighting .twosidedlighting 💡
ポリゴンの表裏それぞれをどうライティングするか
| 項目 | 内部名 | 説明 |
|---|---|---|
| Polygon Front Faces | .frontfacelit |
表面の法線をどうライティングに使うか |
| Polygon Back Faces | .backfacelit |
裏面の法線をどうライティングに使うか |
Shader Generation .shadergen 🛠️
Phong 相当の GLSL シェーダコードを書き出すユーティリティ:
- Output Shader …: ボタン。現在の Phong 設定と同等の GLSL MAT + Text DAT を生成。シェーダはレンダリングされた構成に依存して選択肢が変わる
Deform Page 🦴
Deform .dodeform 🦴
ボーン変形 (スキニング) の設定群:
- Deform トグル: ボーン変形をマテリアル上で有効化
- SOP with Capture Data:
pCaptPath/pCaptData属性を持つ SOP - Skeleton Root Path: スケルトンのルート COMP のパス
Common Page 🔧
Blending .blending 🎨
色のブレンディング (透過合成) に関する設定群
| 項目 | 内部名 | 説明 |
|---|---|---|
| Add | .add |
ソースとデスティネーションを加算 |
| Subtract | .subtract |
ソースからデスティネーションを減算 |
| Reverse Subtract | .revsubtract |
デスティネーションからソースを減算 |
| Minimum | .minimum |
両者の最小値を採用 |
| Maximum | .maximum |
両者の最大値を採用 |
| Blending (Transparency) | .blending |
透過効果のためのカラーブレンディングを有効化するトグル |
| Separate Alpha Function | .separatealphafunc |
アルファチャンネルのブレンド設定を RGB と独立させる |
| Blend Constant Color | .blendconstant |
constantcol 系オプション選択時に使用する RGB 定数カラー |
| Blend Constant Alpha | .blendconstanta |
constanta 系オプション選択時に使用する定数アルファ値 |
| Legacy Alpha Behavior | .legacyalphabehavior |
旧バージョンのアルファ処理との後方互換を有効化 |
| Post-Mult Color by Alpha | .postmultalpha |
ブレンド演算完了後に RGB を計算後アルファで乗算 |
Depth Test .depthtest 📏
デプステスト (Z 比較) によるオクルージョン制御
| 項目 | 内部名 | 説明 |
|---|---|---|
| Less Than | .less |
新ピクセルのデプスが既存より小さい (手前) なら描画 |
| Less Than or Equal | .lessorequal |
新ピクセルが既存以下なら描画 |
| Equal | .equal |
デプスが完全一致時のみ描画 |
| Greater Than | .greater |
新ピクセルが既存より大きい (奥) なら描画 |
| Greater Than or Equal | .greaterorequal |
新ピクセルが既存以上なら描画 |
| Not Equal | .notequal |
デプスが一致しない場合のみ描画 |
| Always | .always |
デプス比較を行わず常に描画 |
| Depth Test | .depthtest |
デプスバッファとの比較によるオクルージョンを有効化 |
| Write Depth Values | .depthwriting |
デプステストを通過したピクセルのデプス値をデプスバッファに書き込む |
Alpha Test .alphatest 🔍
アルファ値に基づくピクセル単位の破棄判定
| 項目 | 内部名 | 説明 |
|---|---|---|
| Less Than | .less |
アルファが閾値より小さいピクセルを残す |
| Less Than or Equal | .lessorequal |
アルファが閾値以下のピクセルを残す |
| Greater Than | .greater |
アルファが閾値より大きいピクセルを残す |
| Greater Than or Equal | .greaterorequal |
アルファが閾値以上のピクセルを残す |
| Discard Pixels Based on Alpha | .alphatest |
ピクセル単位でアルファによる破棄判定を有効化 |
| Alpha Threshold | .alphathreshold |
アルファ比較の閾値。条件外のピクセルは破棄される |
Wire Frame .wireframe 🕸️
ジオメトリをワイヤーフレーム表示する設定
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
通常のソリッド描画 (ワイヤーフレーム無効) |
| OpenGL Tesselated Wire Frame | .tesselated |
OpenGL が三角形分割した状態でワイヤーを描画 |
| Topology Wire Frame | .topology |
元のポリゴントポロジ (四角形等) のままワイヤーを描画 |
| Line Width | .wirewidth |
ワイヤーフレームの線の太さ (ピクセル単位) |
Cull Face .cullface 🔺
ポリゴンの表裏どちらを描画するか (カリング) の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| Use Render Setting | .userender |
Render TOP 側の設定に従う |
| Neither | .neither |
両面とも描画 (カリングなし) |
| Back Faces | .backfaces |
裏面をカリング、表面のみ描画 |
| Front Faces | .frontfaces |
表面をカリング、裏面のみ描画 |
| Both Faces | .bothfaces |
両面をカリング (= 何も描画されない) |
Polygon Depth Offset .polygonoffset ↔️
Z-fighting 対策としてポリゴンのデプス値をオフセット
| 項目 | 内部名 | 説明 |
|---|---|---|
| Polygon Depth Offset | .polygonoffset |
ポリゴンのデプス値オフセット機能を有効化 |
| Offset Factor | .polygonoffsetfactor |
デプス勾配に対するオフセットの乗数 |
| Offset Units | .polygonoffsetunits |
デプス単位の固定オフセット量 |
Color Space .parmcolorspace 🌈
カラーパラメータの色空間 / 基準白色の解釈
| 項目 | 内部名 | 説明 |
|---|---|---|
| sRGB | .srgb |
SDR sRGB トランスファ関数 (一般的なディスプレイ標準) |
| sRGB – Linear | .srglinear |
SDR リニアトランスファ |
| Rec.601 (NTSC) | .rec601ntsc |
SDR NTSC 規格 (旧テレビ放送) |
| Rec.709 | .rec709 |
SDR ビデオ規格 (HD テレビ) |
| Rec.2020 | .rec2020 |
HDR 放送規格 (4K/8K UHD) |
| DCI-P3 | .dcip3 |
HDR シネマ規格 (D65 ホワイトポイント) |
| DCI-P3 (D60) | .dcip3d60 |
HDR シネマ規格 (D60 ホワイトポイント) |
| Display-P3 (D65) | .displayp3d65 |
HDR sRGB ガンマ (Apple ディスプレイ等) |
| ACES2065-1 | .aces2065-1 |
HDR リニアシネマ規格 (アーカイブ用) |
| ACEScg | .acescg |
HDR リニアシネマ作業用色空間 |
| Passthrough | .passthrough |
色空間変換を行わずそのまま渡す |
実践アイデア 💡
Example 1: Diffuse + Color Map によるテクスチャマッピング 🖼️
Movie File In TOP → Phong MAT (Color Map) → Geometry COMP → Light COMP → Render TOP
最も基本的なテクスチャ付きライティング。Color Map にテクスチャを貼り、Light COMP の Diffuse 計算で陰影をつけます。
- Movie File In TOP で画像を読み込み
- Phong MAT の
Color Mapに TOP を指定、Diffuseを白に設定 - Geometry COMP に SOP + Phong MAT、シーンに Light COMP を 1 つ配置
- Render TOP で確認、テクスチャに陰影が乗った状態で表示される
Example 2: Normal Map による擬似的な凹凸表現 🪨
Normal Map TOP → Phong MAT (Normal Map + Color Map) → Geometry COMP (tangent 属性必須) → Render TOP
平面ジオメトリでも、Normal Map を貼ることで凹凸があるように見せられます。Attribute Create SOP でタンジェント属性を生成しておくのが必須。
- Attribute Create SOP でジオメトリに
tangent(T[4]) 属性を生成 - Phong MAT の
Normal Mapに法線テクスチャ TOP を割当 Bump Scaleで凹凸の強度を調整- Light COMP の方向を変えると、平面でも凹凸表現が動的に見える
Example 3: Environment Map による疑似反射 🪞
Render TOP (Render Cube Map) → Phong MAT (Environment Map) → Geometry COMP → Render TOP
Sphere Map または Cube Map で疑似的な周囲反射を実現。完全な反射ではないが、リアルタイムでそれっぽい質感を得るには十分です。
- 別 Render TOP で Cube Map を生成 (Render Cube Map 設定)
- Phong MAT の
Environment Mapにその TOP を割当 - 純反射的に見せたい場合は
Diffuse/Specularを 0 に - オブジェクトの動きや回転に応じて反射が変化する
関連オペレータ 🔗
類似機能OP 🔍
- PBR MAT — Metallic / Roughness ベースの新世代物理レンダリング
- Constant MAT — ライティングを行わないフラットシェーディング
- GLSL MAT — カスタム GLSL シェーダを書く際の上位互換 MAT
組み合わせ推奨OP 🔄
- Geometry COMP — Phong MAT を割り当てるレンダリング対象
- Light COMP — Phong の Diffuse / Specular 計算に必要なライト光源
- Render TOP — Phong マテリアル付きジオメトリを最終 2D 画像に描画
- Camera COMP — ビュー視点を提供。Specular ハイライトの位置はカメラ位置に依存
- Attribute Create SOP — Normal Map 用のタンジェント属性を生成
前処理・後処理MAT 🎯
- 前処理: Constant MAT、GLSL MAT
- 後処理: PBR MAT、Wireframe MAT
Info情報 📊
MAT は Info CHOP / Info DAT に接続することで、シェーダコンパイル状況やクック情報を取得できます。
汎用オペレータ情報 🔄
total_cooks: プロセス開始からの累計クック回数cook_time: 直近クックに要した時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 現在の警告数 (シェーダコンパイル警告含む)errors: 現在のエラー数 (シェーダコンパイルエラー含む)
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: Phong MAT を当てても真っ黒で何も見えない
✅ Solution:
- シーンに Light COMP が存在し、Render TOP の Light 入力に接続されているか確認 (Phong はライトが無いと真っ黒)
Ambient色を一時的に上げる (例: 0.2, 0.2, 0.2) と最低限のベース色が確認できる- デバッグとして一度 Constant MAT に切り替えてジオメトリ / カメラ / Render TOP の構成が正しいか確認
❌ Problem: Normal Map を貼っても凹凸表現にならない
✅ Solution:
- ジオメトリに
tangent属性 (T[4]) が存在するか確認、無ければ Attribute Create SOP で生成 Bump Scaleが 0 になっていないか確認- Normal Map TOP のカラースペースが
linearとして解釈されているか確認 (sRGB だと法線情報が歪む)
❌ Problem: Specular ハイライトが見えない / 動かない
✅ Solution:
Specular色が黒になっていないか確認Shininessを下げる (例: 10〜30) とハイライトが広がって見えやすくなる- Camera COMP の位置とライト位置が同方向だとハイライトが見えない、ライトとカメラの角度を変えて検証
❌ Problem: テクスチャマップを貼ったのに反映されない
✅ Solution:
- ジオメトリに UV 属性が存在するか確認 (
uvattribute)、なければ Texture SOP 等で生成 - 対象マップパラメータ (Color Map / Diffuse Map / Specular Map 等) のサンプリング座標 (
SOP Texture Coord) が正しいか確認 Filterが Nearest になっていてピクセル化していないか確認
参考資料 📚
公式リソース 📖
- TouchDesigner公式ドキュメント – Phong MAT
- MAT 概要ページ
- Category:MATs (一覧)
- Two-Sided Lighting
- Texture Sampling Parameters


