Substance Painter のテクスチャを1枚にまとめるツールを作りました
Substance 3D Painter は、テクスチャセット(マテリアル)ごとに画像を分けて書き出します。ひとつのモデルにテクスチャセットが4つあれば、Base Color だけで4枚。Roughness と Normal も合わせると12枚。これを1枚にまとめる作業が毎回発生していました。
Photoshop でやると手間がかかるうえ、レイヤーを重ねる順番を間違えると気づかないまま実データが消えます。そこでブラウザだけで統合できるツールを作りました。
画像はサーバーに送信されません。読み込みも合成も書き出しも、すべてブラウザの中で完結します。通信を切った状態でも動きます。
使い方
- Painter から書き出した画像を、ツールにドラッグ&ドロップします。フォルダごと入れても構いません。
- ファイル名からオブジェクト名とマップ種別が自動で判定され、種別ごとにグループへまとまります。
- 左のグループを選び、右側で背景色やパディングを確認します。
- 「このグループを合成」で確認するか、「すべて合成して書き出し」で一気に PNG を書き出します。
再現できる操作例:透明PNG2枚を1枚に統合する
操作・画素確認:2026年10月12日
動作を追いやすくするため、256×256px・8bit RGBAの試験用PNGを2枚作り、公開ツールへ読み込ませました。左側に青い長方形、右側にオレンジの長方形があり、各画像のそれ以外の部分は透明です。Painterから書き出したデータではありません。

- 下の入力PNGを2枚保存し、ベイクマップ統合ツールへまとめて読み込みます。
- 左側で「Base Color」に2枚がまとまったことを確認します。末尾の
_BaseColor.pngが分類の目印です。 - パディングを0px、背景色を黒、ビット深度を8 bit/chにして「このグループを合成」を押します。
- 青とオレンジが両方残ることを確認して「PNG 書き出し」を押します。
入力:左側の青いPNG/右側のオレンジのPNG。比較用:今回ツールから書き出したPNG。ブラウザーで画像が開く場合は、画像の保存操作を使ってください。
| 確認項目 | 今回の結果 |
|---|---|
| 出力画像 | 256×256pxのRGBA PNG |
| 青い入力の不透明部分 | 10,240画素中、出力とRGBA値が異なる画素は0 |
| オレンジの入力の不透明部分 | 10,240画素中、出力とRGBA値が異なる画素は0 |
| 中央の未使用部分(x=128、y=128) | RGBA(0, 0, 0, 255)。指定した黒の不透明背景になった |
元の不透明画素と、出力の同じ座標を比較しました。例えば青はRGB(35,112,220)、オレンジはRGB(240,136,52)のままでした。透明な部分を残す試験ではなく、指定背景へ統合する例です。
この確認で扱ったのは、重なりのない8bit PNG2枚・パディング0pxの条件です。16bit保持、UVの重複、拡散・拡張の効果やすべての色管理を検証したという意味ではありません。自分の画像で結果が違うときは、まず寸法・末尾のマップ名・アルファの有無をこの例と比べてください。
Painter 側のパディングは 0 にしてください
ここが一番大事なところです。
書き出し設定の Dilation は「なし」に
実際に測ってみると、16px で 143 セル、8px で 58 セルが汚染されました。0px なら汚染はゼロです。
このツールのパディングは合成が終わってからかかります。どのオブジェクトも塗っていない場所にしか書かないので、値を大きくしても実データは壊れません。この非対称性が、わざわざツールを作った理由のひとつです。
パディングの2方式
| 拡散(既定) | どの島からも距離に応じて色が回り込みます。筋が出ません。Painter の Diffusion に近い挙動です。迷ったらこちら。 |
| 拡張 | 外周を1段ずつ、隣の確定した色の平均で外へ押し出します。境界は正確ですが、島から離れるほど、くさび状の継ぎ目や筋が残ります。 |
判定できるマップ種別
ファイル名の末尾から判定します。オブジェクト名に日本語が入っていても構いません。
| Base Color | basecolor / basecolour / albedo / diffuse / basecol |
| Roughness | roughness / rough / rgh |
| Metallic | metallic / metalness / metal / mtl |
| Emission | emission / emissive / emit / glow |
| Normal | normal / nrm / norm / n |
| Alpha | alpha / opacity / opac / transparency |
| Displacement | displacement / disp / height / hgt |
| AO | ao / ambientocclusion / occlusion / ambient |
マップ名の付いていないファイルは、同じ名前のオブジェクトが他にある場合に限り Base Color と推定し、それ以外は「未分類」に残します。勝手に決めつけて静かに混ぜないための作りです。
仕様として決めていること
色を変えない
読み込みから書き出しまで色空間の変換を行いません。単色の PNG を通しても RGB の値は 1 も変わりません。
16bit は 16bit のまま
16bit の画像は Canvas を通さない経路で読み書きするため、16bit のまま統合して書き出せます。Canvas は 8bit までしか扱えないので、そこを通すと静かに劣化します。
解像度が違うものは混ぜない
自動で拡大・縮小すると、気づかないまま画質が変わります。解像度が揃っていないグループはエラーで停止します。書き出し設定を揃えてから読み込んでください。
ZIP でまとめず、PNG を1枚ずつ出す
一度 ZIP 出力を作ったのですが、Windows が展開時に「問題を引き起こす可能性のあるファイルが見つかりました」として中身をまとめてブロックすることがあったため、外しました。PNG 単体なら問題なく開けます。
よくある質問
アルファが入っていない画像しかありません
アルファが実質的に無効な画像を検出すると、グループ内の画像の外周から未ベイクの色を推定して、色をキーにした合成へ自動で切り替えます。切り替えたときは必ず通知が出ます。黙って全面を上書きするのが一番まずいので、そこは必ず知らせるようにしています。
スマートフォンでも使えますか
横幅を必要とする3ペイン構成のため、パソコンでの利用を想定しています。狭い画面では横にスクロールしてください。
ファイルはアップロードされますか
されません。処理はすべてブラウザの中で完結しており、画像がサーバーに送られることはありません。