InstaMAT事始め

現在のCG業界では物理ベースレンダリング(PBR)が主流となり、そのためのテクスチャを編集するツールとしてSubstance 3D製品が大きなシェアを持つようになりました。
Photoshopのような画像編集ソフトでは複数の関連する画像を編集しづらく、また、実際の3Dオブジェクトをチェックしながら編集することが難しいです。
Substance 3D製品はその点、Substance 3D Painterで3Dメッシュに対するテクスチャリングができますし、Substance 3D DesignerやSamplerを使うことでタイリングテクスチャの生成もできます。
他にも似たようなツールがないわけではないのですが、Substance 3Dほど気軽に、かつ網羅的に使えるツールは他にありませんでした。

そんな中に登場したのがドイツにあるAbstract社がリリースした『InstaMAT』です。
この会社は『InstaLOD』という3Dモデルのリダクションツールもリリースしています。いわゆる『Symplygon』の競合ツールですね。

InstaMATはSubstance 3DのPainter / Designer / Samplerを合わせたようなツールです。
Substance 3Dではこれらの3つのアプリはそれぞれ別々のアプリとなっています。
これに対してInstaMATは同じアプリ内でこれらの機能を利用することができます。
と言ってもやはり役割が違うため、それぞれの機能ごとにUIの差があります。
これは場合によっては混乱するかもしれませんが、1つのパッケージ内にグラフのプロジェクト、ペイントのプロジェクトといったものをまとめておくことも可能です。
最近リリースされたばかりのツールではありますが、かなり機能は充実していて実戦投入も可能だろうと考えます。

というわけで、今回はInstaMATの紹介として、簡単な操作案内とElement Graphを用いたタイルマテリアルの作成をやってみます。

まずはアプリを立ち上げ、新規プロジェクトを作成してみます。
使用するバージョンは1.5で、ちょうど昨日アップデートしたようです。このバージョンで日本語対応もされました。
新規プロジェクト作成時は以下のようなウィンドウが表示されます。

LayeringはPainter、Material LayeringとMaterialize ImageはSampler、そこからしたがDesignerといった感じです。
今回は普通のDesignerと同等のElement Graphを利用します。

テンプレートを選択します。
とりあえずPBRマテリアルを作成する場合はPBRテンプレートを選択したほうがいいです。
今回はテンプレートを使用せず、空の状態からスタートします。

ノードも何も無いシンプルな画面ですが、この状態だとマテリアルの確認ができません。
左上の赤枠で示す3Dキューブをクリックします。これで左側に3Dペインが表示されます。
SDと違って、3Dウィンドウの操作にはALTキーが必要になります。SubstanceでもPainterなんかは必要なのですが、SDばかり使ってる人間としてはちょっと面倒です。

まず適当なノードを配置してみます。
真ん中のグラフペインでスペースキー、もしくはマウス右クリックをします。
検索ウィンドウが表示されますので、[Solid Color]と入力してノードを選択します。SDと同様、スペースキーも名称に含まれるので注意が必要です。
右のノードパラメータペインで適当な色を選択します。[Color]パラメータを右クリックすればカラーパレットが表示されます。
このノードの[Output]コネクタをクリックするか、ノードを選択してVキーを押すと左下の2Dペインに画像が表示されます。
また、ノードを右クリックして[マテリアルチャンネルとしてプレビュー]→[Output]→[BaseColor]と選択して3Dペインへ反映させることができます。

SDと違ってノード自体をダブルクリックしてしまうとノードの実装にジャンプしてしまうので注意しましょう。
手癖でダブルクリックしてしまって開くつもりがなかったノード実装を開いてしまうことがどうしても多いです。
また、グラフエディタの操作も結構SDと違うので、慣れるまでは戸惑うと思います。というか、全然慣れないです。

さて、いちいち右クリックして出力先を選ぶのは面倒なので、出力ノードを作成してしまいましょう。
SDではOutputノードを配置していましたが、InstaMATではグラフのパラメータとして出力を作成することでOutputノードが生まれます。
グラフエディタでノードのない場所をクリックし、右のパラメータペインで出力を追加します。

