溶解

Shader "Dissolve/Dissolve_TexturCoords" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
    _Shininess ("Shininess", Range (0.03, 1)) = 0.078125
    _Amount ("Amount", Range (0, 1)) = 0.5
    _StartAmount("StartAmount", float) = 0.1
    _Illuminate ("Illuminate", Range (0, 1)) = 0.5
    _Tile("Tile", float) = 1
    _DissColor ("DissColor", Color) = (1,1,1,1)
    _ColorAnimate ("ColorAnimate", vector) = (1,1,1,1)
    _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
    _BumpMap ("Normalmap", 2D) = "bump" {}
    _DissolveSrc ("DissolveSrc", 2D) = "white" {}
    _DissolveSrcBump ("DissolveSrcBump", 2D) = "white" {}

}
SubShader { 
    Tags { "RenderType"="Opaque" }
    LOD 400
    cull off
    
    
CGPROGRAM
#pragma target 3.0
#pragma surface surf BlinnPhong addshadow



sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _DissolveSrc;
sampler2D _DissolveSrcBump;

fixed4 _Color;
half4 _DissColor;
half _Shininess;
half _Amount;
static half3 Color = float3(1,1,1);
half4 _ColorAnimate;
half _Illuminate;
half _Tile;
half _StartAmount;



struct Input {
    float2 uv_MainTex;
    float2 uv_BumpMap;
    float2 uvDissolveSrc;
};

void vert (inout appdata_full v, out Input o) {}

void surf (Input IN, inout SurfaceOutput o) {
    fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
    o.Albedo = tex.rgb * _Color.rgb;
    
    float ClipTex = tex2D (_DissolveSrc, IN.uv_MainTex/_Tile).r ;
    float ClipAmount = ClipTex - _Amount;
    float Clip = 0;
    float4 DematBump =  tex2D (_DissolveSrcBump,IN.uv_MainTex/_Tile);
    o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
if (_Amount > 0)
{
    if (ClipAmount <0)
    {
        Clip = 1; //clip(-0.1);
    
    }
     else
     {
    
        if (ClipAmount < _StartAmount)
        {
            if (_ColorAnimate.x == 0)
                Color.x = _DissColor.x;
            else
                Color.x = ClipAmount/_StartAmount;
          
            if (_ColorAnimate.y == 0)
                Color.y = _DissColor.y;
            else
                Color.y = ClipAmount/_StartAmount;
          
            if (_ColorAnimate.z == 0)
                Color.z = _DissColor.z;
            else
                Color.z = ClipAmount/_StartAmount;

            o.Albedo  = (o.Albedo *((Color.x+Color.y+Color.z))* Color*((Color.x+Color.y+Color.z)))/(1 - _Illuminate);
            o.Normal = UnpackNormal(tex2D(_DissolveSrcBump, IN.uvDissolveSrc));
        
        }
     }
 }

 
if (Clip == 1)
{
clip(-0.1);
}

   
    //////////////////////////////////
    //
    o.Gloss = tex.a;
    o.Alpha = tex.a * _Color.a;
    o.Specular = _Shininess;
    
}
ENDCG
}

FallBack "Specular"
}
Shader "Dissolve/Dissolve_WorldCoords" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
    _Shininess ("Shininess", Range (0.03, 1)) = 0.078125
    _Amount ("Amount", Range (0, 1)) = 0.5
    _StartAmount("StartAmount", float) = 0.1
    _Illuminate ("Illuminate", Range (0, 1)) = 0.5
    _Tile("Tile", float) = 1
    _DissColor ("DissColor", Color) = (1,1,1,1)
    _ColorAnimate ("ColorAnimate", vector) = (1,1,1,1)
    _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
    _BumpMap ("Normalmap", 2D) = "bump" {}
    _DissolveSrc ("DissolveSrc", 2D) = "white" {}
    _DissolveSrcBump ("DissolveSrcBump", 2D) = "white" {}

}
SubShader { 
    Tags { "RenderType"="Opaque" }
    LOD 400
    cull off
    
    
CGPROGRAM
#pragma target 3.0
#pragma surface surf BlinnPhong addshadow



sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _DissolveSrc;
sampler2D _DissolveSrcBump;

fixed4 _Color;
half4 _DissColor;
half _Shininess;
half _Amount;
static half3 Color = float3(1,1,1);
half4 _ColorAnimate;
half _Illuminate;
half _Tile;
half _StartAmount;



struct Input {
    float2 uv_MainTex;
    float2 uv_BumpMap;
    float2 uvDissolveSrc;
    float3 worldPos;
};

void vert (inout appdata_full v, out Input o) {}

void surf (Input IN, inout SurfaceOutput o) {
    fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
    o.Albedo = tex.rgb * _Color.rgb;
    
    float ClipTex = tex2D (_DissolveSrc, float2(IN.worldPos.x,IN.worldPos.y)/_Tile).r * tex2D (_DissolveSrc, float2(IN.worldPos.y,IN.worldPos.z)/_Tile).g;
    float ClipAmount = ClipTex - _Amount;
    float Clip = 0;
    float4 DematBump =  tex2D (_DissolveSrcBump, float2(IN.worldPos.x,IN.worldPos.y)/_Tile) * tex2D (_DissolveSrcBump, float2(IN.worldPos.y,IN.worldPos.z)/_Tile);
    o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
if (_Amount > 0)
{
    if (ClipAmount <0)
    {
        Clip = 1; //clip(-0.1);
    
    }
     else
     {
    
        if (ClipAmount < _StartAmount)
        {
            if (_ColorAnimate.x == 0)
                Color.x = _DissColor.x;
            else
                Color.x = ClipAmount/_StartAmount;
          
            if (_ColorAnimate.y == 0)
                Color.y = _DissColor.y;
            else
                Color.y = ClipAmount/_StartAmount;
          
            if (_ColorAnimate.z == 0)
                Color.z = _DissColor.z;
            else
                Color.z = ClipAmount/_StartAmount;

            o.Albedo  = (o.Albedo *((Color.x+Color.y+Color.z))* Color*((Color.x+Color.y+Color.z)))/(1 - _Illuminate);
            o.Normal = UnpackNormal(tex2D(_DissolveSrcBump, IN.uvDissolveSrc));
        
        }
     }
 }

 
if (Clip == 1)
{
clip(-0.1);
}

   
    //////////////////////////////////
    //
    o.Gloss = tex.a;
    o.Alpha = tex.a * _Color.a;
    o.Specular = _Shininess;
    
}
ENDCG
}

