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

前回の実践編ではフィルタを適用したレイヤーの各イメージを法則に従って変換するという、比較的簡単なフィルタの実装を紹介しました。
この手のフィルタはSubstance Designer上でもそのまま使える便利なフィルタですが、今回紹介するのはSubstance Painterのペイント機能を主に利用したちょっと特殊なフィルタの作り方です。
作るものはこんな感じのものです。

f:id:monsho:20180616010721p:plain

ちょっと前にTwitterにも上げましたが、上のレイヤーのペイントが剥げて下のレイヤーが見える、というようなフィルタです。
剥げる部分はSPのペイント機能を使ってペイントして指定します。

このような処理はSPの機能でも実現できるか?というと、可能ではありますが少々面倒です。
下のレイヤーが見えるようにするにはマスクを使えばいいので、ペイントと各フィルタで対応できます。
しかし、剥げた部分の周囲のペイントがめくれ上がる、というのはそれほど簡単ではないと思います。
今回のフィルタはそのようなことが1つのフィルタと1つのレイヤーで実現することができます。

ただ、注意として、あまり出来は良くありません。
実用的なものにするにはもっと詰める必要はあると思いますが、そこはまあ、自分なりに応用してみてください。

今回やること

今回新しく使用している手法は以下のものとなります。

  • User定義マップを使用して他のマップに迷惑をかけないペイントを行う
  • ペイント部分を取り出して効果を適用する
  • 下のレイヤーが見えるように疑似マスクを利用する

実際に作成しながら1つ1つ見ていきましょう。

User定義マップ

User定義マップはSPで使用できるマップの一種ですが、特に用途が決まっていないのでユーザが適当に用途を決めていいマップです。
これらは何らかの情報として出力することもできますし、今回のようにフィルタの起点とすることもできます。
使い方を決めるのはユーザなので、SP上では特に何かが起こったりしないマップチャンネルです。

SPのテクスチャセット設定でチャンネルを追加できますが、ここでUserマップの追加が可能です。

f:id:monsho:20180616011410p:plain

User定義マップは複数種類が使用できますが、今回は "User0" を使用することにしましょう。

SDでフィルタを作成するときは、入力のIDに user0 を指定します。
今回はまず "Painter Filter (specific)" のテンプレートからグラフを作成し、[Input] ノードを1つ追加します。
Attributes の設定は以下のようにします。

f:id:monsho:20180616011829p:plain

Usage の項目には実は User0 という項目がドロップダウンリストには存在しませんが、直入力で設定してください。
SPで User0 チャンネルを追加してそこにペイントしたりするとこの [Input] ノードに情報が入ってくるという寸法です。

ペイント部分を取り出す

SPで User0 のチャンネルにペイントが施されていると想定して話を進めます。
前述の通り、ペイントした結果は SD の [Input] ノードに入ってきますので、これをタネとして処理を作っていきましょう。

しかし、ペイントが剥げたような処理を1から実装するのは面倒なので、以前Substance Shareにアップしたグラフを使用します。

share.allegorithmic.com

このグラフはペイントが剥げた際のペイント部の高さ、ノーマル、ペイントが剥がれている部分のマスクを出力してくれます。
これをダウンロードしたら、作成したフィルタにリンクしてください。
配置しましたら、まず以下のように組んでみましょう。

f:id:monsho:20180616021905p:plain

User0の [Input] ノードをリンクした [Paint Peeling Mask] ノードに接続します。
途中で [Histogram Scan] ノードを経由していますが、[Paint Peeling Mask] が0/1の2値画像を必要としているためです。
2値画像でなくても動作はしますが、結果を保証できないために採用しています。

[Paint Peeling Mask] の出力にあるHeightは元のHeightチャンネルに加算しておきましょう。
このノードにはペイントの基本高さを設定するパラメータがありますが、特に変更する必要は感じませんでした。

下のレイヤーが見えるようにする

SP で下のレイヤーを見えるようにする最も良い手段はマスクを利用することですが、レイヤーのカラーチャンネルに適用されたフィルタからマスクチャンネルを設定する手段はありません。

