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日目で作成したモザイクタイルの例

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

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

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

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

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

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

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

HoudiniでSubstance Material SOPで読み込む

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

まず、Houdini上でマスク画像からTraceでモデルを起こします。

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

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

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

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


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

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

levelup.digital

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

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

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

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

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


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

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

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

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

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

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


おわりに

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

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