もんしょの巣穴blog

[SD] Substance Designer 2017.2 の新ノード Flood Fill

最近、ブログを書くのが面倒でほとんどTwitterで済ませてしまっていました。
なんとかブログを書こうという気力がほんのちょっとだけ湧いたので頑張って書いています。
いやまあ、記事を書くこと自体より、画像のコピペができないとかそういうのが面倒ってのが大きいです。
そのうち引っ越すかもしれませぬ…

今回はSubstance Designer 2017.2 が登場したので、そこで追加されているFlood Fillノードについてまとめました。

・Flood Fillとは?
Flood Fillアルゴリズムというものがあります。
これは画像処理アルゴリズムの1つで、画像内の特定アイランドに色を充填するためのアルゴリズムです。
簡単に言ってしまえばPhotoshopのペンキ缶ですね。
SDの[Flood Fill]ノードはこのアルゴリズムを用いてアイランドごとに情報を持たせているものと思われます。

・何ができる?
白黒で何らかのパターンを作るのはSDではよく行われますが、それをそのままハイトマップやノーマルマップにしてしまうとあまりにも整列しすぎていて不自然です。
だからと言って適当なノイズを与えるだけだとそれはそれで不自然だったりします。
出来ればアイランドごとにIDを持たせるような印象で情報を割り振り、それを元にして他のマップを生成したいという場面があります。

[Tile Generator]ノードなどはその手の情報をランダムに生成してくれる機能がありますが、[Cells 3]のようなノイズノードではアイランドごとに情報をランダムに変更する機能はありません。

[Flood Fill]ノードとそれに続くノードを用いることでこのような情報をあとから生成することができるようになった、というのが今回のアップデートの大きなところです。

・使い方
まず、[Flood Fill]ノードに白黒のパターン画像を接続します。
すると、なんだか不可思議な画像が出来上がります。
この画像はこのままでは基本的に使えませんが、ここには各アイランドに関する情報が保存されているようです。
どのような情報が保存されているかは不明ですが、アイランドのバウンディングボックスのサイズなんかは入っているようです。

この[Flood Fill]ノードの出力を[Flood Fill to ~]ノードに繋ぐと、その繋いだノードに合わせた情報を取得することができます。

2017-10-21_18h12_39.png

[Flood Fill]ノードに続くノードは5種類あります。

[Flood Fill to BBox Size]は各アイランドのバウンディングボックスサイズをアイランドに割り当てます。アイランドの大きさを求めることができるわけです。

[Flood Fill to Gradient]は各アイランドにグラデーションをかけることができます。
グラデーションの方向とランダム性を指定することができるため、かなり使い勝手がいいのではないでしょうか?

[Flood Fill to Position]は各アイランドの中心座標を色として割り当てます。

[Flood Fill to Random Color/Grayscale]は各アイランドにランダムにカラー/グレースケールを割り当てます。

これらのノードは[Flood Fill]ノードから繋げなければほとんど意味がないノードです。
かならず[Flood Fill]と一緒に使いましょう。

・作例
以前のSubstance勉強会の時に作った石畳は石の形状を作成するのにちょっと面倒な方法を採用していました。

2017-10-21_22h19_18.png

[Histgram Shift]を用いて無理やりノーマルマップを作り、そこからハイトマップに戻す方法ですね。
勉強会ではこのようなハイトマップを2種類作り、ブレンドしていました。
この方法でも悪くはないのですが、胡散臭い形状ができてしまうこともあって調整が面倒です。

[Flood Fill]を使ってよりスマートで安定的な形状を作る方法がAllegorithmicの公式動画にあります。

2017-10-21_22h38_11.png

[Flood Fill to Gradient]ノードを用いて各アイランドに傾斜をつけます。
この傾斜をそれぞれ別方向で3つ作り、すべてをMinブレンドします。
するとこのようなノーマルマップが生成できます。

2017-10-21_22h41_12.png

安定的な星型の形状ができました。
この状態だとあまりにも綺麗すぎるので、