ではどうすればいいかというと、実はフィルタの出力にはアルファ値を含めることができます。
アルファ値が含まれている [Output] ノードの場合、そのチャンネルのブレンド時にアルファ値が考慮されます。
つまり、同じマスクをすべてのチャンネルに対してアルファ値として出力することで、マスクと同じ結果を生み出すことができるというわけです。

それを考慮した最終結果は以下のようになります。

f:id:monsho:20180616030646p:plain

[Paint Peeling Mask] ノードから出力されるマスクは、ペイントが剥がれている部分が1.0、ペイント部分が0.0で出力されるので、[Invert Grayscale] ノードで反転してからアルファ値として適用します。
Base Color はRGBを出力する必要があるので [Alpha Merge] ノードを利用していますが、Roughness、Metallic、Heightは1チャンネルなので [RGBA Merge] ノードを利用しています。

最後に [Paint Peeling Mask] のパラメータをExposeして終了です。
Exposeしたいパラメータは好きなものを選択しましょう。ただ、今回はノーマルを利用していないので Normal Intensity パラメータは不要でしょう。

ここで1つ注意点を。
SDで設定される入力パラメータは最大値と最小値を設定することができます。
Clamp の項目を True にしない限り、最大・最小値はスライドバーの変動可能範囲を示すだけで、数値の直接入力を行うと最大値を大きく超えて設定することができます。

しかし、SPではこの方法が不可能になっているようです。
SDで設定した最大・最小値の間でスライダーを動かすことができ、数値の直接入力でも最大・最小値の値に収めるためにClampされてしまいます。
現在はまだ回避方法はなさそうなので、十分広い範囲を指定しておく方がよいと思います。

SPでペイントする

SPではまずテクスチャセット設定ウィンドウでUser0のチャンネルを追加しましょう。
そして、ペイントマテリアルのレイヤーを上に、下地のレイヤーを下にして、ペイントマテリアルのレイヤーにフィルタを以下のように設定します。

f:id:monsho:20180616032124p:plain

"Add Paint" でペイントを追加してから "Add Filter" で Paint Peeling Filter を指定します。
あとはこの追加ペイントでUser0のみにペイントすればペイントが剥がれたような結果を確認できるでしょう。
なお、モノクロ画像をUser0に適用すればよかったりするので、ペイントではなく塗りつぶしを使ってもよかったりします。

さて、全3回でSubstance Painter用のフィルタの作成方法を紹介しました。
今回作ったものは実用しようと思うともう少し詰めないと厳しい部分はありますが、作り方はわかったのではないでしょうか。
あまり日本語情報が多くない分野だなと思っていたので、人によっては役に立つ情報なのかなと思います。

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上で確認してください。

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

Substance Painter用フィルタの作り方(基礎編)

今回の記事はSubstance Painter用のフィルタをSubstance Designerで作成する基礎的はお話です。
ちょっと前にTwitterで流したやつの作り方をやる前に、まず基本的な部分を押さえておきましょう、ということです。
チュートリアルは Allegorithmic 公式からも出ていますし、難しいものではないのですが、とりあえず作ったことがない人向けなのでかなり初歩からの解説となります。

Substance Designer編

まずはSubstance Designerで簡単なフィルタを作成します。
新しいグラフを作成しますが、テンプレートとしては以下の3つのどれかを選択します。

f:id:monsho:20180614004327p:plain

(generic) は特に指定のない[Input]ノードと[Output]ノードが1つ置かれているだけの簡単なものです。
(specific) は入力ノードと出力ノードが4つずつ置かれています。Base Color / Roughness / Metallic / Heightですね。
(specific w/ additional maps) は (specific) と同様の入力と出力を持ち、加えてメッシュからベイクされたワールド法線、ポジションなどのマップも参照できるようになっています。
今回は (specific) を選択しましょう。
グラフ名はなんでもいいですが、今回は FilterTutorial という名前にしました。

グラフが表示されたら [Input] ノード、および [Output] ノードの Base Color以外を削除してしまいましょう。
今回は使いません。
次に以下のようにノードを組みます。

