デコシノニッキ

デコシノニッキ

ホロレンジャーの戦いの記録

独習ShaderGraph その12 波紋風にリングを動かす

前回
www.tattichan.work

ShaderGraphでカッコいいエフェクトを作ってみます
nn-hokuson.hatenablog.com

元の講座がステップバイステップなので、同じようにやっていきます。
最終的には次のようになります。
f:id:haikage1755:20180218130517g:plain:w250

円を描くシェーダ

Shader "Custom/sample" {
	SubShader{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
#pragma surface surf Standard 
#pragma target 3.0

		struct Input {
		//World座標を取得するために宣言
		float3 worldPos;
	};

	void surf(Input IN, inout SurfaceOutputStandard o) {
		//Worldの原点座標からの距離
		float dist = distance(fixed3(0,0,0), IN.worldPos);
		//半径
		float radius = 2;
		//半径以上なら紫に、そうでなければ白色にする
		if (radius < dist) {
			o.Albedo = fixed4(110 / 255.0, 87 / 255.0, 139 / 255.0, 1);
		}
		else {
			o.Albedo = fixed4(1,1,1,1);
		}
	}
	ENDCG
	}
		FallBack "Diffuse"
}

f:id:haikage1755:20180218131118p:plain:w250

円を描くノード

f:id:haikage1755:20180218131913p:plain:w350

Distanceノードで原点からの距離を求めます。
f:id:haikage1755:20180218131952p:plain:w150

条件分岐にはStepを使っています。2以上であれば、1、そうでなければ0が返ってきます。
2以上(円の外)の部分に対しては紫色、2以下の部分はそのまま色を掛け合わせると0になってしまうのでOne Minusで反転して0を掛けています。
最後にそれぞれの色をAddで足し合わせます。
f:id:haikage1755:20180218132309p:plain:w150

f:id:haikage1755:20180218131808p:plain:w150

リングを描くシェーダ

Shader "Custom/sample" {
	SubShader{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
#pragma surface surf Standard 
#pragma target 3.0

		struct Input {
		float3 worldPos;
	};

	void surf(Input IN, inout SurfaceOutputStandard o) {
		//原点からの距離
		float dist = distance(fixed3(0,0,0), IN.worldPos);
		//半径
		float radius = 2;
		//0.2: リングの幅
		if (radius < dist && dist < radius + 0.2) {
			o.Albedo = fixed4(1,1,1,1);
		}
		else {
			o.Albedo = fixed4(110 / 255.0, 87 / 255.0, 139 / 255.0, 1);
		}
	}
	ENDCG
	}
		FallBack "Diffuse"
}

リングを描くノード

f:id:haikage1755:20180218140507p:plain:w350

2.2以下かつ2以上のノードです。ANDはMultiplyで作っています。
f:id:haikage1755:20180218140626p:plain:w150

elseはここからoneminusで反転すればokです。
f:id:haikage1755:20180218140829p:plain:w150

f:id:haikage1755:20180218140546p:plain:w150

リングをいっぱい描くシェーダ

Shader "Custom/sample" {
	SubShader{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
#pragma surface surf Standard 
#pragma target 3.0

		struct Input {
		float3 worldPos;
	};

	void surf(Input IN, inout SurfaceOutputStandard o) {
		//原点からの距離
		float dist = distance(fixed3(0,0,0), IN.worldPos);
		//sin波をつくる
		//absで反転して波を増やしている
		float val = abs(sin(dist*3.0));
		//sin波の山の閾値を超えた部分のみ白く塗る
		if (val > 0.98) {
			o.Albedo = fixed4(1, 1, 1, 1);
		}
		else {
			o.Albedo = fixed4(110 / 255.0, 87 / 255.0, 139 / 255.0, 1);
		}
	}
	ENDCG
	}
		FallBack "Diffuse"
}

リングをいっぱい描くノード

f:id:haikage1755:20180218153659p:plain:w350

距離を整数倍しています。数が大きいほど輪の数が多くなっていきます。
f:id:haikage1755:20180218153733p:plain:w150
この時点で既に波の部分はできています。
f:id:haikage1755:20180218153902p:plain:w150
Stepで条件分岐し、色の塗る範囲を決めます。
f:id:haikage1755:20180218154026p:plain:w150