・[Flood Fill to Gradient]の[Multiply by Bounding Box Size]パラメータを調整して星の中心をアイランドの重心付近から移動させる
・[Flood Fill to Random Grayscale]を使ってマスクを作り、星の足の数をアイランドごとに配置する

などの方法でよりランダム性を出すことができるでしょう。

・不具合?
不具合なのかアルゴリズム的な仕様なのかは不明ですが、[Flood Fill]を使用した場合に一部のアイランドのエッジ部分にノイズが乗ることがあります。

2017-10-21_22h49_29.png

[Flood Fill]の入力にゴミが残っているというわけでもなく、角度的な問題という感じもしませんが、何らかの理由でこのようなノイズが出てしまいます。
形状を変えたりすれば出なくなったりするのですが、出てしまうのがそもそも困るわけで。

対処の方法としては、[Flood Fill]へ入力するノードに[Blur HQ Grayscale]で少しだけブラーをかけてやると出なくなったりします。
ブラーの強度は0.2くらいなら形状に影響も与えず、ノイズ問題も解消できるようです。
ただし、どんな形状に対してもノイズ問題を解決できるかは不明なので注意してください。

以上、[Flood Fill]ノードの紹介でした。
スポンサーサイト
  1. 2017/10/21(土) 22:55:21|
  2. Substance Designer
  3. | トラックバック:0
  4. | コメント:0

[SD] PBRユーティリティ

TL上で少し話題になったPBR対応テクスチャがSubstanceDesignerで作れるかどうかという話。
実はPBR対応のテクスチャを作成するためのユーティリティがSDにはいくつか存在しています。
今回はそれらのノードの話を。

PBRに対応するとは?

そもそもPBR対応というのは、例えば石なら石として正しい色になっている、ということではありません。
石と言っても種類は色々ありますし、同種の石でも成分に違いは出ます。
同じ花崗岩でも瑞牆と小川山では色味の違いは出ますし、表面の凹凸も変わってきます。同じ山でも場所が違えば違ってきます。
どうしても瑞牆の花崗岩を再現したい!というのであれば、瑞牆に行って岩の写真を撮影するしかありません。

ではPBR的に正しいテクスチャとは何かというと、アルベドであれば黒の下限と白の上限です。
RGBすべての成分が0、RGBすべての成分が1という黒と白は現実には存在しません。
前者はすべての光を完全に吸収するのでブラックホール化何かでしょう。
後者は拡散反射なのに光を完全に反射します。ホワイトホール?いや、まあ、普通にないですね。

また、金属であれば純金属はその反射率がすでに求められています。
純度100%でなければ変化はするかもしれませんが、基本的には求められている反射率で問題ないはずです。

つまり、PBR的に正しいということと、特定の物体(瑞牆の阿修羅岩とか)の色が正しいというのは別の問題だということです。
特定物体の完全に正しい色がほしい、というのであればフォトスキャンするしかありませんが、そこまで特定の何かがないのであれば物理的に間違ってない値を使って目合わせでもいいんじゃないかな、と思っています。

もしも特定物体の正しい色がほしいのだ!という方はポリフォニーの内村氏が今年のCEDECで解説してた色彩工学の資料をお読みください。

http://d65.xyz/cedec2016

では、各ノードを解説していきます。
これらのノードは[Material Filters]->[PBR Utilities]の中にあります。

BaseColor/Metallic/Roughness converter

sd152.jpg

SDでは通常、BaseColor/Metallic/Roughness のパラメータでマテリアルを作成します。
しかしそれとは別に Diffuse/Specular/Glossiness のパラメータでマテリアルを作成するシステムも有ります。
このノードは通常の BaseColor/Metallic/Roughness で作成されたマテリアルを別のマテリアル表現に変換してくれます。
どのような種類があるかというとこんな感じ。

sd157.jpg

Diffuse…以外にも、VrayやArnoldといったレンダラにも対応しています。
あまり使う機会はないかもしれませんが、今までBaseColor方式で作っていたマテリアルを急遽別のシステムに出さなきゃいけないという場合には重宝するかもです。