f:id:monsho:20180614005217p:plain

[HSL] ノードの [Saturation] パラメータは 1.0 にしておきます。
このグラフを一旦保存して、それから .sbsar を生成します。
生成するには、生成したグラフを選択してから以下のボタンを押してください。

f:id:monsho:20180614005504p:plain

保存フォルダとファイル名を決定し、保存をします。
保存する際に以下のようなダイアログが出てきますが、[Pixel size] のパラメータは不要なのでチェックを外しておきましょう。

f:id:monsho:20180614005638p:plain

これでSD側の作業は終了です。

Substance Painter

次にSubstance Painterを起動し、適当なプロジェクトを作成するか読み込みます。
とりあえず PreviewSphere をサンプルから読み込んだ方がテストするにも簡単でしょう。

プロジェクトを開いたらSDで保存した .sbsar ファイルをドラッグ&ドロップしましょう。
すると以下のダイアログが出てきますので2つのパラメータを変更します。

f:id:monsho:20180614011433p:plain

上の方はインポートするリソースのカテゴリーで、今回は "filter" にします。
下の方はこのリソースの寿命で、"project '~'" を選択するとこのプロジェクトを編集中にのみ有効になります。
つまり、このプロジェクトを閉じるとインポートしたリソースも消えます。
今回はテストなので永続的に置かれても困りますのでこのようにしました。

ではテストです。
適当なマテリアルをFillレイヤーに追加し、ここに Add Filter でフィルタを設定、追加したテストフィルタを設定してみましょう。
Base Colorの色が鮮やかになるのがわかるでしょう。
フィルタをON/OFFすれば色が変わるのを確認できるはずです。

何をしたのか?

SDで作成したフィルタは極めて簡単です。
入力として、フィルタが設定されたレイヤーの Base Color を取得します。
この Base Color はそのレイヤーのみの結果です。それまでのレイヤーのすべてを合成した結果ではないので注意してください。
そのため、ペイントしたレイヤーにフィルタをかけるとペイント部のみに効果がかかります。

で、この入力した Base Color に [HSL] ノードを使ってサチらせます。
そしてこのノードから最後の出力ノードに出力します。
出力先は Base Color なので、入力してきた Base Color を鮮やかな色合いにするだけし直しています。

なお、[Input] / [Output] ノードで特定の情報を入出力として扱いたい場合は、Identifier もしくは Usage に適切なものを選択します。
どのようなIDが有効かは以下のドキュメントから確認できます。

Channel specific filter - Substance Painter - Allegorithmic Documentation

フィルタを修正してみる

ちょっとフィルタを修正してみましょう。
SD に戻って [HSL] ノードのすべてのパラメータを Expose してください。
これを保存し、再度 .sbsar ファイルに出力します。

今度は SP に戻って、シェルフから今回作ったフィルタを選択、右クリックしてみてください。

f:id:monsho:20180614013615p:plain

このようなダイアログが表示されるので、[Reload] を選択しましょう。
リロード後、先ほどフィルタを設定した部分に新しいフィルタをD&Dしましょう。
すると [HSL] ノードの3つのパラメータをいじれるようになっているはずです。

とまあ、こんなところです。
次回は応用編です。

3Dノイズに疑似的なポジションを提供する

Twitterでも呟いてたネタをもう少し詳しく。
以前のブログ記事にも書きましたが、Substance Designer/Painterに3Dノイズが存在します。
3Dノイズは3次元空間の座標に対して連続的なノイズを生成してくれる代物ですが、逆を言えば3次元空間の座標が存在しなければノイズを生成してくれません。

Substance Painterは必ずメッシュを読み込まなければならないため、3次元空間の座標は簡単に取得できますが、Substance Designerでは必ずしもメッシュが読み込まれるとは限りません。
では、SDでメッシュが読み込まれていなければ使い道がないのか?というと、実はそんなこともなかったりします。
ポジションマップに相当する画像があれば使えるのです。
というわけで、今回はハイトマップを元に疑似的なポジションマップを作成し、そこから3Dノイズを使うというのをやってみます。

