贴图的溶解效果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
}