Substance Painter用フィルタの作り方(実践編)

前回はSubstance Painter用のフィルタをSubstance Designerで作る際の基本的な部分やSP上での確認方法、イテレーションなどについて紹介しました。
今回は実践編と称して、簡単だけど少し実用的なフィルタを作ってみようと思います。
作ってみたのはこんな感じのフィルタです。

f:id:monsho:20180614233752p:plain

水に濡れたような表現を実装するためのフィルタです。
こちらを追加マップも利用して作ってみましょう。

濡れた表現の実装

元ネタはこちらのリンクです。

Water drop 3b – Physically based wet surfacesseblagarde.wordpress.com

古い記事ですが、水に濡れた表現について一連の記事でいろいろ触れられています。
今回はベースカラーとラフネスの計算式だけ拝借しています。
基本方針は、物体が濡れるとベースカラーが暗くなり、ラフネスが下がるという処理を作るだけです。

まず、SDでグラフを新規作成します。テンプレートは "Painter Filter (specific w/ additional maps)" を選択します。
今回出力するのは Base Color と Roughness なので、Metallic と Height の出力ノードは削除しましょう。

上記ブログに DoWetProcess() という関数がありますが、まずその中で使われているパラメータを作成します。
Porosity というパラメータはテクスチャからフェッチしていますが、今回は入力パラメータとして一律のものを使うことにします。
WetLevel も全体で一律のパラメータにしましょう。

f:id:monsho:20180615000704p:plain

入力パラメータを追加したら Base Color の [Input] ノードに [Pixel Processor] を接続、内部をこのように記述します。

f:id:monsho:20180615002037p:plain

同様に、Roughness の [Input] ノードにも [Pixel Processor] を接続し、こう記述します。

f:id:monsho:20180615002152p:plain

[Pixel Processor] の Color Mode は各 [Input] ノードに準拠させておきましょう。
とりあえずこの出力を各 [Output] ノードに接続し、一旦 .sbsar に変換してSPで使ってみましょう。
地面とかコンクリートのマテリアルに適用するとそれっぽくなると思います。
Porosity や WetLevel もいじって、どう変化するか試してみてもいいでしょうね。

くぼみの部分だけ濡れるようにする

現在のフィルタでもSP上でマスクと組み合わせれば十分利用は可能です。
マスクを自由に生成できる、という点を考慮すればそちらの方が自由度は高いですね。
ですが、折角なので追加マップを利用して濡れている部分と濡れていない部分を分けてみましょう。

濡れた物体は溝などのくぼみが乾きにくかったりしますね。
くぼみと言えばAOがそんな感じのマップですので、AOの暗い部分だけ濡れた状態を作るようにしてみます。

最初に追加マップのAOを以下のように接続します。

f:id:monsho:20180615004234p:plain

[Histgram Scan] ノードの2つのパラメータは Expose しておきましょう。
このノードの出力はマスク情報として使用されるので、以下の [Blend] ノード2つの Opacity として設定します。

f:id:monsho:20180615004703p:plain

ここまで設定したら再度 .sbsar を出力し、SPで試してみましょう。
最初に作ったのは全体に適用してしまっていますが、今回の修正でAO部分のみ濡れている表現ができているはずです。

上部を濡れやすくする

雨で濡れているような表現も入れてみましょう。
雨が降ってきて濡れるのは基本的には上向きの部分で、下向きの部分はあまり濡れないはずです。
World Space Normal を利用することでこれを実現できます。

しかし、上向きの部分を全部濡らす、というだけではつまらないです。
濡れている/いない部分の境界部分には少しノイズを入れたいでしょう。
それを加味して、以下のようにノードを組んでみました。

f:id:monsho:20180615011902p:plain

まず、World Space Normal の Y軸パラメータを取得します。これは上向きなら1、下向きなら-1の値になります。
次の [Pixel Processor]ではこのY軸の値に0.5を乗算、その後に0.5を加算しています。
これによって -1~1 の値だったY軸の値が 0~1 の値になります。こちらの方が扱いやすいのでこうしています。
このノードを [Histgram Scan] に接続しますが、Position と Contrast はやはりパラメータとして Expose しておきましょう。

ノイズは適当なGrungeMapを利用しています。今回は13番ですね。
これはお好みでいいですし、SPで設定できるようにしてもよいでしょう。
これをそのまま利用すると、SP上でUVの切れ目でループしない問題が出てきてしまうので、[Tri Planar Grayscale] ノードを使って切れ目が目立たないようにします。

最後にGrungeMapを Background、Y軸パラメータから求めたものを Foreground に設定し、Blending Mode に Add Subを設定します。
そして、AOによるマスクの出力データとY軸の値をベースとするマスクのデータを加算して、これを最終的なマスクとします。

終結果はこうなります。

f:id:monsho:20180615013033p:plain

1つ1つのノードはわからないと思いますが、どこをどう接続するかだけ理解できれば、ここまでの説明でわかるんじゃないかと思います。
実際のフィルタ動作はSP上で確認してください。

というわけで実践編でした。
次回は応用編として、もう少し複雑なことをやってみようと思います。