pky's creativelog

UE4を中心にデジタル創作のメモログです

pky's creativelog

SideFX Labs / Substanceプラグイン応用と実例

こちらの記事は、Houdini Apprentice Advent Calendar2020 / 15日目の記事になります。

qiita.com

はじめに

9日目の記事では、SideFX Labs/Substanceプラグインの基本的な使い方についてご紹介しました。
pkyblog.hatenablog.com

今回は応用的な使い方として、入力画像を使ってテクスチャ生成するタイプのsbsarの使用方法
Photoshopとの連携についてご紹介いたします。


また、実例として以下の2つについても解説します。

  • Low/Highモデルからのベイクテクスチャを使った岩のテクスチャジェネレータの例
  • Nodevember2020の13日目で作成したモザイクタイルの例

f:id:pkyblog:20201213144355p:plainf:id:pkyblog:20201213144123p:plain

最後のモザイクタイルの例はサンプルシーンを配布します。

画像入力を伴うsbsarファイルの使い方

マスク画像を使ってテクスチャ生成するシンプルなsbsarを作成する

分かりやすく、シンプルなグラフで例を示します。
3つのマスク画像を入力してそれぞれに色を付けてベベルを掛けてテクスチャを生成するグラフを用意します。
f:id:pkyblog:20201205174653p:plain

上記の画像では、3つのInputノードには分かりやすいように数字のマスクを挿入しています。

InputノードのIdentifierは、それぞれ input_1, input_2, input_3 としています。
Labelは、入力マスク1, 入力マスク2, 入力マスク3となっています。

f:id:pkyblog:20201205174824p:plainf:id:pkyblog:20201206065521p:plain

これをsbsarファイルとしてパブリッシュし、Houdini上で使います。

HoudiniでSubstance Material SOPで読み込む

f:id:pkyblog:20201206070038p:plain

Houdini上でsbsarファイルを読み込むと、3つのInputノードの欄がSubstance Parametersの一番上に並びます。
Substance Designer上で設定したLabel名デフォルト値として設定されるようです。

ここに設定する名前は何を示すのかというと、COPネットワークのチャンネル名(Image Plane名)になります。

f:id:pkyblog:20201206070518p:plain

COP INPUT(optional) という所に入力画像用の別のCOPネットワークパスを設定する箇所があるので、
別途作成したCOPネットワークをここに入れて使用する事になります。

入力画像用のCOPネットワークを作成/Photoshop連携

入力画像を読み込む為のCOP2 Networkノードを作成します。

f:id:pkyblog:20201206072747p:plain

COPネットワーク内に入ったらFileノードを作成します。

f:id:pkyblog:20201206073032p:plain

これで、外部から画像を読み込んできますが、入力マスクは3枚必要です。

1枚ずつ作成して、Fileノードで読み込んでも良いのですが、
Photoshopを使うとレイヤーを使って簡単に複数チャンネルを扱えるようになっています。

f:id:pkyblog:20201206073437p:plainf:id:pkyblog:20201206073448p:plain

psdファイルだと、レイヤー名がHoudini上でチャンネル(Image Plane)別に読み込まれる為、
レイヤー名をinput_1, input_2, input_3として、このようなテキストが書かれたpsdファイルを用意します。

これを先ほどのCOPネットワークのFileノードで読み込むと、3つに分かれて読み込まれました。

f:id:pkyblog:20201206073700p:plain

入力用のCOPネットワークが出来ましたので、これをLabs Substance Material SOPで使用します。

先にImage Plane名を入力マスク1,2,3の欄へ記述しておきます。

f:id:pkyblog:20201206074233p:plain

そしてCOP INPUTへ先ほど作ったCOPネットワークのパスを設定

f:id:pkyblog:20201206074320p:plain

これでpsdファイルから入力したマスク画像3つを使ってsbsarからテクスチャが生成されます。

f:id:pkyblog:20201206074638p:plain

Labs Substance Material SOP内では、COPの中でFetchノードを使って、
別のCOPをフェッチして入力画像を取り込んでいる形になっています。

f:id:pkyblog:20201208091640p:plainf:id:pkyblog:20201208091650p:plain

作例: ベイクテクスチャを使った岩ジェネレータの例

ここでは、モデルからの各種ベイクテクスチャを使った岩テクスチャジェネレータをLabs Substanceプラグインで使う制作例を紹介します。
まず、Houdini上でLowモデル、Highモデルの岩を用意します。岩の制作については、ここでは割愛致します。
ご参考までにいくつか岩のチュートリアルリンクを貼っておきます。

モデルを用意したら、Labs Maps Bakerでモデルからテクスチャをベイクします。

f:id:pkyblog:20201208093601p:plainf:id:pkyblog:20201208093609p:plain

今回のテクスチャジェネレータに必要なのは、Normal, AO, Thickness, Curvatureの4つになります。

イカーは今回はHoudiniのLabs Maps Bakerを使っています。一応、Substanceに必要な各種ベイクテクスチャは大体揃っていますが、
ここはSubstance Automation Toolkitを使ってSubstanceのベイカーでテクスチャを作るという方法も考えられます。
(ただし、現状では標準でSubstance Automation Toolkitと連携する術は無い為、独自のツールやHDAを作る事になります)

ベイクしたテクスチャが出来たら、それをSubstance Material SOPへ入力する為のCOP2Netoworkを作っておきます。

f:id:pkyblog:20201208095226p:plain

