
概要 📖 – 点群を画像で描画する
Point Sprite MATは、ポイント群の各点をカメラ向きのテクスチャ付きビルボード矩形 (スプライト) として描画する MATです。ポイントクラウドや GPU パーティクル等の点ジオメトリに対し、Color Map で指定したテクスチャをカメラ正面向きの矩形 (ビルボード) として高速描画します。Sizing Model でピクセル単位の固定サイズかワールド単位の遠近補正サイズかを切替え、Attenuate Near/Far Distance によるカメラ距離減衰、pscale 点属性によるポイント別サイズ制御、Color Map の Offset によるアトラス UV クロップに対応します。Deform Page でボーンスキニングにも対応し、Common Page で標準的なブレンディング・深度テスト・アルファテスト等を持つ完全な描画 MAT です。
主な用途 🎯
- GPU パーティクル / ポイントクラウドのビルボード描画として、各ポイントに
Color Mapを貼り付けたスプライトを高速にレンダリング - 炎・煙・火花・水しぶきのテクスチャ付き粒子を、Particle SOP / Particles GPU の出力ポイントに対してスプライト合成 (Add 系ブレンディング併用)
- 距離減衰付きの星空 / 銀河 / 雪 / 降雨表現として、
Sizing Model = Constant/Attenuate+Attenuate Near/Farでカメラ距離による点サイズ変化を実装 - ワールド単位スケールの実体感あるスプライトとして、
Sizing Model = Perspective Correct+pscale属性を使い、地表に散らばる岩・草・群衆ビルボード等を遠近正しく描画 - Color Map の UV クロップによるスプライトシートとして、
Offset Left/Right/Bottom/Topでアトラステクスチャの一部だけを切り出してフレームアニメ表現 - Texture 3D / 2D Texture Array によるバリエーション付与として、ポイントごとに
wテクスチャ座標で配列内の異なるマップを選択 (キャラ顔差分・粒子バリエーション)
データフロー 🔄
入力: ポイント群 (SOP / GPU パーティクル) + Color Map (TOP)
↓
Geometry COMP が Point Sprite MAT をMaterialに指定
↓
各ポイントがカメラ向きビルボード矩形に展開され、pscale× Sizing Model に従って点サイズ決定
↓
Color Map と Color × Alpha を乗算してフレームバッファへブレンド
↓
出力: Render TOP 経由のスプライト画像
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Point Sprite Page 🎯
Color & Alpha .color 🎨
スプライトの基本色と不透明度
| 項目 | 内部名 | 説明 |
|---|---|---|
| Red | .colorr |
赤成分 (0.0 – 1.0) |
| Green | .colorg |
緑成分 (0.0 – 1.0) |
| Blue | .colorb |
青成分 (0.0 – 1.0) |
| Alpha | .alpha |
マテリアルの不透明度。ポイントの Cd[3] (point alpha 属性) と乗算される |
| Post-Mult Color by Alpha | .postmultalpha |
カラーをアルファで事後乗算するトグル (プリマルチプライドアルファ運用時に使用) |
Color Map & Texture Sampling .colormap 🖼️
スプライトに貼り付けるテクスチャと、UV テクスチャ座標のサンプリング設定
| 項目 | 内部名 | 説明 |
|---|---|---|
| Hold | .hold |
端のピクセルを引き伸ばし (clamp) |
| Zero | .zero |
範囲外は透明 / 黒 (border) |
| Repeat | .repeat |
テクスチャを繰り返しタイリング |
| Mirror | .mirror |
境界で反転しながら繰り返し |
| Color Map | .colormap |
スプライトに貼るテクスチャ TOP (Color と乗算される)。Texture 3D / 2D Texture Array を渡すと w 座標で配列内のマップを選択可能 |
Sprite Crop Offsets .offsets ✂️
Color Map の四辺 UV をクロップしてアトラス内の特定領域だけを描画:
- Offset Left:
offsetleftスプライトの左端 UV クロップ量 (0.0 – 1.0) - Offset Right:
offsetrightスプライトの右端 UV クロップ量 - Offset Bottom:
offsetbottomスプライトの下端 UV クロップ量 - Offset Top:
offsettopスプライトの上端 UV クロップ量
Point Size & Attenuation .pointsize 📏
スプライトのサイズ決定方式と距離減衰の設定群
| 項目 | 内部名 | 説明 |
|---|---|---|
| Constant/Attenuate | .constantattenuate |
Constant Point Size をピクセル単位として扱い、すべての点に一律適用 (距離減衰パラメータで遠近変化可)。Attenuate Point Scale = 0 のとき最終サイズは pscale × pointsize |
| Perspective Correct | .perspectivecorrect |
Constant Point Size をワールド単位として扱い、他のジオメトリと同様に遠近補正される (値 3 なら 3 ワールド単位幅のスプライト) |
| Constant Point Size | .pointsize |
スプライトの基本サイズ。単位は Sizing Model で決まる (ピクセル or ワールド単位) |
| Attenuate Point Scale | .attenpscale |
固定サイズと距離減衰サイズのブレンド係数 (0 = 固定 100%、1 = 距離減衰 100%)。Near / Far Distance と Near / Far Point Scale で減衰カーブが定義される |
| Attenuate Near Distance | .attennear |
カメラからこの距離以下のポイントには Near Point Scale が適用される境界距離 |
| Attenuate Far Distance | .attenfar |
カメラからこの距離以上のポイントには Far Point Scale が適用される境界距離 |
| Near Point Scale | .attensizenear |
Near Distance 以内のポイントに適用される距離減衰スケール |
| Far Point Scale | .attensizefar |
Far Distance 以遠のポイントに適用される距離減衰スケール |
| Size Affected by FOV/OrthoWidth | .sizeaffectedbyfov |
FOV / ortho width に応じてスプライトのピクセル幅を変化させるトグル (Sizing Model = Perspective Correct 時のみ有効)。カメラズームアニメ等で必要 |
Deform Page 🦴
Deform .dodeform 🦴
ボーンによるジオメトリ変形をこのマテリアル上で有効化:
- Deform トグル:
dodeformこのマテリアル上でスケルトン変形 (スキニング) を有効化
Get Bone Data .deformdata 📍
デフォームボーンデータの取得元
| 項目 | 内部名 | 説明 |
|---|---|---|
| From SOP | .fromsop |
SOP の capture 属性 (pCaptPath / pCaptData) から直接取得 |
| From MAT | .frommat |
別の MAT (ボーンキャプチャ元 MAT 等) からデフォームデータを継承 |
Bone Capture 設定 .bonecapture 🦴
Capture 属性とスケルトンルートの指定:
- SOP with Capture Data:
targetsoppCaptPath/pCaptData属性を持つ SOP のパスを指定 - pCaptPath Attrib:
pcaptpath使用する pCaptPath 属性名 (Bone Group SOP 通過後はpCaptPath0/pCaptPath1等に分割される) - pCaptData Attrib:
pcaptdata使用する pCaptData 属性名 (pCaptPath と対になる) - Skeleton Root Path:
skelrootpathスケルトンのルート COMP のパス - MAT:
matGet Bone DataがFrom MAT時に参照する他 MAT または ボーンキャプチャ元 MAT のパス
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: GPU パーティクルにスプライトテクスチャを貼って炎・煙を描画 🔥
Particles GPU → Render Pick TOP / pos texture → Geometry COMP (Material = Point Sprite MAT, Color Map = fire_atlas.tif) → Render TOP
GPU パーティクルから出力されたポイント群に対し、Point Sprite MAT で炎テクスチャを各ポイントに貼り付け、Add ブレンディングで合成することで高速な炎・煙エフェクトを描画します。各パーティクルは pscale 属性で個別サイズを持ち、Sizing Model = Constant/Attenuate で距離減衰させると遠近感が出ます。
- Particles GPU または Particle SOP でポイント群を生成 (pscale / age 属性を含める)
- Movie File In TOP で炎・煙のテクスチャ (黒背景 + 白〜橙の炎) を読み込み Color Map に指定
- Point Sprite MAT を作成し、
Color Mapに上記 TOP を割当、Colorを橙赤、Alphaを 1.0 に設定 - Common Page の
Blendingをオン、Source Color = Source Alpha/Destination Color = One(加算合成) を設定し、Write Depth Valuesをオフにして粒子の重なりが消えないようにする - Geometry COMP の
Materialに Point Sprite MAT のパスを指定して Render TOP で確認
Example 2: 点群を距離減衰付きで可視化 ✨
Kinect TOP / Depth → Point File In SOP / TOP to SOP → Geometry COMP (Material = Point Sprite MAT) → Render TOP
深度センサーやポイントクラウドファイルから取得した数十万点のポイント群を、距離減衰付きで可視化します。Sizing Model = Constant/Attenuate + Attenuate Near/Far Distance を設定することで近くの点は大きく、遠くの点は小さく描画され、立体感のある点群プレビューになります。
- Kinect / LiDAR データから Point File In SOP または TOP to SOP でポイント群を生成
- Point Sprite MAT を作成し、
Color Mapに白い円形テクスチャ (alpha 付き) を指定 Sizing ModelをConstant/Attenuateに、Constant Point Sizeを4(ピクセル) に設定Attenuate Point Scaleを1.0、Attenuate Near Distance = 1/Far Distance = 50、Near Point Scale = 2.0/Far Point Scale = 0.3でカメラ距離減衰を構成- Geometry COMP に割り当て、Camera COMP の位置を動かして遠近の点サイズ変化を確認
Example 3: Texture Arrayで粒子バリエーション 🎴
Texture 3D TOP (アトラス配列) → Point Sprite MAT (Color Map) → 各点が w 座標で異なるテクスチャを取得
葉っぱ・破片・雪などの「複数バリエーションを混ぜたい」表現で、Texture 3D TOP に複数枚のテクスチャを束ねた配列を作り、Point Sprite MAT の Color Map に渡します。各ポイントが UV の w 座標 (テクスチャ座標 3 軸目) で配列内のどのテクスチャを使うかを選択でき、SOP 側で uv[2] 属性に乱数を入れれば 1 つの MAT で多様な見た目を実現できます。
- Texture 3D TOP に複数枚のテクスチャを順に Cook して 1 つの配列にまとめる (例: 葉っぱ 5 種)
- 対象 SOP に Attribute Create SOP で
uv属性を作成し、uv[2] = rand($PT) * 4.99(5 種類のうち 1 つを乱数選択) - Point Sprite MAT の
Color Mapに Texture 3D TOP を指定、Extend W = Holdにして配列外参照を防ぐ Filter = Linear+Anisotropic Filter = 4xでサンプリング品質を確保- Geometry COMP に MAT を割当て、Render TOP で各点が異なるテクスチャになっていることを確認
関連オペレータ 🔗
類似機能OP 🔍
- Constant MAT — ライティングを無視した単色 / テクスチャ描画 MAT。Point Sprite と同じく Lit されない描画だが、ポイント群に対するビルボードスプライト機能を持たない
- PBR MAT — 物理ベースシェーディング MAT。サーフェスジオメトリ向けで、Point Sprite のようなビルボード化やポイント単位サイズ制御は持たない
組み合わせ推奨OP 🔄
- Particle SOP — CPU パーティクル SOP。Point Sprite MAT の対象として最も基本的な入力ソース
- Texture 3D TOP — Color Map に渡すアトラス配列を生成。
w座標でポイントごとに異なるテクスチャを選択するために必須 - Geometry COMP — Material パラメータに Point Sprite MAT のパスを指定する代表的な描画コンポーネント
- Render TOP — Point Sprite MAT で描画したジオメトリを最終的に画像化する 3D レンダリング TOP
前処理・後処理MAT 🎯
- 前処理: Constant MAT、PBR MAT
- 後処理: Null MAT、Out MAT
Info情報 📊
MAT は Info CHOP / Info DAT に接続することで、シェーダコンパイル状況やクック情報を取得できます。
汎用オペレータ情報 🔄
total_cooks: プロセス開始からの累計クック回数cook_time: 直近クックに要した時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 現在の警告数 (シェーダコンパイル警告含む)errors: 現在のエラー数 (シェーダコンパイルエラー含む)
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: スプライトが表示されない / 真っ黒な点しか出ない
✅ Solution:
Color Mapに有効な TOP が割り当てられているか確認。未割当だとColor × Alphaのみで描画され、Color が0,0,0なら真っ黒になる- Geometry COMP の
Materialパラメータが Point Sprite MAT を正しく参照しているか、ノードビューで接続を目視確認 - ポイントの
pscale属性が0になっていないか SOP 側で確認 (Point Sprite はpscale × Constant Point Sizeで最終サイズが決まるためpscale=0は無描画)
❌ Problem: スプライトのサイズが想定より小さい / 大きすぎる
✅ Solution:
Sizing Modelがピクセル単位 (Constant/Attenuate) かワールド単位 (Perspective Correct) かを確認。ワールド単位のつもりでピクセル値を入れていると桁が合わないAttenuate Point Scaleが0なら距離減衰は効かず固定サイズ、1なら完全に距離依存。中間値で固定と減衰がブレンドされるpscale点属性が想定の値かを Info CHOP または Attribute Create SOP で確認 (最終サイズはpscale × pointsize)
❌ Problem: Add ブレンディング (加算合成) で粒子が白飛びしないように調整したい
✅ Solution:
- Common Page の
Source Color = Source Alpha/Destination Color = Oneで標準的な加算スプライト合成になる Alphaパラメータを下げる、または Color Map の輝度を抑えて 1 枚あたりの寄与を減らす- Level TOP や HSV Adjust TOP を Color Map の前段に挟んで brightness を事前抑制する
❌ Problem: スプライトに深度の前後関係が乱れる / 後ろの粒子が手前を遮る
✅ Solution:
- Common Page の
Write Depth Valuesをオフにする (粒子は深度バッファに書込まないのが定石。これで透過粒子の重なりが正しくなる) Depth Test自体はオンのまま (Depth Buffer を読むだけ、書込まない)。完全に深度無視したいならDepth Testもオフ- 粒子同士のソート問題が残る場合は、上流の SOP / GPU パーティクル側でカメラ距離による Z ソートを行う
❌ Problem: Texture Array の w 座標で配列内のテクスチャを切替えたいが、全部 0 番が出る
✅ Solution:
- 対象 SOP の
uv属性が 3 成分 (vector3) になっているか確認。デフォルトのuvは 2 成分 (vec2) なのでwが常に 0 になる - Attribute Create SOP で
uvをvector3として再作成し、uv[2] = rand($PT) * (N - 0.01)(N=配列サイズ) で各点に異なる値を割当 Extend WをHoldに設定して配列外参照を防ぐ (Repeatだと境界でカラーマップが折返す)
参考資料 📚
その他 🔗
- TouchDesigner Wiki — MAT 概要
- TouchDesigner Wiki — Category:MATs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Point Sprite MAT
- Texture 3D TOP (Color Map に渡すテクスチャ配列の生成)
- Transparency (ブレンディング設定の公式ガイド)

