LoginSignup
1
2

More than 3 years have passed since last update.

ディゾルブシェーダー

Posted at

溶ける

こんな感じで溶けます
2019-12-18-17-01-21_Trim.gif

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
        }
    }
}

必要なもの

こういういい感じの白黒画像を用意して、
DissolveTexに設定してください。
nc190430.png

仕組み

DissolveTexに設定した白黒画像をしきい値(Threshold)以下の場合はピクセルを描画しないで、
しきい値を加算したり減算したりすることで見た目を変化させています。
なので、画像の具合に表現がかなり左右されます。
色々設定して試してみてください。

使い方

Thresholdの値を増やすと出現し、減らすと消えます。

Mode

Manual : 手動で溶かせます。アニメなどでThresholdを変化させてください。
Time : 時間経過で現れます。一回出現して終わりです。Speed設定で出てくる速度を設定してください。
PingPong :時間経過で出現したり溶け消えたりを繰り返します。 Speed設定で速度を設定してください。

<設定例>
dissolveキャプチャ.PNG

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2