Blenderを使ってゲームエンジンでよく使うパッキングテクスチャを作る
AOやRoughnessなど1チャンネルの情報を、それぞれテクスチャを分けるのではなくRGBに振り分けて1ファイルで3チャンネル分収録してしまう手法があります。ゲーム開発を中心に定番の手法です。
例えば
- Occlusion = R
- Roughness = G
- Metallic = B
と振り分けるORMパターンはよく見かけます。ゲームエンジンによってチャンネルの呼び方・性質が似ているようで微妙に異なることもあります。
UE5のサンプルであるマネキンのマテリアルを見てみると、下記のようになっています。
- Metallic = R
- Spec = G
- Roughness = B
という振り分けでした。
このアセットではこれらは 「Mask Textures」 と総称され、テクスチャ3枚・9チャンネルで構成されていました。
ほかにもHeightを含んだり、AlphaにIDを仕込んだりといったケースもあるようです。
つくる
こういったRGB各チャンネルに別々の情報をパッキングした画像は、PhotoshopやAffinity Photoなどだいたいの画像編集ツールで作れますが、難しくはないものの手数は微妙にかかったりします。
ここでは Blender のCompositeを使って出力してみたいと思います。
- LayoutをCompositingに切り替える
- Input Imageノードで各チャンネルのテクスチャを読み込む
- Combine ColorノードのRGBチャンネルに接続
- File Outputノードで出力先を指定
- Renderメニューの「Render Image」でレンダリング実行
出力されたファイルは適宜リネームしてゲームエンジンなどで利用します。
補足
ではどの情報をどのチャンネルに収録するか?というのが問題になります。
3D人さんのアンケートを引用してみます。
上記マネキンの例だとMSR(とAnisAOPaintMsk)
またブログ「EnvironmentHolic」の関連記事では「OSM/ORM/MOHS/MOHR」が例示されています。
内製エンジンだと、開発者の想定した順が仕様になってたりもしそうですね。
また、EpicJapanを経て引き続きUEFN界隈で積極的に活躍しておられる塩谷さんも、このトピックでコミュニティに寄稿しておられます。パッキング順はORMです。
プラグインを使ってパッキングする手順を紹介していて、ツールを跨がずエンジン内で完結するフローは素敵だなと思いました。※20240725追記: UE5.4で実験的機能として登場したTextureGraphを用いて、UE内で同テクスチャを出力できるようです。下記のスライド87〜91参照↓
この「こういう構造になっているテクスチャ」の総称ってあるんだろうか?と一瞬考えたりもするんですが、一応パッキングテクスチャで慣例的に通じる場面が多いので記事タイトルもそのようにしておりました。Epicのサンプルでマスクテクスチャになっているので、マスクテクスチャをひっそり推して行ってもいいかもしれません。
Discussion