PBR Albedo Safe Color

sd153.jpg

上でも書きましたが、PBRにおいてアルベドの黒と白は完全な黒と白にはなりません。
このノードはそのような黒や白を妥当は範囲にクランプしてくれるノードです。
例えば全て0の真っ黒を繋げるとこうなります。

sd158.jpg

グレーっぽくなっているのがわかりますよね。
なお、入力ピンの下の方はMetallicです。完全金属の場合はBaseColorは素通りされます。
そのような場合は本来何を入力しても真っ暗にしたほうが良かったのでは?と思ったり思わなかったり。
パラメータでDiffuseモデルにも変更ができます。

また、Torleranceパラメータで許容誤差を変動させることが出来ます。
このパラメータが0なら50 sRGBに、逆に1なら誤差とを大きく持って30 sRGBくらいまではクリッピングされません。
まあ、非金属のマテリアルを作って、その際にBaseColorに自身が持てないような場所に使う機能という感じでしょうかね。

PBR BaseColor/Metallic Validate

sd154.jpg

このノードも前者と同じようなノードですが、こちらはBaseColorをクリップしたりしません。
このノードの場合はBaseColorにミスがある部分が赤くなります。PBR的に正しい場合は緑です。

sd159.jpg

[Level]ノードでレベルを変更した結果として溝の部分が白飛びしています。
これがPBRのミスです。
この結果を利用して赤くなっている部分のベースカラーをマスキングすることも可能です。
目合わせでマテリアルを作っている場合は最後にこのノードを通して問題ないかだけは調べておく方がいいと思います。

PBR Dielectric F0

sd155.jpg

非金属物体の一部を選択してフレネル反射係数 f0 を取得します。
f0が求まるとIORなんかも求められますが、[Custom IOR] を利用すればIORから係数を求めることが出来ます。
何に使うの?と言われると、まあ、ちょっと困るねw

選択できる物体はこんな感じです。

sd160.jpg


PBR Metal Reflectance

sd156.jpg

最後はこちら。金属の反射率を金属の種類に応じて取得できるノードです。
今まではDONTNODのチャートを利用していたのですが、こちらを使ったほうが簡単でしょう。
何が選べるかは以下のようになっています。

sd161.jpg

代表的な金属は網羅されているかと。

というわけで今回はここまで。
  1. 2016/09/02(金) 02:06:12|
  2. Substance Designer
  3. | トラックバック:0
  4. | コメント:0

[SD] 特定の位置にパターンを表示する方法

今回紹介するのは入力画像の特定条件にあるピクセルにのみ指定パターンを表示する方法です。
[Tile Sampler] ノードにはランダムに配置したパターンがグレースケールの白の部分にのみ表示されるようにする機能があります。
この記事ではその簡易バージョンを作る方法を提示します。
簡易バージョンなのでもう少しちゃんと作らないと実用的にはならないのですが、仕組みがわかっていれば [Tile Sampler] ノードから該当部分を抜き出すこともできるようになるんじゃないでしょうか?
まだ自分はできていませんが、そのうちやる予定。

この処理には [FX-Map] を使用します。
このノードはSDでは唯一ループ処理を行うことが出来るノードであり、今回のようにパターンを複数回散りばめるのには大変便利です。
特定パターンを複数表示するノードとしては先に紹介した [Tile Sampler] も含まれるタイル系やスプラッタ系がありますが、これらは内部で [FX-Map] を使用しています。

まずは準備をしましょう。以下のようにノードを作成します。

sd144.jpg

[Image Input 0] に入力された円が今回は散りばめるパターン、[Image Input 1]に入力された三角が表示位置を示す画像とします。
[FX-Map] ノードの [Color Mode] はグレースケールに変更しておきましょう。
次に入力パラメータを追加しておきます。以下のように作成します。

sd145.jpg

[tile_num_x/y] はXY座標のタイルの数で、この数値分画像が分割されます。
[gray_threshold] は [Image Input 1] の該当ピクセルがこの値以上の場合にパターンを表示するようにするためのしきい値です。

