Shader "QShader/Dissolve"{
Properties{
_MainTex("Main Texture",2D) = "white"{}
_NoiseTex("Noise Texture",2D) = "white"{}
_Threshold("Disappear Threshold",Range(0,1)) = 0
_BurnFirstColor("Burn First Color",Color) = (1.0,1.0,1.0,1.0)
_BurnSecondColor("Burn Second Color",Color) = (1.0,1.0,1.0,1.0)
_LineWidth("Line Width",Float) = 1
_BumpMap("Bump Map",2D) = "bump"{}
_BumpScale("Bump Scale",Range(-5,5)) = 1
}
SubShader{
pass {
Tags{"LightMode" = "ForwardBase"}
Cull Off
CGPROGRAM
#pragma vertex Vertex
#pragma fragment Fragment
#include "Lighting.cginc"
#include "UnityCG.cginc"
#include "AutoLight.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float3 lightDir : TEXCOORD1;
float3 worldPos : TEXCOORD2;
SHADOW_COORDS(3)
};
sampler2D _MainTex;
sampler2D _NoiseTex;
fixed _Threshold;
float _Beta;
fixed4 _BurnFirstColor;
fixed4 _BurnSecondColor;
sampler2D _BumpMap;
float _BumpScale;
v2f Vertex(appdata_tan v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
TANGENT_SPACE_ROTATION;
//TANGENT_SPACE_ROTATION指的就是计算切线,副切线,法线等一大堆操作。
//由于它是一个宏,它会声明一个rotation来计算
//rotation就是切线空间转换矩阵
o.lightDir = mul(rotation,ObjSpaceLightDir(v.vertex)).xyz;
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
TRANSFER_SHADOW(o)
return o;
}
fixed4 Fragment(v2f i) :SV_TARGET{
//主纹理系数
fixed4 albedo = tex2D(_MainTex,i.uv);
//噪声纹理系数
fixed noise = tex2D(_NoiseTex,i.uv).r;
//切线空间下法线向量
fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap,i.uv)) * _BumpScale;
//切线空间下光源向量
fixed3 tangentLightDir = normalize(i.lightDir);
//环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
//漫反射
fixed3 diffuse = _LightColor0.xyz * albedo * saturate(dot(tangentNormal,tangentLightDir));
//采样到的噪声纹理 - _Threshold表示噪声的消融度。>0 表示还没有消除的部分 在o和_Beta之间进行差值计算
fixed t = 1 - smoothstep(0, _Beta,noise - _Threshold);
//没有消除的部分是本身颜色 即将消失的部分是被燃烧的颜色
fixed3 burnColor = lerp(_BurnFirstColor,_BurnSecondColor,t);
//计算灼烧的边缘的颜色
burnColor = pow(burnColor,5);
//剔除一部分像素
clip(noise - _Threshold);
UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);
return fixed4(lerp(ambient + diffuse * atten,burnColor,t * step(0.0001,_Threshold)),1.0);
}
ENDCG
}
}
}
噪声纹理-Dissolve进行消融效果Shader
最新推荐文章于 2022-11-04 19:20:43 发布