噪声纹理-Dissolve进行消融效果Shader

Disslove

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
			}
		}
}

猜你喜欢

转载自blog.csdn.net/qq_39691716/article/details/120588417