では、[FX-Map] を選択し、[Ctrl + E] で内部に入っていきましょう。
内部は以下のようにします。

sd146.jpg

最初から入っている [Quadrant] ノードの上に [Iterate] ノードを配置し、これをルートとします。
[Iterate] ノードがループ処理を行うノードで、このノードの [Iterations] パラメータで指定した回数だけ [Quadrant] ノードが実行されます。

[Iterate] ノードを複数繋げて多重ループも実現できるのですが、繰り返し回数を変数として取得できるのはその変数を使用したノードより手前直近の[Iterate]ノードのみです。
つまり、多重ループのそれぞれのループ回数は取得できません。
今回はそれでは困るので、1回のループで2重ループと同じ効果を出すようにします。
[Iterations] パラメータを空の関数とし、内部を以下のように作成します。

sd147.jpg

タイルのXYの整数を乗算して出力します。
例えばX=2、Y=2であれば4回ループとなります。タイル数分だけループするわけですね。

次に [Quadrant] ノードの処理を行います。
パラメータを変更するのは [Pattern] を [Input Image] に変更するだけです。
あとは各種パラメータの関数内部で処理を行うことにします。

まずはタイル上にパターンを配置しなければなりませんので、その処理を作成します。
[Branch Offset] のパラメータを関数化し、内部に入りましょう。
この関数は以下のように実装します。

sd148.jpg
(クリックで拡大)

ちょっと複雑でわかりにくいかもしれません。
まず左下のブロックはタイル1つ分の幅と高さを求めています。
タイルの分割数がXYともに2ならここで求められる値は(1/2, 1/2)=(0.5, 0.5)となります。
右下のブロックはパターンを左上ピッタリに配置する場合のオフセット値を求めています。
最後に上のブロックで繰り返し回数からXYのタイル座標を求め、それに見合った左上からのオフセット値を求めます。
これを右下のブロック(つまり左上のオフセット座標)に加算することで、繰り返し回数に依存したパターンのオフセット値を求めることが出来ます。

しかしこれだけでは大きなパターンが移動するだけです。サイズも適切なサイズに変更する必要があります。
この処理を [Pattern Size] パラメータ内に作成してもよいのですが、実はパターンサイズとして利用するパラメータは左下ブロックの結果と同等だったりします。
同じ計算を何度もやるのは面倒です。なので、この結果をローカル変数に設定します。

上の図の真ん中に [Set] ノードがあります。これは指定名(ここでは [pattern_size])のローカル変数を作成し、そこに値を格納しています。
この [Set] ノードで設定した値を使用するにはいくつかの条件が存在します。

1つ目の条件は、この値はこの関数を持ったパラメータが所属しているノード内でのみ有効です。
つまり、この場合は [Quadrant] ノードでのみ使用可能です。
使用する場合は [Get ~] ノードを使用しますが、同一関数内以外ではドロップダウンリストに表示されないのでて入力する必要があります。

2つ目の条件は [Set] ノードを利用したパラメータ以下のパラメータの関数内でしか使用できません。
今回の場合は [Branch Offset] 内部で使用しているため、この関数内部か、そこから下の [Quadrant] ノードのパラメータでしか利用できません。
つまり、[Color / Luminosity] パラメータの関数内では使用できないということです。

3つ目の条件としては [Set] ノードを有効にするには出力ノードとして設定したノードに対する処理の途中で挟む必要があるということです。
これについては後で説明します。

さて、ここで [pattern_size] というローカル変数にパターンサイズとして利用できる値が入力されましたので、[Pattern Size] パラメータの関数内でこれを使用しましょう。
[Pattern Size] パラメータを関数として、内部を以下のように設定します。

sd149.jpg

ここまで処理を作成すれば綺麗なタイル状に円が敷き詰められるはずです。
しかし、これからが本番。[Input Image 1] のイメージに従ってしきい値以上のグレーならパターンを表示するようにしましょう。
これを実現するにはタイル状に敷き詰められた各パターンの中心のピクセルを [Input Image 1] から取得し、この値がしきい値以上かどうかを確認、しきい値未満であれば [Pattern Size] を0にするという手法を取ります。
そのような加工をした結果が以下となります。

