ディゾルブシェーダー
溶ける
Unityで使える、溶けるタイプのシェーダーです。
※ライトの影響やスペキュラなどは設定していないので、
必要であればいい感じに追加してください。m(_ _)m
コード
Dissolve.shader
Shader "Custom/Dissolve"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DissolveTex ("DissolveTex", 2D) = "white" {}
[KeywordEnum(Manual, Time, PingPong)] _Mode ("Mode", Int) = 0
_Threshold("Threshold", Range(0, 1)) = 0
_Speed("Speed", Range(0, 5)) = 0
_PatternSize("Pattern Size", Range(0, 5)) = 1
}
SubShader
{
Tags { "RenderType" = "Transparent"}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile _MODE_MANUAL _MODE_TIME _MODE_PINGPONG
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
fixed4 wPos : TEXCOORD1;
};
sampler2D _MainTex;
sampler2D _DissolveTex;
float _Threshold;
float _Speed;
float _PatternSize;
v2f vert (appdata v)
{
v2f o;
o.wPos = v.vertex;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float4 sPos = ComputeScreenPos(i.wPos);
float2 uv = sPos.xy / sPos.w;
uv *= -1;
float4 disolveVar = tex2Dlod(_DissolveTex, float4(uv / _PatternSize, 0, 0));
//視界に合わせて動く
// float4 disolveVar = tex2D(_DissolveTex, i.vertex.xy / _PatternSize);
float gray = (disolveVar.x + disolveVar.y + disolveVar.z) / 3;
float threshold = 0;
#ifdef _MODE_MANUAL
threshold = _Threshold;
#elif _MODE_TIME
threshold = _Time.x * (1 + _Speed);
#elif _MODE_PINGPONG
threshold = 0.1 + (_SinTime.y * (1 + _Speed));
#endif
if( gray < 1 - threshold ){
discard;
}
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
必要なもの
Shader "Custom/Dissolve"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DissolveTex ("DissolveTex", 2D) = "white" {}
[KeywordEnum(Manual, Time, PingPong)] _Mode ("Mode", Int) = 0
_Threshold("Threshold", Range(0, 1)) = 0
_Speed("Speed", Range(0, 5)) = 0
_PatternSize("Pattern Size", Range(0, 5)) = 1
}
SubShader
{
Tags { "RenderType" = "Transparent"}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile _MODE_MANUAL _MODE_TIME _MODE_PINGPONG
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
fixed4 wPos : TEXCOORD1;
};
sampler2D _MainTex;
sampler2D _DissolveTex;
float _Threshold;
float _Speed;
float _PatternSize;
v2f vert (appdata v)
{
v2f o;
o.wPos = v.vertex;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float4 sPos = ComputeScreenPos(i.wPos);
float2 uv = sPos.xy / sPos.w;
uv *= -1;
float4 disolveVar = tex2Dlod(_DissolveTex, float4(uv / _PatternSize, 0, 0));
//視界に合わせて動く
// float4 disolveVar = tex2D(_DissolveTex, i.vertex.xy / _PatternSize);
float gray = (disolveVar.x + disolveVar.y + disolveVar.z) / 3;
float threshold = 0;
#ifdef _MODE_MANUAL
threshold = _Threshold;
#elif _MODE_TIME
threshold = _Time.x * (1 + _Speed);
#elif _MODE_PINGPONG
threshold = 0.1 + (_SinTime.y * (1 + _Speed));
#endif
if( gray < 1 - threshold ){
discard;
}
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
こういういい感じの白黒画像を用意して、
DissolveTexに設定してください。
仕組み
DissolveTexに設定した白黒画像をしきい値(Threshold)以下の場合はピクセルを描画しないで、
しきい値を加算したり減算したりすることで見た目を変化させています。
なので、画像の具合に表現がかなり左右されます。
色々設定して試してみてください。
使い方
Thresholdの値を増やすと出現し、減らすと消えます。
Mode
Manual : 手動で溶かせます。アニメなどでThresholdを変化させてください。
Time : 時間経過で現れます。一回出現して終わりです。Speed設定で出てくる速度を設定してください。
PingPong :時間経過で出現したり溶け消えたりを繰り返します。 Speed設定で速度を設定してください。
Author And Source
この問題について(ディゾルブシェーダー), 我々は、より多くの情報をここで見つけました https://qiita.com/Namagomi_Guria/items/8fc9d146332495e800af著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .