溶解
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" }

浙公网安备 33010602011771号