sd150.jpg
(クリックで拡大)

右上の部分がパターン中心のイメージのピクセルをサンプリングし、これがしきい値以上かどうかを調べている部分です。
しきい値以上であれば加工前の [pattern_size] 出力を選択し、しきい値未満であれば (0, 0) を選択します。
この選択結果を [pattern_size] に入力していますが、その後に [Sequence] ノードに繋げるようにしています。

なぜこのようにするのかというと、これまで通りに下部の加算部分を出力ノードとして選択してしまうと、その結果を求めるのに [pattern_size] への入力は通る必要がなく、SD内部で不要なノードとして無視されてしまうのです。
関数の出力には影響を与えないが処理されなければ困る、という今回のような場合には確実に処理が行われるようにするために [Sequence] ノードを使います。
このノードの入力ピンは上が [In]、下が [Last] となっていますが、出力されるのは [Last] ピンに入力された値です。
[In] に入力された値はこれ以降ではどこからも参照されませんが、処理だけは走ります。
これが [Set] ノードを使う条件の3つ目の回避方法です。活用していきましょう。

このようにノードを組み、[gray_threshold] を 0.5 に設定すると、三角形の形状で円が表示されるはずです。
円の数が少ないようでしたら [tile_num_x/y] の値を大きくしてあげましょう。
タイルの数がXYともに16の場合は以下のような結果となります。

sd151.jpg

最後に注意点を。
[Quadrant] ノードの [Pattern] はパラメータの関数化も出来ますし、関数内部で固定値 0 を出力すると [No Pattern] を選択されたように表示が消え、1 を出力すると [Input Image] が選択された状態となり円が表示されます。
パターンの表示/非表示はこちらでやるべきではないのか?

そう考えて [Pattern Size] を0にする方法でなく、[No Pattern] を利用した形で表示/非表示を切り替えられるようにしてみました。
しかし残念なことにこれはうまくいきませんでした。
なぜそうなっているのかはわからないのですが、どうやら [Pattern] の関数に対してはイメージのサンプリングが出来ないようです。
何か見落としてうまくいっていないだけなのかもしれませんが、私が試した際にはうまくいきませんでした。
注意しましょう。
  1. 2016/07/18(月) 01:04:06|
  2. Substance Designer
  3. | トラックバック:0
  4. | コメント:1

[SD] Substance Player

今日知った小ネタ。

Substance Playerというツールが有ります。
SubstanceマテリアルをViewingするためのツールなのですが、こちらから無料でDLすることが出来ます。

https://www.allegorithmic.com/download/download_free/6

このツールは.sbs, .sbsarを開くことが可能で、パラメータを変更することも可能です。
ただし保存はできません。パラメータを調整して保存する機能はありません。
もちろん、.sbsファイルのノードを変更することも出来ません。

しかし画像データとしてエクスポートは出来ます。
ライセンス的に問題がないSubstanceマテリアルであれば無料でテクスチャ画像が取得できるわけです。

さて、ここからが本題。
Substance DesignerではパラメータやPixel Processorの変数として時間を取得することが出来たりします。
[Get Float]ノードを関数内に配置し、プルダウンメニューから"$time"を選択するだけです。
しかしこの時間、SD上では確認する術はありません(少なくとも自分は見つけられませんでした)。
しかし、Substance Playerなら確認可能なのです。

そこで今回はいわゆるFlowMapを確認するためのSubstanceマテリアルを作成してみました。
以下からDLできるようにしています。

https://dl.dropboxusercontent.com/u/39588440/Substance/FlowMap.sbs

マテリアルの中身はこんな感じ。

sd140.jpg

下のPixelProcessorの中身はこんな感じです。

sd141.jpg

仕組みとしてはほんとに単純なFlowMapです。
入力画像とFlowMapは外部から与えることも可能ですが、デフォルトでは入力画像はチェッカー、FlowMapは回転するようにPixelProcessorで作成したものです。