まず、[Pixel Processor]を用意しましょう。
次に[Pixel Processor]内部に入り、こんな感じにノードを組んでみます。

f:id:monsho:20180523230741p:plain

[Get Float2]で $pos を取得すると、0~1までのUV値を取得できます。
つまり、この[Pixel Processor]はRGチャンネルにUV値が、Bチャンネルに0が、Aチャンネルに1が入った状態になります。
この物体が3次元空間中に存在するとすれば、縦横の幅が1で、XY平面に水平な板ということになります。
では、この出力結果を適当な3Dノイズに接続してみましょう。

f:id:monsho:20180523231319p:plain

このようにちゃんとしたノイズが生成されているのがわかります。
ただ、2D Viewを見ているとわかると思いますが、ちょっとジャギジャギしてます。
理由は簡単で、[Pixel Processor]の出力が8ビットなので、3D座標の精度が低くなってしまっているのです。
なので、[Pixel Processor]のフォーマットを変更しましょう。とりあえず16ビットでOKです。

f:id:monsho:20180523231802p:plain

一目瞭然ですね。

次に、グラフのパラメータにFloatパラメータを追加しましょう。IDはheightとしておきます。
そして、[Pixel Processor]を以下のように変更します。

f:id:monsho:20180523232227p:plain

Bチャンネルに入る値が0ではなくheightというパラメータに変わりました。
あとはheightパラメータをいじってみましょう。ノイズが連続的に変化していくのがわかると思います。

では最後に、[Pixel Processor]を以下のように変更しましょう。

f:id:monsho:20180523232414p:plain

入力されたグレースケール画像を高さ(Z方向)とみなして疑似的なポジションを生成します。
結果はこんな感じになります。

f:id:monsho:20180523233000p:plain

使い物になるのか?というとなかなか難しい部分はあるかもしれませんが、今までにないようなノイズの生成が可能になるかもしれません。
興味がある方は実際に作ってみて、いろんなハイトマップを入力してみましょう!

.sbsファイルをコピーする際の注意点

Substance Designerゆるゆる会にて、こんな感じのエラーが出るというハプニングが。

f:id:monsho:20180423013344p:plain

とある. sbs ファイルを開いたときに出てきたエラーなのですが、エラーメッセージを見ての通り、開いた.sbsファイル内で使用されている. sbs ファイル(このエラーメッセージの場合は grunge_map_010_bitmap.sbs)が見つからないというものです。

このようなエラーは .sbs ファイルをよその環境などにコピーした際に発生します。
自身のライブラリに存在するノードを使用したが、コピーした先の環境にはその .sbs が存在しないとか、存在はしてもパスが通ってないとかの理由からファイルを見つけることができず失敗します。

新しい環境にもそのファイルが存在するのであれば、上の画像のダイアログで [Yes] を選択したあと、ファイル選択ダイアログが表示されるので、そこから対象となる .sbs ファイルを設定すればいいのです。

しかし、コピーするたびにパスを変更しなければならず、同じ環境しか使わないならともかく複数環境を行ったり来たりする場合には大変面倒です。

そこで今回紹介するのが .sbs ファイルを依存ノードを含んでエクスポートする方法です。
勉強会などに参加する場合には参考にしてください。

やり方はとっても簡単。
エクスポートしたい .sbs をSubstance Designerに読み込ませ、エクスポートしたい .sbs を右クリック、[Export with dependency] を選択しましょう。

f:id:monsho:20180423014727p:plain

以下のようなウィンドウが出てきたらエクスポートするフォルダを選択してOKをクリックするだけです。

f:id:monsho:20180423020952p:plain

最終的にはこのように、エクスポート対象と .sbs ファイルと、dependencies フォルダに依存するファイルがエクスポートされます。

f:id:monsho:20180423021137p:plain

以上です。

Subsntace Designerでカラーを設定するパラメータあれこれ