FallBack "Specular"
}

using UnityEngine;
using System.Collections;

public class Timed : MonoBehaviour
{
    public float m_fDestruktionSpeed = 0.1f;
    public Material m_Mat;
    public float m_fTime;

    void Start () {
        m_Mat = renderer.material;
    }

    void Update () {
        m_fTime += Time.deltaTime * m_fDestruktionSpeed;
        if (m_fTime >= 1.5f)
            m_fTime = 0;
        m_Mat.SetFloat("_Amount", m_fTime);
    }
}

 简化版可以在低端机器上运行

Shader "Dissolve/Dissolve_TexturCoords" {

Properties {
    //_Color ("Main Color", Color) = (1,1,1,1)
    _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
    _Shininess ("Shininess", Range (0.03, 1)) = 0.078125
    _Amount ("Amount", Range (0, 1)) = 0.5
    _StartAmount("StartAmount", float) = 0.1
    _Illuminate ("Illuminate", Range (0, 1)) = 0.5
    _Tile("Tile", float) = 1
    _DissColor ("DissColor", Color) = (1,1,1,1)
    _ColorAnimate ("ColorAnimate", vector) = (1,1,1,1)
    _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
//    _BumpMap ("Normalmap", 2D) = "bump" {}
    _DissolveSrc ("DissolveSrc", 2D) = "white" {}
//    _DissolveSrcBump ("DissolveSrcBump", 2D) = "white" {}

}
SubShader { 
    //Tags { "RenderType"="Opaque" }
    //LOD 400
    cull off
    
    
CGPROGRAM
#pragma target 3.0
#pragma surface surf BlinnPhong addshadow



sampler2D _MainTex;
//sampler2D _BumpMap;
sampler2D _DissolveSrc;
//sampler2D _DissolveSrcBump;

fixed4 _Color;
half4 _DissColor;
half _Shininess;
half _Amount;
static half3 Color = float3(1,1,1);
half4 _ColorAnimate;
half _Illuminate;
half _Tile;
half _StartAmount;



struct Input {
    float2 uv_MainTex;
//    float2 uv_BumpMap;
    float2 uvDissolveSrc;
};

//void vert (inout appdata_full v, out Input o) {}

void surf (Input IN, inout SurfaceOutput o) {
    fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
    o.Albedo = tex.rgb; //* _Color.rgb;
    
    float ClipTex = tex2D (_DissolveSrc, IN.uv_MainTex/_Tile).r ;
    float ClipAmount = ClipTex - _Amount;
    //float Clip = 0;
    //float4 DematBump =  tex2D (_DissolveSrcBump,IN.uv_MainTex/_Tile);
    //o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
//if (_Amount > 0)
{
    //if (ClipAmount <0)
    {
    //    Clip = 1; //clip(-0.1);
    
    }
    // else
     {
    
        if (ClipAmount < _StartAmount)
        {
            //if (_ColorAnimate.x == 0)
            //    Color.x = _DissColor.x;
            //else
                Color.x = ClipAmount*10;///_StartAmount;
          
            //if (_ColorAnimate.y == 0)
            //    Color.y = _DissColor.y;
            //else
                Color.y = ClipAmount*10;//_StartAmount;
          
            //if (_ColorAnimate.z == 0)
            //    Color.z = _DissColor.z;
            //else
                Color.z = ClipAmount*10;//_StartAmount;

            o.Albedo  = (o.Albedo *((Color.x+Color.y+Color.z))* Color*((Color.x+Color.y+Color.z)))/(1 - _Illuminate);
            //o.Normal = UnpackNormal(tex2D(_DissolveSrcBump, IN.uvDissolveSrc));
        
        }
     }
 }

 
if (ClipAmount <0)
{
    clip(-0.1);
}

   
    //////////////////////////////////
    //
    o.Gloss = tex.a;
    o.Alpha = tex.a;// * _Color.a;
    o.Specular = _Shininess;
    clip(o.Alpha-0.5);// my adding
}
ENDCG
}

FallBack "Specular"
}

 

posted @ 2014-11-26 17:20  kadajEvo  阅读(164)  评论(0)    收藏  举报