では、これをSubstance Playerで読み込んでみます。

sd142.jpg

Substance Playerはこのようになっています。B2Mっぽい見た目ですね。
右側がパラメータで、入力画像とFlowMapは外部から読み込むことも出来ます。

下の方を見てください。
タイムラインと書かれている部分があるのがわかりますね?
この一番左の再生ボタンを押すと"$time"変数がタイムラインにそって変更されます。
これがPixelProcessorで使用されているので、FlowMapが正しく動くことになります。

また、テクスチャエクスポート時にタイムラインに沿って出力することが可能です。

sd143.jpg

[ビットマップでエクスポート]ボタンを押すとこのWindowが表示されます。
上の赤枠部分が時間に関するパラメータで、時間単位、開始・終了フレーム、FPSを指定することが出来ます。
これを利用することでプロシージャルなフリップブックアニメーションを作成することも出来るでしょう。

というわけで小ネタでした。
  1. 2016/05/30(月) 23:31:58|
  2. Substance Designer
  3. | トラックバック:0
  4. | コメント:0

[SD] 配置系ノードについて調べてみた

Substance Designerでは入力した画像を複数配置する系のノードがいくつかあります。
今回はそれらのノードについて調べてみたこと、自分なりの考えを徒然なるままに書いてみます。
間違っている部分、調査の足りない部分、自分はそう思わないという部分もあるかと思いますが、そのような場合はコメントなりTwitterなりで指摘していただけるとありがたいです。

・Splatter
sd135.jpg
Splatterとは水などの液体がはね飛ぶ様子を意味する動詞・名詞です。
多分配置系の中では最も軽いノードで、実装自体もかなり単純そうです。

名前からしてとにかくランダムに配置するようなノードと思われがちですが、かなり規則正しく配置されます。
また、他のノードとパラメータの単位が結構違うので戸惑いやすいですね。
個人的にはあまり使わないのですが、とにかく単純に配置したいだけなら十分に使用できます。

[Pattern Size Width/Height] は単位が%となっていて、100がデフォルトです。
パターンの位置をランダムにずらすには [Disorder] を使用しますが、X方向にランダムに移動するだけです。
全体にランダムに散らしたい場合は、[Disorder] と [Disorder Angle] を使用します。
[Disorder] が0の場合の中心位置が [Disorder Angle] のピボットポイントとなります。
つまり、均等に整列している場合の中心点を回転中心として [Disorder Angle] 分だけパターンの位置が動きます。

しかしこれだけでは配置に規則性が出てきてしまうので、そのような場合は [Disorder Random] を True にすると、各パターンごとに [Disorder Angle] の角度がランダムになります。

大きさのランダムは全体に対してしか行えません。Xのみ、Yのみの拡大はできないようになっています。

Tile~系のノードと違って、配置する数を指定することはなく、[Zoom] を使ってカメラとイメージの距離を変更します。
これによって配置されるパターンの数を調整します。
ただし、[Zoom] を行った場合はタイリングテクスチャを作成できなくなるおそれがあるので注意ですね。

単純故に処理速度も高速ですが、単純に配置するだけならこのノードが一番よいでしょう。

・Tile Generator
sd136.jpg
比較的規則正しくパターンを配置したい場合に使用するノードという印象です。
配置するパターン数を [Number X/Y] で指定することができますし、Splatterノードと違ってタイリングテクスチャ作成は容易です。

パターンの各方向のサイズは直接的に変更することは出来ませんが、先の[Number X/Y]をそれぞれ別の値に変更することで縦横比を変更することが出来ますが、一律にしかなりません。
[Scale] や [Scale Variation] は入力パターンの全体の大きさを変更するだけです。
[Interstice] の項目は本来パターン同士の間隔を指定するパラメータなのですが、実はこの値を利用してXY方向それぞれのスケーリングも行えます。
正の値で間隔が開く、つまりパターンが小さくなるのですが、負の値を指定することで逆に大きくすることが出来ます。
ランダム設定もできます。