Substance Designerでマテリアルを作成した場合、ベースカラーを変更したいと考えることが多いと思います。
例えばタイルの色を白や黒、赤や青に変えたい場合が多くあるでしょう。
このような場合のカラーを変更する手段を3つほど紹介します。

HSL

HSLノードはHSL色空間を利用して色を変化させるときに使用します。
HSL色空間はHSV色空間と似たものですが、ちょっと計算式が違っています。
色相を360度の角度で表すため、赤→青と変化させる際に彩度と輝度は変更したくない場合、色相は変えずに彩度や輝度だけを変更したい場合に使いやすいです。
使い方も簡単で、出力するベースカラーに挟むだけでOKです。

f:id:monsho:20180326164818p:plain

上の画像では色相のみを変更して紫色にしていますので、彩度と輝度は維持されます。
パラメータはHue(色相)、Saturate(彩度)、Lightness(輝度)の3つがあり、パラメータをExposeする場合はすべてのパラメータをそのままExposeするだけでOKなので簡単です。

Replace Color

ある特定の色を別の色に変化させる場合に必要なHSLの変化量を自動計算してくれるノードです。
パラメータはSource ColorとTarget Colorの2つがあり、ユーザはSource Colorに代表色を設定しておきます。

f:id:monsho:20180326165941p:plain

変更したい色を出力するノードのすぐ後ろに接続し、以下の手順でパラメータを設定します。

f:id:monsho:20180326170242p:plain f:id:monsho:20180326170421p:plain

この後、Target ColorをExposeすればOKです。

若干面倒な部分としては、出力したいカラーのデフォルトが変更した場合にSource ColorとExpose済みのTarget Colorの両方を変更しなければならないという点です。
Source Colorは問題ないのですが、Expose済みのTarget Colorのデフォルト値を変更するのは上記の手段ではできません。
Source ColorをコピーしてTarget Colorに設定するか、Exposeしたパラメータを削除してもう一度同じ手順を踏むかのどちらかとなります。

Gradient (Dynamic)

上記2つの手法は全体の色を変化させることはできますが、Gradient Mapノードで作成したグラデーションの変化量などは変更できません。
これらを変更させたい場合も多分にあるのではないかと思うのですが、Gradient Mapのグラデーションは残念ながらExpose可能なパラメータではありません。
Gradient (Dynamic)ノードを用いると入力マップとしてGradient Mapの結果を入力することができます。

f:id:monsho:20180326171913p:plain

このノードの組み方はデフォルトのグラデーションが存在し、それとは別のグラデーションを使いたい場合の設定も可能にしたバージョンです。
もし、必ずユーザにグラデーションを設定させるのであれば、下のGradient (Dynamic)の出力を用いればOKです。
上記の組み方の場合は設定項目が多めになりますので注意してください。
手順はこのようになります。

f:id:monsho:20180326172532p:plain f:id:monsho:20180326172752p:plain f:id:monsho:20180326173653p:plain f:id:monsho:20180326173515p:plain f:id:monsho:20180326174015p:plain

画像がないとないとわかりにくかったので説明も画像に入れちゃいましたが、検索性が悪くなるんだよなぁ…

とりあえず自分がよく使う手法は以上ですが、他にこの方法いいよ!ってのがあったら教えてください。

Substance 2018の3Dノイズについて

Spring has come!