f:id:haikage1755:20180218154119p:plain:w150

リングを動かすシェーダ

Shader "Custom/sample" {
	SubShader{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
#pragma surface surf Standard 
#pragma target 3.0

		struct Input {
		float3 worldPos;
	};

	void surf(Input IN, inout SurfaceOutputStandard o) {
		//原点からの距離
		float dist = distance(fixed3(0,0,0), IN.worldPos);
		//sin波をつくる
		//absで反転して波を増やしているものをTimeでずらす
		float val = abs(sin(dist*3.0 - _Time * 100));
		//sin波の山の閾値を超えた部分のみ白く塗る
		if (val > 0.98) {
			o.Albedo = fixed4(1, 1, 1, 1);
		}
		else {
			o.Albedo = fixed4(110 / 255.0, 87 / 255.0, 139 / 255.0, 1);
		}
	}
	ENDCG
	}
		FallBack "Diffuse"
}

f:id:haikage1755:20180218154657g:plain:w150

リングを動かすノード

f:id:haikage1755:20180218155045p:plain:w350

ベースは先の輪っかをいっぱい描くShaderです。変更点は、Time*100でずらしていくところです。引算はSubtractノードで計算できます。
f:id:haikage1755:20180218155257p:plain:w150

これで最初にお見せした表現の完成です。
f:id:haikage1755:20180218130517g:plain:w350

独習ShaderGraph その11 フォン鏡面反射とブリンフォン鏡面反射をつくる

前回
www.tattichan.work

フォン鏡面反射をつくります
ランバード拡散をもとに拡張していきます
nn-hokuson.hatenablog.com

フォン鏡面反射モデルのシェーダ