いくつかのパラメータは行、もしくは列に対して1つ飛ばしで処理されるようになっています。
[Offset] は水平方向のオフセットですが、[Vertical Offset] を True にすると垂直方向のオフセットに変化します。
水平・垂直方向に同時にオフセットを設定する手段はありません。
[Middle Size] の項目は水平・垂直方向に交互にスケーリングするパラメータです。
[Horizontal/Vertical Mask] も行・列の1つ飛ばしでマスクします。

回転は [Free Rotation] と [Fixed Rotation] があり、Freeの方はアナログな角度単位で指定できるのに対して、Fixedの方は90°固定で回転させます。
[Fixed Rotation Random] はパターンごとに回転角度を0と180のどちらかが選択されます。
この状態では90°単位の回転が出来ないのですが、[Quincunx Flip] を True にするとパターンごとランダムに90°ずつの回転が割り当てられます。
多分このパラメータはよく使うことになると思います。

[Position Random] を利用することで空間中のランダム配置も可能です。
比較的整列した配置に使われるものですが、ランダム配置にも十分使えるノードです。
Splatterノードより処理速度はかかる事が多いですが、速度と実装のバランスが良いノードとも言えるかと思います。

・Tile Random
sd137.jpg
Tile Generatorよりランダムに偏ったノードです。
Tile Generatorは配置されるパターンが行列に対して一定で配置されるのに対して、こちらのノードは各ブロックごとにサイズがランダムになり、パターン配置のスプリットが行われる特徴があります。
下の図はデフォルト設定のTile Randomですが、一部のブロックがスプリットされているのがわかるかと思います。

sd138.jpg

この設定は [Split] カテゴリのパラメータで行います。
[Mode] を [none] にするとスプリットが行われませんが、[auto] にすると縦・横にスプリットが行われます。
[auto horizontal/vertical] は水平・垂直方向のみのスプリットになります。
[random h+v] はイマイチ [auto] との違いがわかりません…

[Threshold] によってスプリットされるブロック数を増減できます。
0 の場合は一切スプリットが行われなくなり、1に近づくとスプリットされるブロック数が増えます。
[Multiplier] はスプリット回数です。

[Rotation Random] は [Pattern] カテゴリと [Shape] カテゴリの双方にありますが、前者は90単位の回転、後者はフリー回転となっています。

その他の部分は割とTile Generatorに似ていますが、[Interstice] に負の値を入れることは出来ません。
また、X/Y方向それぞれの指定もできないので、一定方向に伸ばすといった処理は [X/Y Amount] で対応する必要があります。

速度は前述2つより重くなる傾向にあります。
どういう使い分けをすべきかイマイチわかっていないノードですが、みなさんはどういう感じで使い分けてるんでしょうか?

・Tile Sampler
sd139.jpg
これまでのノードと比べて大量の入力を持っているノードです。
入力される画像を利用することで移動、スケール、マスクなどの処理が行えるのが特徴で、かなり汎用的に使用することが出来ます。
また、ランダムをある程度自分が思ったような形で制御することが出来るという利点もります。
その分処理速度が他のノードよりかなり重めですので注意してください。

入力されるマップはパターン以外に、Scale、Displacement、Rotation、Vector、Color、Maskがあります。
Scaleはスケール値、Displacementは位置、Rotationは回転が、それぞれ入力されたマップに依存します。
マップを有効にしたい場合は [~ Map Multipllier] の数値を上げていきましょう。
1に近づけばその分マップの影響を大きく受けるようになります。

Mask Mapは [Mask Map Threshold] で指定された範囲にのみパターンを配置するように出来るすぐれものです。
例えば、敷石の隙間に砂利を配置したい、という場合に砂利の画像に敷石をマスクとして使ったマップとの間で積算し、敷石がない部分の砂利だけ有効にするという方法が一般的です。
この方法は砂利が十分に小さい場合は有効ですが、それなりの大きさの丸石を配置したいとなると不自然に切られてしまいます。
Mask Mapはそもそもマスクされている部分には配置しないという形を取るので、このような切断は発生しなくなります。
ただし、より正確に配置したい場合は [Mask Map Sampling Technique] を [Pattern Bounding Box] にすることになるのですが、こちらはデフォルトの [Pattern Center] より重いです。