出力右の+ボタンを押して、型を選択して追加します。
出力の型は[ElementImage]か[ElementImageGray]にします。これはイメージ情報として出力することを意味します。
BaseColorとNormalはElementImage、RoughnessとMetalnessとHeightはElementImageGrayにします。 追加された段階では"Parameter"というパラメータ名になっていますが、これを適切な出力名に変更する必要があります。
名前をダブルクリック、もしくはF2キーでリネームします。このとき、マテリアルパラメータとして登録されているものは検索可能です。
BaseColorであればbと入力した段階でBaseColorが候補に出てきますので、選択すればOKです。
しかもマテリアルパラメータの場合はパラメータ名右側のカテゴリー名も自動的にMaterialに変更されるので便利です。
とりあえず必要そうなパラメータを追加し、グラフエディタでノードを整頓しましょう。
追加した出力ノードをまとめて選択、右クリックからの[コメント]を選択するとSDのフレームと同等のものを追加できます。

それではタイルを作っていきましょう。
まずは以下のようにノードを追加、接続します。

[Tile]ノードは入力イメージをタイル上に配置するノードで、SDでも同様のものがありますね。
入力イメージとしては[Rounded Box]を利用します。サイズやタイルの数は適当に調整します。

この段階ではノードは高さ情報ですので、カラーではなくグレースケールとして設定します。
SDではアトミックノード以外はカラーとグレースケールで別々のノードとなっていましたが、InstaMATはノードに切り替えスイッチが存在しています。
パラメータペインの[インスタンスのプロパティ]カテゴリーの[グレースケール]スイッチを入れることでグレースケールに変更できます。便利。

また、[Tile]ノードは[Flood Fill]スイッチを入れることでタイルのFlood Fill情報を出力してくれます。
これを利用すれば[Flood Fill]ノードを省略することができます。
そして[Flood Fill to Gradient]ノードでランダムな傾斜を求め、[Blend]ノードで乗算して少し傾斜をつけます。
最後に[Height to Normal]ノードでノーマルを生成してノーマルの出力ノードに接続します。
これで3Dペインにノーマルが反映されればOKです。

ここから表面の調整、クラックの作成を行います。

表面のノイズは適当に作成して適用しますが、特に難しいことはしていません。
[Histogram Edit]ノードはSDの[Histogram Scan]とほぼ同等だと思えばOKです。

クラックは[Voronoi]ノードからスタートです。SDのセルノイズ的なもので、[Cracks]コネクタでエッジ部分を取得できます。
[Slope Blur]はSDでも存在しますが、パラメータや挙動がどうもSDと違っていて調整が難しい印象があります。
クラックのズレやマスクは[Flood Fill to Color]と[Directional Warp]を適当に利用しています。

タイルの色はタイルごとのグレースケールを利用して[Gradient Map]ガチャを使います。

SDにあるデスクトップの画面のどこからでもカラーを取得できる機能がこちらにもあります。
ただ、ポイントとして利用できるのは16点までのようで、これを超えるポイント数になると[Gradient Map Dynamic]に自動的にコンバートされます。

後は適当にRoughnessとAOを調整して、できたのがこちら。

短時間で雑に作ったものなのでクオリティは低いですが、SDでできることは結構できるのではないかと思います。
しかし、慣れの問題もあってSDの方が楽に作れるというのは間違いなくあります。

ただ、InstaMATはメッシュをノードとして利用することができるというのが面白いです。
FBXファイルをD&Dでノードとして取り込むことができ、そこから[Mesh Bake]ノードでメッシュノーマルやAOといった情報を作成できます。

SDのグラフでは、ベイク自体は外(Painterなど)で行い、その結果を入力として受け取るという方式ですが、InstaMATではメッシュそのものを入力とすることができ、そこからベイク→ベイクされたマップの利用というところまで可能です。
ベイクの精度がどの程度かは不明ですが、InstaLODで培われた技術が流用されているものと考えられるのでそれなりのクオリティは出るのではないでしょうか?
メッシュを利用した処理は他にもたくさんあるので、少しずつでも検証していこうかと思っています。

これからも検証進めて、面白い機能やらがあったら記事にしていこうと思います。