パッカーが各チャンネルを埋める仕組み
入力はテクセルごとに1つのグレー値として読まれます。Rec. 709の輝度、つまり0.2126 R + 0.7152 G + 0.0722 Bを丸めた値です。本物のグレーマップ(R = G = B)なら保存値とぴったり同じなので、グレーのバイトは変わらずチャンネルに入ります。色のある画像は輝度に混ぜられてしまい、データマップとしては望む結果になることはまずありません。
プリセットが決めるのは入力の行き先だけです。入力は入れた順に意味のあるチャンネルを埋め、配置が無視するチャンネルは0、使わないアルファは255で書くので、ファイルは不透明のままです。自動の反転はありません。Unityのスムースネスは1 − ラフネスなので、ラフネスマップを持っているならスムースネスのチャンネルで「反転」(255 − 値)を付けます。
ここではアルファもデータです。HDRP・URPのテクスチャではスムースネス0がアルファ0です。パッカーはCanvasではなく自前のエンコーダーで(32行ずつ)PNGを書くので、そうしたテクセルの下のメタリックやAOのバイトも残ります。入力はブラウザの画像デコーダーで読むため、透明度のあるファイルではなく普通のグレーPNGを入れてください。
データとして読み込みます。UnityのHDRPのページはマスクマップのsRGB (Color Texture)をオフにしTexture TypeをDefaultにするよう、URPのページはチャンネルパックテクスチャのsRGBをオフにするよう案内し、glTF 2.0はメタリックとラフネスの値をリニアと規定しています。
- マスクマップ
- Unity HDRPのパックテクスチャ。Rメタリック・G AO・Bディテールマスク・Aスムースネス。
- ORM
- R・G・Bにオクルージョン・ラフネス・メタリック。glTF 2.0の順で、GodotのORMMaterial3Dも同じです。
- 定数チャンネル
- 配置上マップが要らないため、全体を0か255で書いたチャンネル。
- 反転
- 255 − 値。1 − xの8ビット版で、ラフネスとスムースネスを相互に変換します。
例:同じ3枚のマップを3つの配置で
1テクセル分のグレーマップ3枚:AO 10、ラフネス 80、メタリック 220。割り当ての行はパッカーの表示形式です(数字 = 入れたファイル、⁻ = 反転)。
ORM (glTF 2.0, Godot 4) ファイル: ao, roughness, metallic R←1 · G←2 · B←3 · A←255 → (10, 80, 220, 255)
Unity HDRPマスクマップ ファイル: metallic, ao, roughness R←1 · G←2 · B←0 · A←3⁻ → (220, 10, 0, 175)
Unity URPパック ファイル: metallic, ao, roughness R←1 · G←2 · B←0 · A←3⁻ → (220, 10, 0, 175)
スムースネス = 255 − 80 = 175 (1 − 0.314 = 0.686)
ラボで測定:ORMプリセット (10, 80, 220, 255)、手動割り当て (220, 10, 80, 0)、R反転 (245, 80, 220, 255)
ディテールマスクがないので、HDRPとURPの行は同じです。HDRPはBをディテールマスクとして読み、URPは無視します。HDRPプリセットにファイルを3枚だけ入れると3枚目がBに入るため、上のようにBを0に、Aを3番のファイルの反転にしてください。
グレーマップごとの入れ先
| 手元のグレーマップ | Unity HDRPマスクマップ | Unity URPチャンネルパック | glTF 2.0 / Godot ORM |
|---|
| メタリック | R | R | B |
|---|
| アンビエントオクルージョン | G | G(テクスチャをOcclusionにも割り当てると読まれる) | R |
|---|
| ラフネス | A、反転(スムースネス) | A、反転(スムースネス) | G |
|---|
| ディテールマスク | B | — | — |
|---|
| そのチャンネルに入れるマップがない | 定数0(例:ディテールなしのB) | B = 0 | A = 255(未使用) |
|---|
Nerulioの「Unity メタリック+スムースネス」プリセットは組み込みStandardシェーダーのページ(G・Bは未使用)に従い、Gに0を書きます。URPでオクルージョンも使うなら、手動割り当てでAOのファイルをGにしてください。
出力されるファイル
| ファイル | 用途 |
|---|
rock_metallic-mask.png | パックしたテクスチャ。最初に入れたファイルの名前になります。8ビットRGBAのPNGで、アルファ0の場所のRGBも保持します。 |
|---|
rock_metallic-mask-channels.zip | 任意の確認用:パックしたファイルをチャンネル分解で開き、4つの平面を保存して入力と比べます。 |
|---|
パックしたテクスチャをエンジンで使う
各エンジンのドキュメントにある手順で、Nerulioがこの読み込みを実行したわけではありません。
- Unity HDRP:PNGを読み込み、
sRGB (Color Texture)をオフ、Texture TypeをDefaultにして、HDRP LitマテリアルのSurface InputsでMask Mapに割り当てます。マスクマップを割り当てるとMetallic・Smoothness・AOのRemappingスライダーが現れます。 - Unity URP:
sRGB (Color Texture)をオフにして読み込み、LitマテリアルのWorkflow ModeをMetallicにし、テクスチャをMetallic MapとOcclusion Mapに割り当て、Smoothness › Sourceは既定のMetallic Alphaのままにします。 - Godot 4:
ORMMaterial3Dを作り、ORMのPNGをORMテクスチャとして割り当てます。StandardMaterial3Dでも、ao_texture_channelをRed、roughness_texture_channelをGreen、metallic_texture_channelをBlueにすれば同じファイルを読めます。 - glTF 2.0:ORM画像をマテリアルのmetallicRoughnessテクスチャとして、オクルージョンを含むならオクルージョンテクスチャとしても参照します。ベースカラーは別のsRGB画像のままです。
結果の確認
- パックしたPNGを同じ配置でチャンネル分解で開きます。各平面は入れたグレーマップと同じはずで(機能チェックでambientCGのグレーマップによりバイト一致を確認)、反転したチャンネルは255 − 値のはずです。
- 定数チャンネルは、チャンネルの統計で最小 = 最大(0か255)と表示されます。
- エンジンで、粗い部分はにぶく、磨いた部分は鋭く見えるはずです。逆ならスムースネスのチャンネルを反転していません。
トラブルシューティング
| 症状 | 考えられる原因 | 確認方法 | 対処 |
|---|
| Unityで粗い部分がつるつるに見える | ラフネスを反転せずにアルファに入れた | Aを分解すると255 − ラフネスではなくラフネスそのもの | Aの「反転」を付けてパックし直す |
|---|
| マップが違うチャンネルに入った | 入力は入れた順にチャンネルを埋める | プレビュー下の割り当ての行(例:R←1 · G←2 · B←3 · A←255) | 各チャンネルのプルダウンで正しいファイルを選ぶ |
|---|
| 「All channel inputs must have the same dimensions」 | 1枚だけサイズが違う | ファイル一覧に各サイズが出る | 先に全マップを同じサイズで書き出す |
|---|
| URPのマテリアルが環境光で暗くなる | テクスチャをOcclusionにも割り当てたが、UnityプリセットがGに0を書いた | Gを分解すると最小 = 最大 = 0 | 手動割り当てでAOのファイルをGにするか、Occlusion Mapを空にする |
|---|
| 読み込み後、全体がてかりすぎ・つや消しすぎ | パックテクスチャをsRGBオンのまま読み込んだ | UnityのテクスチャのsRGB (Color Texture) | sRGBをオフにする。値はデータ |
|---|
| チャンネルの値が想定と違う | 色のある入力が輝度にまとめられた | 入力がグレーでない(R・G・Bが異なる) | 色のある元画像を先に実際のチャンネルへ分解し、その平面をパックする |
|---|
ほかの方法
| 方法 | こんなときに向いています |
|---|
| パックせずGodotのチャンネル選択を使う | Godotのみ。StandardMaterial3Dは1枚のテクスチャの任意のチャンネルからマップを読むため、順番が違うだけの既存のパックファイルはパックし直す必要がありません。 |
|---|
| テクスチャリングソフトの書き出しプリセット | マップを描いたツールがエンジンの配置で直接書き出せるとき。GodotのドキュメントはORM用としてSubstance PainterとArmorPaint(Unreal Engineプリセット)を挙げています。 |
|---|
| Shader Graph(Unity) | どのプリセットにもない配置を使うとき。UnityのURPのページも、チャンネルを別の順でパックした場合はShader Graphを案内しています。 |
|---|
バージョンと出典
テクスチャラボで測定(docs/TEXTURE-LAB.md):AO 10 / ラフネス 80 / メタリック 220にORMプリセットを使うと、ラボ内でもこのページでも(10, 80, 220, 255)。手動割り当ては(220, 10, 80, 0)、R反転は(245, 80, 220, 255)。ブラウザの機能チェックはambientCGのグレーマップ3枚をパックし、各チャンネルが入力とバイト一致することを確認します。配置は下記のドキュメント(GodotのORMの順序はエンジンのソース)に基づき、エンジンへの読み込みは実行していません。
参照した公式ドキュメント
RGBAマスクを結合
同じサイズの画像の明度をR・G・B・Aに割り当てます。
使い方
- 画像を追加
- 設定を調整して結果を確認
- 新しいファイルを保存
対応形式
PNG / JPG / WebP / AVIF / HEIC → PNG — 入力のデコードはブラウザ対応と追加エンジンに依存します。
このツールでできること
同じサイズの画像の明度をR・G・B・Aに割り当てます。
処理方式と検証状況
advanced · sequential row-transfer channel packing / incremental PNG. 品質検証中です。Pro・Flagship水準はまだ実証されていません。
書き出す前に
入力寸法は一致必須。リニア色空間変換なしでCanvasの明度値を使用します。