Vector Mapもちょっと特殊です。
このマップはScale、Position、Rotationの3箇所で参照することが出来るのですが、どうやらMask Mapによるマスキングが行われた後に処理が適用されるようです。
そのため、マスクが意味を成さなくなることがあります。使用の際には十分気をつけてください。

他のノードが入力パターンを1つしか受け入れていないのに対し、このノードは複数のパターンを入力することが出来ます。
[Pattern Input Number] を増やすことで入力パターンを増やせます。最大6つまでです。
複数のパターンを配置したい場合、それぞれで配置→[Blend]で合わせるという方法もあるのですが、その場合は重なってほしくないのに重なってしまうということもありえます。
入力パターンを増やすことでこの問題にある程度対応ができるので、大変使い勝手がいいです。

通常なら制御しにくいランダム配置を制御しやすくしてくれる大変ありがたいノードです。
速度面を気にする必要が無いのであれば積極的に使っていきたいノードです。

・何を選択すべきか?

自分が今やりたいことに合ったノードを選択することが重要ですが、どのような状況でどのノードを選択すべきでしょうか?
これについては感覚で覚えるのが一番早いのでしょうが、プログラマらしくある程度理屈で攻めてみます。

まず、画像を元にして配置に変化を与えたい場合は [Tile Sampler] 一択です。
マスクされた範囲にだけ配置したい、という場合は特にそうです。
非常に小さなパターンを大量に配置するのであれば [Splatter] で配置、マスクとMultiplyブレンドでも良いと思います。
しかし、ある程度形状のはっきりしたもの(小石など)の場合は切断されてしまって現実味が薄れます。
この場合は [Tile Sampler] の力を思う存分発揮してもらうのがいいと思います。

レンガやタイルなど規則正しく整列して欲しい場合は [Tile Random] 以外を選択しましょう。
オススメは [Tile Generator] ですが、速度が遅くても問題ないなら [Tile Sampler] もありです。
[Splatter] でも可能ですが、あえて選択する理由はないと考えます。
大きさもほぼ一定、並び方も規則正しい場合は [Tile Random] は使用できません。

ある程度形状がはっきりしているものをとりあえず配置したい場合はどれを選んでも構いません。
しかし、速度面の問題から [Tile Sampler] は避けたほうが良いと思います。
高度なことをしないのであれば速度的に速いものを選択すべきです。

この場合で、パターン同士が重なっては困る場合は [Tile Random] を使用しましょう。
このノードの [Random Constraints] が True の場合は位置のランダムを有効にしてもそれぞれのブロックからはみ出ることはなく、パターン同士の重なりが発生しません。
数が少ない場合は配置のパターンが見えてしまいますが、十分な数を配置すればパッと見で配置パターンはわかりません。

重なっても構わない場合は [Splatter] か [Tile Generator] が良いでしょう。
個人的には形状がはっきりしている場合は [Tile Generator] の方が使い勝手がいいと思います。
パラメータ的に狙った形を作りやすいんじゃないかと思いますが、それほどパラメータ調整をしないのであれば [Splatter] でも良いでしょう。

とにかく小さなものを大量に、形状もそこまではっきりしないという場合は [Splatter] をオススメします。
パッと見はランダムにボリュームのある点が大量に集まっているだけだが、よく見るとその点はある程度の形状を有している、というようなノイズ画像を作る際には速度面で考えても有効です。

これらの使用用途は個人的な見解であり、1つの指針でしかありません。
この作り方でやらなければいけないというわけでもないので、従う必要はありません。
ただ、なんとなく迷った時にこういう方針を掲げてる人がいたな、と思って参考にしていただければ幸いです。
  1. 2016/05/24(火) 00:24:52|
  2. Substance Designer
  3. | トラックバック:0
  4. | コメント:0
次のページ

プロフィール

monsho

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する