Custom Nodeの作成(Shader Graph Version7.3.1)
Unityではシェーダを視覚的に作成できる「Shader Graph」が使用できます。このShader Graphでは様々なノードが利用でき、それらを繫げることでシェーダを作成します。このノードの中にCustom Function Nodeがあり、これを利用することでオリジナルのノードを作成することができます。
ノードへ直接記述する方法
Shader Graphを開き、Custom Functionを追加します。このノードの歯車をクリックすると以下のようにメニューが表示されます。
TypeをStringにするとBodyが表示されます。ここへ、hlslコードを直接記述します。
試しに、UV座標をx成分、y成分へ分けるノードを作成します。Inputsの+から入力用の変数UVを追加します。さらに、Outputsの+から出力用の変数X及びYを追加します。
ノードの名前を入力し、BodyへUVのx成分をOutputsのXへ、y成分をOutputsのYへ出力するコードを記述します。
これで、Custom Function Nodeが完成しました。新しく作成したノードへUV座標を入力し、出力X、YをPreviewによって表示すると
となり、ノードが意図したとおりに動作していることが分かります。
ファイルを利用する方法
前回作成したタイリング可能なセルラーノイズをファイルを用いてノードへ追加します。新しくhlslファイルを作成します。このhlslファイルへ記述した関数を利用することができます。ノードで利用する関数には、関数名へfloatを追加で記述する必要があります(関数名_float)。
1 2 3 4 5 6 7 |
#ifndef MYHLSLINCLUDE_INCLUDED #define MYHLSLINCLUDE_INCLUDED void TilingVoronoi_float() { ・・・ } #endif |
次に、ノードの入出力値を関数の引数へ記述します。下記関数ではfloat2 UV, int Scale, int Seed, float2 Offsetが入力値、out float Outが出力値となります。
1 2 3 4 5 6 7 |
#ifndef MYHLSLINCLUDE_INCLUDED #define MYHLSLINCLUDE_INCLUDED void TilingVoronoi_float(float2 UV, int Scale, int Seed, float2 Offset, out float Out) { ・・・ } #endif |
タイリング可能なセルラーノイズのコードを全て記述すると以下のコードとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#ifndef MYHLSLINCLUDE_INCLUDED #define MYHLSLINCLUDE_INCLUDED int2 tiling_position(float2 st, float scale) { float eps = 0.1; int2 sig = step(0.0, st); int2 p = fmod(floor(st), scale) + eps * sign(st); p = p * sig + (scale + p) * sign(-p) * (1 - sig); return p; } float2 rand2d(float2 st, int seed) { float2 s = float2(dot(st, float2(127.1, 311.7)) + seed, dot(st, float2(269.5, 183.3)) + seed); return frac(sin(s) * 43758.5453123); } float Tiling_CellularNoise(float2 st, int scale, int seed) { float2 f_st = frac(st); float min_dist = 1.0; float2 min_p; for (int j = -1; j <= 1; j++) { for (int k = -1; k <= 1; k++) { float2 n = float2(j, k); float2 p = rand2d(tiling_position(st + n, scale), seed); float dist = distance(f_st, p + n); if (dist < min_dist) { min_dist = dist; min_p = p; } } } return min_dist; } void TilingCellularNoise_float(float2 UV, int Scale, int Seed, float2 Offset, out float Out) { UV = UV * Scale + Offset; float result = Tiling_CellularNoise(UV, Scale, Seed); Out = result; } #endif |
このhlslファイルをノードで利用できるよう設定をします。まずは、Custom Functionノードを新規作成します。
Sourceへ先ほど作成したhlslファイルを設定します。そして、Nameを_floatを除いた関数名(TilingCellularNoise)を入力します。
次に、Inputsの+から入力用の変数(UV、Scale、Seed、Offset)を、Outputsの+から出力用の変数(Out)を追加します。変数名はhlslファイルに記述した変数名と異なる名前でも問題ありません。
これで、新しくTilingCellularNoiseノードを作成することができました。この新しく作成したノードへUVノードをつなげると
となり、問題なく動作していることが分かります。
※Color Spaceの設定が異なっているため、前回と見た目が変わっています(前回はGamma、今回はLinear)。
参考サイト
-
前の記事
ノイズのタイリング 2020.03.29
-
次の記事
FloatFieldの作成(Editor拡張)2020/07/11修正 2020.05.17
コメントを書く