Fileノードで4つのベイクテクスチャを読み込み、RenameノードでそれぞれCからAmbient OcclusionやNormalなど
ベイクの種別ごとの名前を付けておき、最後にMergeノードでまとめてNullノードで出力としています。

注意点として、ノーマルマップ、マスク系のテクスチャはFileノードのImage Color SpaceLinearとしておきます。
f:id:pkyblog:20201208131259p:plain

こういったテクスチャをサンプリングして値を使うテクスチャはLinearスペースにしておかないと、
sbsarで生成するテクスチャの結果が異なってきますので、注意が必要です。

f:id:pkyblog:20201208131507p:plain

あとは、Labs Substance Material SOPにベイクテクスチャを格納したCOPのパスと、チャンネル名を指定すれば
ベイクテクスチャを使ってsbsarがテクスチャを生成してくれます。

f:id:pkyblog:20201213144355p:plain

作例: Nodevember2020参加作品13日目 モザイクタイルの例

今年、Nodevemberに参加した13日目のモザイクタイルの例を使って、説明用に簡略化したもので作成の流れを紹介しながら、
さらにLabs Substanceプラグインを使った簡単に応用した作例を紹介します。

まず、Houdini上でマスク画像からTraceでモデルを起こします。
f:id:pkyblog:20201211085032p:plainf:id:pkyblog:20201211083319p:plain

このロゴをボロノイ分割する為の母点はロゴの流れに沿って分割したかったので
Labs Straight Skeleton 2Dを使ってロゴの中央を通るポリラインを生成しています。

f:id:pkyblog:20201211085053p:plainf:id:pkyblog:20201211083430p:plain

ただ、それだけでは綺麗な四角なタイルが並ぶだけになってしまう為、そのポリラインに対して
Scatterでポイントを散布して追加し、それぞれPoint Jitterで少しランダムさを追加して母点としています。

外側はTraceでは生成できなかった為、Gridを使ってロゴ部分をブーリアンし、
同じようにボロノイ分割ておき、バーテックスカラーを2色ランダムに追加しています。

f:id:pkyblog:20201211085504p:plainf:id:pkyblog:20201211085516p:plain

Labs Maps BakerでVertex Colorをベイクし、これをIDマップとして
Labs Substance Material SOPへ入力してテクスチャを生成しています。
f:id:pkyblog:20201213141026p:plainf:id:pkyblog:20201213141153p:plain


この解説用のSubstance Graphは、IDカラーからColor to Maskノードでマスクを作り、色を付けてベベルを掛け亀裂を簡単に入れた、シンプルなものです。
f:id:pkyblog:20201213141350p:plain

Nodevember2020の作例ではこれとは全く違うのですが、
実際はLevel Up Digitalのチュートリアルで学んだものをベースに改変したSubstance Graphで作っています。

levelup.digital

Houdiniの方も、実際の作例ではボロノイ分割もノイズを使いdensityアトリビュートを与えて均一にならないように調整したり、
ボロノイ分割とIDカラー付加を合わせてHDA化して、色数や色調整がしやすくしています。

f:id:pkyblog:20201211092304p:plainf:id:pkyblog:20201211092754p:plain

Nodevemberの時には、この作例でLabs Substanceプラグインは使っていませんでした。

これだけでは単純にHoudiniからベイクしたIDマップからテクスチャを生成してグリッドに貼り付けているだけなので、
Labs Substance プラグインを使う意味は殆ど無くて、Substance Designerへ更新したIDマップを渡すのと大差ありません。

その為、多少無理やりですが連携してみます。

ハイトマップを使ってタイルのミゾに草を生やす

f:id:pkyblog:20201213142256p:plain
GridモデルにAttribute from MapでLabs Substance Material SOPのCOPからハイトマップを参照して
floatのdensityアトリビュートとして転写します。

そのまま転写するのではなく、Remapを使って階調反転したりコントラスト調整しています。

f:id:pkyblog:20201213142306p:plainf:id:pkyblog:20201213142315p:plain

その後、blastでdensityが0の箇所だけ削除し、細切れになった部分はLabs Delete Small Partsで除去しています。

f:id:pkyblog:20201213142623p:plainf:id:pkyblog:20201213142629p:plain

こうして抽出したミゾ部分だけのモデルに対して、Houdini18.5から追加された
Scatter and Alignノードでポイントを散布します。

Scatter and Alignはポイントの散布方法が複数選択出来たり、また回転やスケールなどのアトリビュートを追加してくれたりといった
調整機能が色々付いている便利なノードです。これまでは、Scatterした後に自分で色々とアトリビュートを追加したりしていましたが
このノードでCopy to pointsのコントロールがもっと簡単になっています。

f:id:pkyblog:20201213143154p:plain

これで草のモデルをCopy to Pointsで配置することで、Substance Archiveが生成したハイトマップから
ミゾの部分を特定し、プロシージャルに草のモデルを散布する事が出来ます。

f:id:pkyblog:20201213143348p:plain

おわりに

細かな説明は省略しておりますが、以下でモザイクタイルの制作例は
この記事で紹介したシーンをダウンロード頂けます。

pky.booth.pm

※配布シーンでは草ではなく、Tubeを散布しています。また、SubstanceロゴではないSに差し替えています。


何かご参考になれば幸いです。
Houdini/Substance Designerの制作例が増えたら嬉しいです。

見て頂いて有難うございました。