Substance Painterのシェルフは、実体としてはフォルダの規約だ。どのファイルをどのフォルダに置くかが決まっていて、置いてアプリに戻ると出てくる。逆に言えば、置き場所を1つ間違えるといつまでも出てこない。
実機の Substance 3D Painter 12.1.3 について、ユーザー側シェルフの全フォルダに同梱されている README、同梱のPython APIドキュメント、UI文字列リソースの3つを突き合わせた。以下はその実測値だ。マテリアルの作り方そのものはスマートマテリアル活用術で扱っているので、ここでは置く・整理する・配る側だけを見る。
自作アセットはどのフォルダに置く?
ユーザー側シェルフは Documents\Adobe\Adobe Substance 3D Painter\assets\ にあり、17個のフォルダに「何を置くか」を書いたREADMEが同梱されている(16個は直下に、presets だけは4つのサブフォルダそれぞれに置かれている)。その内容をまとめるとこうなる。
| フォルダ | 置くもの(READMEの記載) |
|---|---|
alphas |
sbsar・画像(アルファ) |
materials |
sbsar・画像(マテリアル) |
smart-materials |
*.spsm |
smart-masks |
*.spmsk |
generators |
sbsar(ジェネレータ) |
effects |
sbsar(エフェクト) |
procedurals |
sbsar・画像(ステンシル) |
textures |
画像(レイヤー背景用) |
environments |
画像(環境マップ) |
colorluts |
画像(LUT) |
export-presets |
*.spexp |
shaders |
glslシェーダー |
fonts |
*.otf / *.ttf |
postfx |
postfxリソース・画像 |
emitters / receivers |
パーティクルのスクリプト |
presets/brushes |
*.sppr(ブラシ) |
presets/materials |
*.sppr または *.abr |
presets/tools / presets/particles |
*.sppr |
⚠️ procedurals はステンシルの置き場だ。フォルダ名から「プロシージャルテクスチャ」を想像すると外す。READMEの原文も “to be used as stencils” と書かれている。プロシージャルなsbsarをマテリアルとして使いたいなら materials に置く。
もう1つ、ユーザー側には templates フォルダが無い。同梱側には18フォルダあり、差はこの1つだけだった。プロジェクトテンプレートの扱いはテンプレート自作の記事にまとめてある。
置いたのに出てこないときは?
アプリのウィンドウをクリックして戻るだけでいい。APIドキュメントには「すべてのシェルフフォルダのリソース探索を強制する。探索はアプリケーションウィンドウがフォーカスを得たときにも自動的に行われる」と書かれている。つまりエクスプローラでファイルを置き、Painterに切り替えれば読み込まれる。
ただしシェルフそのものを追加・削除する操作は、プロジェクトを閉じてからでないと失敗する。アプリは「シェルフの追加に失敗しました。現在のプロジェクトを閉じる必要があります。」と、削除側にも同じ条件の「シェルフの削除に失敗しました。現在のプロジェクトを閉じる必要があります。」という2つのメッセージを持っている。
同梱シェルフは書き換えられない
シェルフには読み書きできるものとできないものがある。APIドキュメントの記述はこうだ。
リソースは、読み取り専用シェルフでない限りシェルフに読み込める。アプリケーションと一緒にインストールされるSubstanceシェルフは読み取り専用である。ファイルシステム上のパスが読み取り専用である場合も、そのシェルフは読み取り専用になる。
ここで大事なのは後半だ。自作シェルフでも、置いた場所の書き込み権限が無ければ同じ扱いになる。ネットワークドライブや共有フォルダをシェルフにするときは、読み取り専用で運用するのか書き込ませるのかを先に決めておく。
なお既定の保存先は固定ではない。user_shelf() の説明には「これはユーザーのDocumentsフォルダにあるシェルフで、新しいリソースは既定でここに作られる。ユーザーは設定で別の既定シェルフを選べる」とある。
リソースは3か所のどこかに居る
APIの ResourceID は、リソースの居場所を3通りで指す。「シェルフに置いた」と「プロジェクトに埋め込まれた」は別の状態だと理解しておくと、配布のときに事故が減る。
| 居場所 | 意味 |
|---|---|
シェルフ(from_url) |
resource://シェルフ名/リソース名?version=… で参照する |
プロジェクト(from_project) |
プロジェクトファイルに埋め込まれている |
セッション(from_session) |
そのセッションで読み込んだだけ。保存しなければ消える |
シェルフ参照はシェルフ名(コンテキスト)+リソース名+バージョンで解決される。だから他人の環境でシェルフ名が違うと解決できない。実際アプリは「出力テンプレート %2 はライブラリまたはプロジェクトキャッシュ内で見つかりませんでした。デフォルト値にリセットされました。」というメッセージを持っている。エラーで止まらず、既定値に戻って続行するのが厄介なところだ。
フィルタ結果をサブシェルフとして残す
絞り込んだ状態そのものを保存する仕組みもある。ツールチップの原文は「現在のフィルターからサブシェルフを作成します。自動切換えを無効にするには、Shift キーを押したままにします。」だ。「デフォルトのシェルフプリセットを非表示にする」もあるので、自作アセットだけを並べた作業用の棚を作れる。
🔎 実測した範囲:ユーザー側シェルフ17フォルダ(+presets の4サブフォルダ)に同梱されたREADMEの原文、同梱Python APIドキュメントの resource モジュール、UI文字列リソース(.qm)を読んだところまでが実測値だ。実際にアセットを置いてアプリで表示を確認する操作はしていないので、挙動の説明はドキュメントとアプリ内文言に基づく。フォルダ構成と件数は当機での実測。
まとめ:置き場所と権限を先に決める
- シェルフはフォルダの規約。README原文どおりの拡張子・種別で置く
- 🔴
proceduralsはステンシル置き場。名前から誤解しやすい - 置いたらアプリに戻るだけで読み込まれる。シェルフの追加・削除はプロジェクトを閉じてから
- 同梱シェルフは読み取り専用。自作シェルフもパスの権限が無ければ同じ
- シェルフ参照はシェルフ名込みで解決される。見つからないとエラーではなく既定値に戻る
アセットを置いたのにシェルフに表示されません。
チームで自作マテリアルを共有したいのですが、どう配るのが安全ですか?
プロシージャルなsbsarを入れたのにステンシルとして出てきます。
procedurals になっている可能性が高いです。このフォルダのREADMEは「ステンシルとして使うsbsarと画像を置く」と定義しています。マテリアルとして使いたいなら materials、ジェネレータとして使いたいなら generators に置きます。既定の保存先をDocuments以外に変えられますか?
user_shelf() の説明に「ユーザーは設定で別の既定シェルフを選べる」とあり、関数の戻り値もその設定を反映するとされています。SSDの空き容量が厳しい場合や、アセットを別ドライブで管理したい場合はここを移します。

コメント