Shader贴图溶解效果

贴图的溶解效果Shader

第一个:调节溶解比

Shader "Custom/MyDissolveSurface" {
Properties {
//英文版
//_Color ("Color", Color) = (1,1,1,1)
//_MainTex ("Albedo (RGB)", 2D) = "white" {}
//_Glossiness ("Smoothness", Range(0,1)) = 0.5
//_Metallic ("Metallic", Range(0,1)) = 0.0
//
// _NoiseTex ("NoiseTex (R)",2D) = "white"{}  
//        _EdgeWidth("EdgeWidth",Range(0,0.5)) = 0.1  
//        _EdgeColor("EdgeColor",Color) =  (1,1,1,1)  
//  _EdgeThresholdValue ("EdgeThresholdValue(Zero for not use)",Range(0,1)) = 0.5  
//        _DissolvePercentage ("DissolvePercentage",Range(0,1)) = 0  
//中文版
_Color ("颜色", Color) = (1,1,1,1)
_MainTex ("主贴图 (RGB)", 2D) = "white" {}
_Glossiness ("平滑度", Range(0,1)) = 0.5
_Metallic ("金属性", Range(0,1)) = 0.0
_NoiseTex ("噪声贴图 (R)",2D) = "white"{}  
_EdgeWidth("边缘宽度",Range(0,0.5)) = 0.1  
_EdgeColor("边缘颜色",Color) =  (1,1,1,1)  
_EdgeThresholdValue ("硬边缘阈值(0为不使用)",Range(0,1)) = 0.5  
_DissolvePercentage ("溶解百分比",Range(0,1)) = 0  
}

SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
//原编译指令
//#pragma surface surf Standard fullforwardshadows
//增加addshadow以获得正确的阴影
#pragma surface surf Standard fullforwardshadows addshadow
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
sampler2D _NoiseTex;  
float _EdgeWidth;  
float4 _EdgeColor;  
float _EdgeThresholdValue;  
float _DissolvePercentage;
struct Input {
float2 uv_MainTex;
float3 worldPos;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o) {

// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
float DissolveFactor = saturate(_DissolvePercentage);  
//使用固定坐标
           // float noiseValue = tex2D(_NoiseTex,IN.uv_MainTex).r;   
            //使用世界坐标
             float noiseValue = tex2D(_NoiseTex,IN.worldPos.rg).r;

              //如果该值对应噪声图的值更大,则抛弃

            if(noiseValue <= DissolveFactor)  
            {  
                discard;  
            }   
            float4 texColor = tex2D(_MainTex,IN.uv_MainTex);  
            float EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor));  
            float4 BlendColor = texColor * _EdgeColor;  

           if(_EdgeThresholdValue>0){
           //不使用渐变(硬边缘)
          float HardEdgeFactor=EdgeFactor;
          if(HardEdgeFactor>_EdgeThresholdValue){
          HardEdgeFactor=1;
          o.Emission =0;  
          }else{ 
          HardEdgeFactor=0;
          o.Emission =_EdgeColor; 
          }
          o.Albedo = lerp(texColor,BlendColor,1-EdgeFactor);  
           }else{
           o.Emission =0; 
           //使用渐变(软边缘)
           if(_EdgeThresholdValue>=1){
             o.Albedo = BlendColor; 
             o.Alpha=0;
           }else{
            o.Albedo = lerp(texColor,BlendColor,1 - EdgeFactor);  
           }
           }

}
ENDCG
}
FallBack "Diffuse"
}

第二个:

Shader "Dissolve/Dissolve_TexturCoords" {  
    Properties {  
        _Color ("主颜色", Color) = (1,1,1,1)                       // 主色  
        _MainTex ("模型贴图", 2D) = "white" {}                      // 主材质  
        _DissolveText ("溶解贴图", 2D) = "white" {}                 // 溶解贴图  
        _Tile("溶解贴图的平铺大小", Range (0, 1)) = 1                // 平铺值,设置溶解贴图大小  
  
        _Amount ("溶解值", Range (0, 1)) = 0.5                     // 溶解度  
        _DissSize("溶解大小", Range (0, 1)) = 0.1                   // 溶解范围大小  
  
        _DissColor ("溶解主色", Color) = (1,1,1,1)                  // 溶解颜色  
        _AddColor ("叠加色,与主色叠加为开始色[R|G|B>0表示启用]", Color) = (1,1,1,1) // 改色与溶解色融合形成开始色  
    }  
    SubShader {   
        Tags { "RenderType"="Opaque" }  
        LOD 200  
        Cull off  
      
        CGPROGRAM  
        #pragma target 3.0  
        #pragma surface surf BlinnPhong  
  
        sampler2D _MainTex;  
        sampler2D _DissolveText;  
        fixed4 _Color;          // 主色  
        half _Tile;             // 平铺值  
        half _Amount;           // 溶解度  
        half _DissSize;         // 溶解范围  
        half4 _DissColor;       // 溶解颜色  
        half4 _AddColor;        // 叠加色  
        // 最终色  
        static half3 finalColor = float3(1,1,1);  
  
        struct Input {  
            float2 uv_MainTex;  // 只需要主材质的UV信息  
        };  
  
        void surf (Input IN, inout SurfaceOutput o) {  
            // 对主材质进行采样  
            fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);  
            // 设置主材质和颜色  
            o.Albedo = tex.rgb * _Color.rgb;  
            // 对裁剪材质进行采样,取R色值  
            float ClipTex = tex2D (_DissolveText, IN.uv_MainTex/_Tile).r;  
  
            // 裁剪量 = 裁剪材质R - 外部设置量  
            float ClipAmount = ClipTex - _Amount;  
            if(_Amount > 0)  
            {  
                // 如果裁剪材质的R色值 < 设置的裁剪值  那么此点将被裁剪  
                if(ClipAmount < 0)  
                {  
                    clip(-0.1);  
                }  
                // 然后处理没有被裁剪的值  
                else  
                {  
                    // 针对没有被裁剪的点,【裁剪量】小于【裁剪大小】的做处理  
                    // 如果设置了叠加色,那么该色为ClipAmount/_DissSize(这样会形成渐变效果)  
                    if(ClipAmount < _DissSize)  
                    {  
                        if(_AddColor.x == 0)  
                            finalColor.x = _DissColor.x;  
                        else  
                            finalColor.x = ClipAmount/_DissSize;  
  
                        if (_AddColor.y == 0)  
                            finalColor.y = _DissColor.y;  
                        else  
                            finalColor.y = ClipAmount/_DissSize;  
            
                        if (_AddColor.z == 0)  
                            finalColor.z = _DissColor.z;  
                        else  
                            finalColor.z = ClipAmount/_DissSize;  
                        // 融合  
                        o.Albedo  = o.Albedo * finalColor * 2;  
                    }  
                }  
            }  
            o.Alpha = tex.a * _Color.a;  
        }  
        ENDCG  
    }//endsubshader  
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值