"Custom/Phong" {

	SubShader{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
#pragma surface surf SimplePhong
#pragma target 3.0

		struct Input {
		float2 uv_MainTex;
	};


	void surf(Input IN, inout SurfaceOutput  o) {
		o.Albedo = fixed4(1,1,1,1);
	}

	half4 LightingSimplePhong(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
	{
		//光の進む方向と面とが垂直に近ければ近いほど明るくなる
		half NdotL = max(0, dot(s.Normal, lightDir));
		//反射光
		float3 R = normalize(-lightDir + 2.0 * s.Normal * NdotL);
		//反射ベクトルRと視線ベクトルviewDirがどれだけ近いか
		//指数を大きくすればするほどハイライトの減衰が速くなり、ピンポイントで光るようになる
		float3 spec = pow(max(0, dot(R, viewDir)), 10.0);

		half4 c;
		//ランバード拡散の式にspecを足す
		c.rgb = s.Albedo * _LightColor0.rgb * NdotL + spec + fixed4(0.1f, 0.1f, 0.1f, 1);
		c.a = s.Alpha;
		return c;
	}
	ENDCG
	}
		FallBack "Diffuse"
}

f:id:haikage1755:20180218095030p:plain:w250

フォン鏡面反射モデルのノード

で、でかい…
f:id:haikage1755:20180218095254p:plain:w350

ランバード拡散でもやった光源の向きを計算する部分です。
f:id:haikage1755:20180218095418p:plain:w250

法線ベクトルと掛け合わせます。ここまでは前回と同じですね。
f:id:haikage1755:20180218095612p:plain:w250

反射光の部分です。Normalを2倍し、NdotLと掛け合わせ、マイナスをかけたライトの向きに足し合わせています。
f:id:haikage1755:20180218095737p:plain:w250

視線ベクトルと掛け合わせます。反射光の強さをPowerで調整する部分ですが、ここはVector1のPropertyをつくりInspectorから調整できるようにしています。
f:id:haikage1755:20180218100121p:plain:w250

ランバート拡散でつくった色に反射光を足しています。
f:id:haikage1755:20180218100254p:plain:w250

足す先はUnlitノードにしています。UnlitとはScene中においてある光の影響を受け付けません。しかしながら、Shaderでこのように光がない環境でも光があたっているように表現することができました。
f:id:haikage1755:20180218100335p:plain:w250

f:id:haikage1755:20180218100616g:plain:w250

ブリンフォン鏡面反射モデルのノード

f:id:haikage1755:20180218102320p:plain:w350

元のモデルに少し変更を加えてやります。変更箇所です。
f:id:haikage1755:20180218102302p:plain:w250

ハーフベクトルを求めます。ハーフベクトルはライトの方向と視線方向のベクトルを足し合わせたものの単位ベクトルです。
f:id:haikage1755:20180218102416p:plain:w250

反射は、ハーフベクトルと法線ベクトルの近さによって決まりますので、ハーフベクトルと法線ベクトルで内積をとります。あとは同じです。
f:id:haikage1755:20180218102623p:plain:w250

反射が荒くなりました。
f:id:haikage1755:20180218102710p:plain:w250

独習ShaderGraph その10 ランバード拡散照明モデル

前回
www.tattichan.work

今回
nn-hokuson.hatenablog.com

この自己学習期間中にShaderGraphがアップデートしました。(β版だからね…)ですので、Propertyなど一部変更が入っています。
www.tattichan.work

ランバード拡散照明モデル
Shader "Custom/SimpleLambert" {

	SubShader{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
#pragma surface surf SimpleLambert
#pragma target 3.0


		struct Input {
		float2 uv_MainTex;
	};


	void surf(Input IN, inout SurfaceOutput  o) {
		o.Albedo = fixed4(1,1,1,1);
	}

	half4 LightingSimpleLambert(SurfaceOutput s, half3 lightDir, half atten)
	{
		//光の向きとオブジェクトの法線方向で内積をとる
		//1(平行)なほど明るくなる
		//0(垂直)以下は影になる部分
		half NdotL = max(0, dot(s.Normal, lightDir));
		half4 c;
		//そのままだと影部分が描画されないため、環境光で下駄をはかせてやる
		c.rgb = s.Albedo * _LightColor0.rgb * NdotL + fixed4(0.2f, 0.2f, 0.2f, 1);
		c.a = s.Alpha;
		return c;
	}
	ENDCG
	}
		FallBack "Diffuse"
}

f:id:haikage1755:20180210185331p:plain:w250

ランバード拡散照明のノード

f:id:haikage1755:20180217212542p:plain:w350

ShaderForgeのようなLightDirectionをもたないため、自分で光の向きを計算してやる必要があります。
Transform.Rotationが(0,0,0)のとき、ライトの向きはz方向が前になります。つまり単位ベクトルは(0,0,1)ですね。このベクトルに対して、Transform.Rotationの値を考慮してベクトルを回転させてやります。

回転行列 - Wikipedia

LightDirectionには(50,-30,0)とDirectionlLightの標準の向きを入れてあります。このままでは使えないので、DegreesToRadiansで、角度からラジアンに変換してやります。

f:id:haikage1755:20180217212642p:plain:w250

Splitで各要素を取り出し、sin、cosを求めてやります。カラー用で使うノードだとは思うのですが他にやりようもなさそうなので…
ここで先ほどのベクトルの回転の話が登場します。左手系ではz-x-yの順で回転させてやります。
(0,0,1)をx軸周りにα、y軸周りにβ、z軸周りにγで回すと、(cosα sinβ、-sinα、cosα cosβ)になるかと思います。
参考 WebGL2入門 3D知識編

f:id:haikage1755:20180217212706p:plain:w250

ライトの向きベクトルについてですが、どうやら-transform.fowardの向きらしく、最後に-1を全体にかけて反転処理をしています。

あとはいつも通り内積をもとめ、Maximumノードで範囲を限定してやります。
次にオブジェクトの色を反映しましょう。白色にライトのカラー(255,244,214)を混ぜ合わせ、さっき求めた影の当たり方を掛け合わせます。
f:id:haikage1755:20180210200558p:plain:w250
最後にFixedValue(0.2,0.2,0.2,1)を足し合わせ、Albedoに適応したら完成です。

f:id:haikage1755:20180210200747p:plain:w250

Shader Graph Example Libraryを整理してみる

www.tattichan.work

参考
tips.hecomi.com

Color Rim

f:id:haikage1755:20180210121139p:plain:w250
f:id:haikage1755:20180210121443p:plain:w250

以前にやったリムとだいたい同じですね。
www.tattichan.work

ViewDirectionとNormalで内積をとり、0(垂直)に近いほど色合いを強くし、輪郭を強調します。0に近いほど色合いを強くするため、OneMinusで反転させてやります。
以前は使っていなかったSmoothStep関数を使います。
smoothstep (DirectX HLSL)
これにより、先ほどの値を最小値(1)と最大値(1-Rim)との間で補間してやります。Rimを大きくするほど、リム効果の影響範囲が大きくなります。Multiplyでリムに色付けしてやります。

入力からEmissionを取得し、Addします。Sub-PBRTextureSampleは今回より新しく追加されたノードですね。
f:id:haikage1755:20180210123018p:plain:w250

Scrolling Texture

f:id:haikage1755:20180210123546p:plain:w250
f:id:haikage1755:20180210123446p:plain:w250

ベースはこちらになります。が、このノード見る限り自分の間違っているなぁ…
www.tattichan.work

TimeにScroll Speedで重みづけして、Textureの流れるスピードを変更しています。Positionは頂点位置のことです。
f:id:haikage1755:20180210123807p:plain:w250
動くTexture部分をLerpで重ね合わせてやります。以前書いたこちらが参考になるかと思います。
www.tattichan.work
f:id:haikage1755:20180210124444p:plain:w250

Color Gradient

f:id:haikage1755:20180210124629p:plain:w250
f:id:haikage1755:20180210124720p:plain:w250

Gradientは勾配という意味です。Splitで頂点からG(グリーン)の要素を抜き出してやります。ちなみにRを取り出すと、左右のカラー勾配、Bだと前後のカラー勾配になります。Positionがさすのはモデルのローカル座標(x,y,z)のことだからでしょうか?まだ理解が足りていないです…
Spreadで色の広がり方、Positionで上下の勾配の切れ目位置のバランスを調節することができます。この値は0-で出力されるのでLerpに入れてやればベースカラーに対してどの程度別カラーを重ね合わせるといった処理になります。

Sliced

難しいです。予想になります…
f:id:haikage1755:20180210130640p:plain:w250
f:id:haikage1755:20180210130758p:plain:w250

PositionのG(上下)でSliceする方向を決めています。GとGを足し合わせ2倍にし、Multiplyによってさらに整数値を掛け合わせています。Fractuionは小数点部を返します。Step関数はある閾値に対して、それ以下は0を、それ以上では1を返すノードです。

例えばGが0.1-0.9であれば、整数倍したときは次の表と同じ対応になるかと思います。
f:id:haikage1755:20180210150500p:plain:w250

ここから小数点部だけ抜き出してみると、
f:id:haikage1755:20180210151003p:plain:w250

サンプル通り閾値を0.4としてみると、Stepによって返ってくるアルファ値は、
f:id:haikage1755:20180210151224p:plain:w250

ですね。つまり、整数倍していくほど01の切り替わり回数が多くなるためスライスの数は増えます。

Snow

f:id:haikage1755:20180210152754p:plain:w250
f:id:haikage1755:20180210152840p:plain:w250

まずパーツ1リム部分です。だいたい大丈夫でしょう。Powerでリムの減衰率を強調していますね。
f:id:haikage1755:20180210152948p:plain:w250

パーツ2です。Snow DirectionでSnowのかかる向きを調整します。さらに2値処理をかけることで、色合いをくっきりさせています。
f:id:haikage1755:20180210153303p:plain:w250

Snowの透明度をリムで決めてやります。SnowDepthが小さいほど雪の範囲が大きくなり、RimPowerが大きいほど雪はぼやけていきます。
f:id:haikage1755:20180210153655p:plain:w250

ToonRamp

f:id:haikage1755:20180212132753p:plain:w250
f:id:haikage1755:20180212132853p:plain:w250

所謂トゥーンシェーダと呼ばれるものです。中身も基本的な実装でした。
nn-hokuson.hatenablog.com

トゥーンシェーダでは、
1. 光の当たり度合い(影のでき方)を計算する
ライトの向きとオブジェクトのノーマルで内積をとる
1に近いほど強く光が当たっており、-1では完全に影。

f:id:haikage1755:20180212133541p:plain:w250

2. 影の色をテクスチャベースにする
内積値を1~-1から0~1になるように0.5をかけて0.5を足す
個の値をuv座標として扱う。
f:id:haikage1755:20180212133601p:plain:w250

3. もとのTextureと影テクスチャを掛け合わせる

加えてこのサンプルでは、発光用のテクスチャもAddで追加されています。

Texture Dissolve

f:id:haikage1755:20180212133956p:plain:w250
f:id:haikage1755:20180212134036p:plain:w250

Dissolveは「分解」という意味です。
qiita.com

分解表現用のTextureとTilingの設定です。
f:id:haikage1755:20180212134558p:plain:w250

Clipping用と穴の輪郭部分になります。上のClipping用のノードに対して下のノードは、Edgeが上乗せされているので、やや大きめになります。そこから穴部分を引いているので輪郭部分だけが抽出されるという仕組みです。
f:id:haikage1755:20180212134930p:plain:w250

輪郭は色付けしてEmissionに格納、Clipping部分はAlphaClippingThresholdに入れて最終的な穴あき部分を作っています。
f:id:haikage1755:20180212135804p:plain:w250

Hologram

f:id:haikage1755:20180212140022p:plain:w250
f:id:haikage1755:20180212140124p:plain:w250

Sci-Fiな表現をするHologram Shaderです。Asset Storeでもよく見かけますね。

uvを時間変化で動かしています。
f:id:haikage1755:20180212140344p:plain:w250

濃淡のバランスをとるためにone minusで色付けする部分のalpha値を反転させています。
f:id:haikage1755:20180212141047p:plain:w250

そのまま色を設定するとこうなります。
f:id:haikage1755:20180212141353p:plain:h150

ColoredGhostNoise

f:id:haikage1755:20180212141534p:plain:w250
f:id:haikage1755:20180212141854p:plain:w250

Shader名はColoredGhostNoiseですが、Sceneオブジェクト名はLiquidNoiseです。

uvスクロールにノイズを加えています。
f:id:haikage1755:20180212141945p:plain:w250

ノイズを元にベースカラーへのノイズのかけ具合、透明度の調整、法線を決めています。Normal Unpackは[Unity] Vertex/Fragment shaderで通常のライティングとシャドウを適用するサンプル - Qiitaを参照してください。まだ自分もよくわかっていないです…
f:id:haikage1755:20180212142118p:plain:w250

PhaseInAndOut

f:id:haikage1755:20180212142837p:plain:w250
f:id:haikage1755:20180212143222p:plain:w250

まずは分かりやすいClippingから。Positionからsplit Gで上下方向を取得し、
f:id:haikage1755:20180212145019p:plain:w250
StepでSplit Value閾値として上からどこまで0をみなすかを計算し、
f:id:haikage1755:20180212145132p:plain:w250
InverseColorで上下を反転させてやります。これでClippingは完成です。
f:id:haikage1755:20180212145351p:plain:w250
(こんなめんどくさい処理しなくても、Stepの入力値逆にすればいいんじゃないかという気もするけど…)

次に切り目を光らせる処理です。EdgeSpreadの入力は切り目の光らせる幅を決める部分です。
f:id:haikage1755:20180212145722p:plain:w250

Remapは、指定した範囲中における入力値の割合から別の範囲での割合から求められる値に変換する処理です。
【Shader Forge】Remapについて - Qiita
例えば、範囲を[a.b]、変換したい範囲を[A,B]、入力値をxとすると、指定区間内の現在の値の位置は、
ratio=(x-a)/(b-a)
新しい範囲に変換すると
X=ratio * (B-A) + A

範囲はSmoothStepを使って決めてやります。
f:id:haikage1755:20180212150749p:plain:w250

SmoothStepはある範囲内における割合いを0~1で返す関数です。
例えばGradientを下限、SplitValueが上限の時、Gradiednがより小さい場合(x)はEdgeは1ですし、yの時であればおよそ0.5になるでしょう。
これを全てのGradientについて行った結果このような細い線になるという訳です。ただ、線の部分が透明(黒)では意味がないのでone minusで反転します。
f:id:haikage1755:20180212151535p:plain:w250

あとは色をつけてEmissionに入れるだけです。
f:id:haikage1755:20180212152111p:plain:w250

ShaderGraphのアップデート

ShaderGraphがパワーアップしたようです。

こちらから入手
github.com

ざっくりとした更新内容

パッと見てわかる変更点と言えば、Propertyですね。
見た目がリッチになっただけではなく、入力値を整数だけではなく、Sliderでも設定できるようになりました。

Sliderの画面。最小値、最大値を設定できる。
f:id:haikage1755:20180210110058p:plain:w250

サンプルにはPlayerとParticlesの2つのシーンが入っています。
Player
f:id:haikage1755:20180210110404g:plain

Particle
f:id:haikage1755:20180210110456g:plain



独習Shaderの寄り道として、次回はこれらサンプルのノードの中身を解説したいです(できるとは言っていない)

【メモ】HoloLensでSSIDと信号強度を取得する

自分メモです。
HoloLens風のメニューが作りたかったのでやってみました。

メニューを動かす部分はたるこすさんのをそのまま移植しました。
tarukosu.hatenablog.com

f:id:haikage1755:20180209023003p:plain:w250

namespace

#if UNITY_UWP
using Windows.Networking.Connectivity
#endif

WlanConnectionProfileDetails Class (Windows.Networking.Connectivity) - UWP app developer | Microsoft Docs

ConnectionProfile Class (Windows.Networking.Connectivity) - UWP app developer | Microsoft Docs

//SSIDの取得
NetworkInformation.GetInternetConnectionProfile().WlanConnectionProfileDetails.GetConnectedSsid()

//信号強度の取得
NetworkInformation.GetInternetConnectionProfile().GetSignalBars()

ちなみにバッテリー残量はUnityで用意されています。

//(0-1)で返ってくる
SystemInfo.batteryLevel

残り時間が必要な場合はフル充電で残り2時間と想定してパーセンテージをかけてもいいかもしれないですね。

余談
システム音量や輝度などの取得は難しそうです。(タスケテ・・・)

独習ShaderGraph その9 テクスチャをブレンドする

前回 www.tattichan.work

参考ページ。今回は地形。普段ホロばっかなので地形を触るのは新鮮。 nn-hokuson.hatenablog.com

今回はブレンドする2枚のテクスチャ、またブレンドパターンが必要になります。

素材はpower p(以下略

Texture1
f:id:haikage1755:20180203143006p:plain:w150

Texture2
f:id:haikage1755:20180203143016p:plain:w150

マスク
f:id:haikage1755:20180203143212p:plain:w150

ブレンドするシェーダ

Shader "Custom/sample" {
    Properties{
        //Texture 1
        _MainTex("Main Texture", 2D) = "white" {}
        //Texture 2
        _SubTex("Sub Texture", 2D) = "white" {}
        //マスク
        _MaskTex("Mask Texture", 2D) = "white" {}
    }
        SubShader{
        Tags{ "RenderType" = "Opaque" }
        LOD 200

        CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0

        sampler2D _MainTex;
        sampler2D _SubTex;
        sampler2D _MaskTex;

    struct Input {
        //テクスチャのuv座標を使うため、
        //Input構造体にuv_MainTexを宣言
        float2 uv_MainTex;
    };

    void surf(Input IN, inout SurfaceOutputStandard o) {
        fixed4 c1 = tex2D(_MainTex, IN.uv_MainTex);
        fixed4 c2 = tex2D(_SubTex,  IN.uv_MainTex);
        fixed4 p = tex2D(_MaskTex, IN.uv_MainTex);

        //マスクが白(1)に近い場合 テクスチャ1を強め
        //マスクが黒(0)に近い場合 テクスチャ2を強め
        //Color = Texture1 * p + Texture2 * (1-p)
        
        //RGBで書くと
        //color.r = c1.r * p + c2.r * (1-p);
        //color.g = c1.g * p + c2.g * (1-p);
        //color.b = c1.b * p + c2.b * (1-p);

        //lerp(c2, c1, p) c1とc2の間を補間する
        //p = 0 (黒) -> c2のテクスチャのみ表示
        //p = 1 (白) -> c1のテクスチャのみ表示
        o.Albedo = lerp(c2, c1, p);
    }
    ENDCG
    }
        FallBack "Diffuse"
}

結果
f:id:haikage1755:20180203143201p:plain:w150

ブレンドするノード

完成図
f:id:haikage1755:20180203161024p:plain:w250

PropertyにTextureを3つAddします。
Math->Interpolation(補間)->Lerpのノードを作成し、

AにSubTexture
BにMainTexture TにMaskを適応します。

最後にoutをAlbedoに入れてやれば完成です。

f:id:haikage1755:20180203161456p:plain:w150

Textureの利用が増えてきたので、素材作りも何か考えないといけないですね…

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」