サブスタンスペインター用のGeneric filter をサブスタンスデザイナーで作る際、カラー対応のフィルタを作る場合とグレースケールフィルタを作る場合の違い、その注意点についてまとめる。独自調査を含む。
※ Generic filter についてと、Generic filter の作成のやり方はこのページの最後に記載した。
フィルタの動作
グレースケールフィルターの挙動
グレースケールのGeneric filterは ペインターからの入力がマスクなど単独のモノクロチャンネルの場合だけでなくカラー画像が入力の場合でも問題なく動く。カラー入力の場合は各チャンネルそれぞれに個別でフィルターが働く。

例として上のようなブラーフィルターを作成した。これをペインター上で茶色のマテリアルに網目状のマスクを施した以下の状態のそのマスクに対して適用する。

すると以下のようにマスクがボケる。予想した通りの挙動。

いったんフィルターを削除し、今度はカラー調整レイヤー(パススルーレイヤー)を作り、そのレイヤーに対して同じグレースケール用フィルタを適用してみる。

上のようになったグレイスケールのフィルタだがカラーの各チャンネルがぼかされ正しく動いている事が確認できた。ここまで問題ない。
意図しないグレースケールフィルタの動作
上のパススルーレイヤーに適用した例では完全不透明でアルファチャンネルが1で埋まっている状態だった。では透明度を持つペイントレイヤーに同じフィルターを適用したらどうなるか。


左のようなペイントをしたレイヤーに同じフィルターを適用した所、ディティールだけでなくペイントエリアの境界もぼけてしまった。これはアルファチャンネルにも同じブラーがかかってしまうためだ。これが望ましい場合もあるし、望ましくない場合もあるだろう。回避方法としては、

ペイント形状は塗りつぶしレイヤーのマスクで出し、フィルタは塗りつぶし側にかけるなどの対応が取れるが、すでに描きこんでしまっているレイヤーの場合これは使えない。
カラーフィルターでアルファ値を別に扱う

上のようにアルファチャンネルのみ分離しそれ以外にブラーをかけてやるフィルターを作成した。これを先のペイントレイヤーに適用してみる。

今度はうまく行った、、ように見えなくもないがペイントのない部分のカラーが黒になっているようで縁の色味が暗くなってしまっている。

元からボケ足があるペイントの場合は暗くなる現象がかなり抑えられる。これは半透明部分にもカラー情報があるからだろう。

エッジがはっきりとしたペイントも周りにうっすらとした塗りを加筆してやると暗くなる現象を和らげる事ができる。雑な対応だが。(ここから見るに、サブスタンスペインターのカラー情報はPre-Multiplied処理されずに値が渡されるようである。)
より完全に対応する場合、アルファ0の場合のカラー値をフィルタのパラメータに指定できてもいいかもしれない。
カラーフィルターの挙動
カラーフィルターはカラー入力値に対してRGBおよびAチャンネルを自由に編集できるが、メタリック・ラフネスなどモノクロチャンネルに適用する事ができる。この場合サブスタンスペインターの入出力時に自動でグレースケール変換がなされる。


テスト用に入力チャンネル情報を分解して4つ並べるフィルターを作った。アルファ付きカラー情報がRGBAに分かれて正しく入ってくることが確認できる。透明の部分はRGBが黒であることも確認できる。


モノクロチャンネルであるメタリックに同様のカラーフィルタを適用してみた。RGB値はそれぞれ同じでアルファが1である事が確認できる。


ハイトのチャンネルで同様の調査を行うとアルファ以外の値が無くなってしまっているように見える。おそらくこれはハイトチャンネルが32bitであるからだろう。モノクロフィルターで処理させると見た目が暗くつぶれないのだが実際どんな値が来ているか(マイナス値はどうなってる?)は今回確認していない。
なお、公式ドキュメントにはマスクにカラーフィルタを適用できないような旨記載されているが、自分が試す限り問題なく自動グレースケールへのコンバートが行われどうする事が確認できた。
Note that color based fitlers can’t be used on the mask of a layer, only grayscale fitlers will be compatible.
https://helpx.adobe.com/substance-3d-painter/content/creating-custom-effects/generic-filter.html

モノクロチャンネルにカラー情報を出力した場合はどうなるだろう。上のノードグラフのようにカラー情報の変更とともにアルファ情報を出力するカラーフィルタを作ってみた。どうなるか。
結果、RGB値に関しては予想通りグレースケールに変換される。アルファ値に関しては、マスクに適用した場合は無視され、ラフネスなど通常グレースケールチャンネルに適用した場合はアルファ付きのチャンネルとなった。
Generic filter の作り方 (おさらい)
Substance Painter のフィルタやジェネレーターは Substance Designer で作成する事ができる。フィルタの中にもいくらかの種別があり、その中でも特定のチャンネル(カラー、ノーマル、マスク、ラフネス…)に紐づかず汎用的に使えるものを Generic filter という。
Generic filter を作るのは、特定のチャンネルに作用するフィルタに比べて入出力のノードが1つづつ固定ID名となるのでかなり簡単である。新しいサブスタンスグラフを作るダイアログで Painter FIlter (generic) を選択する。

グレースケールの場合
正しいID名でinput、outpuノードができているので、このままグレースケール処理を完成させる。

カラーの場合
入力ノードを同じID名(input)でカラーで作り直す。その後処理を完成させる。

ここでは適用にカラー画像を変形させる処理を作ってみた。(同じような動作をするフィルタはすでにビルトインにある気がするが、テストとして。)

sbsarファイルの出力
フィルタはsbsarファイルとして出力したものをペインターに読み込む。他者に配布するフィルターの場合、sbsar書き出しにあたって説明テキストの記載やアイコンの設定をするべきだがここでは割愛する。

書き出し前にノードグラフの書き出し画像サイズ設定が親と相対になっているか確認したほうがいいかもしれない。(デフォルトでそうなっているが、以前は書き出しダイアログでここを改めて指定できたような記憶がある…。)

出来上がったsbsarをサブスタンスペインターのシェルフにドロップするとインポートダイアログが出るので、フィルタとして読み込む。

サンプルファイル
今回の調査で使ったフィルターのsbsとsbsarファイルはgithubに上がっている。
参考リンク
generic filterについて
https://helpx.adobe.com/substance-3d-painter/content/creating-custom-effects/generic-filter.html
特定のチャンネルに作用する filter について