は~るで~すよ~(弾幕
というわけで暖かくなって花粉が飛びかう春が来ましたね。

春といえば!
Substance Designer/Painterのアップデートです!
というわけで双方とも2018.1が来ていますので、サクッとアップデートしちゃいましょう。
まあ、不具合はあるかもしれませんがね。

今回のアップデートではパフォーマンス向上が結構重要です。
特にSubstance Painterではシェルフのアイテム読み込みが驚くほどに速くなってます。
さすがに一瞬ということはありませんが、今までのように下手すると数分待たされるということはなくなりました。
特にSPで作業をする人にとっては朗報じゃないでしょうか。
また、UIもかなり変わっていますね。

Substance DesignerはUDIMのベイクに対応しています。
パフォーマンス向上はランダムシードの変更時にわかりやすいと思います。

さて、双方に共通しているアップデート内容として3Dノイズの追加が挙げられます。
この3Dノイズはかなりの可能性を秘めていると個人的には思うので、少し詳しく書きます。

プロシージャルにおけるノイズ

ノイズという単語は音楽の中に入ってくるプツプツといったもの、雨音のようなものなどを指す言葉として使われるのが一般じゃないかと思います。
映像系であれば8mmフィルム特有の線が入ったりとか、写真の場合はISO感度を高くしすぎた場合のざらつきなどでしょうか。

プロシージャルにおけるノイズは非常に重要で、SDならプロシージャルマテリアルの起点、ディテール作成など様々な分野で活躍します。
これらのノイズは完全に不規則なものではなく、ある程度の規則性を持ったランダムな画像になります。
ランダムなのに規則性とはこれいかに?という疑問もあるかもしれませんが、Perlin Noiseなどは特にわかりやすいのではないかと思います。

f:id:monsho:20180317010737p:plain

白と黒を凹凸と考えると、凹凸の場所自体に規則性はないものの、凹凸への変化は滑らかです。
SDのノイズのほとんどは規則性を持ったランダムノイズなので、タイリングも正しく行われますし、それらを如何様にブレンドしてもタイリングの原則は確保されるという便利な代物です。

しかし、これらのノイズ画像は2Dの画像ですので、平面ではその恩恵を受けられますが、3Dモデルに適用しようとすると問題が出てきてしまうのです。

3D空間で2Dノイズを使用する

手始めに球を出してみます。UV展開は以下のようになっています。

f:id:monsho:20180317011408p:plain

これに通常のノイズ代表として、[Cells 1]を貼りつけてみましょう。

f:id:monsho:20180317011553p:plain

2Dビューポートを見ると規則性のあるランダムになっていることがわかりますね。
しかし3Dビューポートは一律にランダムが適用されているように見えません。
中心部の胴体部分はノイズが横に伸びているように見えますし、球の頭頂部などはひどい有様です。

f:id:monsho:20180317011835p:plain

これを避ける方法として Tri-planar で貼りつける方法もあります。
Fill Layer のプロパティで Projection の項目を Tri-planar projection を選びます。

f:id:monsho:20180317012438p:plain

結果はこのようになります。

f:id:monsho:20180317012605p:plain

一見するとうまくいっているように見えますが、中心付近からY字型にラインが入っているように見えませんか?
これは Tri-planar の特徴です。

UVマップでのテクスチャ貼りつけは、1枚のテクスチャで球を包み込むような形になりますが、Tri-planar はXYZそれぞれの軸に垂直に6枚のテクスチャを貼りつけるようにします。
それぞれの軸に向いた面に対しては正しく貼りつけられるのですが、中間部分(斜め45度向き)では複数軸から貼りつけた内容をブレンドすることになります。
上の画像のY字型のラインはまさにこのブレンドされている部分です。
Tri-planar はある程度のクオリティは確保してくれるので使い物にならないわけではないのですが、連続性が微妙な部分が出てきてしまうのは避けられません。

3Dノイズを使用する

3Dノイズは2D空間にしか適用されなかったノイズを3D空間に拡張したものです。
つまり、奥行き方向にも連続性を持ったランダムが適用されるというわけです。

SPではシェルフ内の [Procedurals] カテゴリにまとめられています。

f:id:monsho:20180317015022p:plain

これをFill Layerに適用してみましょう。

f:id:monsho:20180317015115p:plain

Tri-planar の時と同じ場所をスクリーンショット撮影しているのですが、Y字のラインは見当たりませんね。
これは3Dノイズが3次元的な連続性を持っているからであり、連続性を持った面に対して連続性持ったノイズを提供してくれているのです。

ただし1点だけ注意を。
3Dノイズを使用する場合、ノイズの参照データとして Position Map が必要になります。
こいつはちゃんとベイクするようにしましょう。
SDで使う場合もメッシュを読み込んでその Position Map を生成しないと役に立ちません。