shader水波纹扩散至消解的过程

(1)效果如下:(感觉录屏效果总是怪怪的~~)
在这里插入图片描述
不多解释了,代码中注释的很详细了~~

Shader "Unlit/ForceFiled_first"
{
    
    
	Properties
	{
    
    
		_NoiseTex ("_NoiseTex", 2D) = "white" {
    
    }
		_RampTex ("_RampTex", 2D) = "white" {
    
    }
		_HitPos("HitPos",vector) = (0,0,0,0)
		_HitSize("_HitSize",float) = 1
		_HitSpread("_HitSpread",float) = 1
		_NoiseIntensity("_NoiseIntensity",float) = 1
		

		_HitFadeDistance("扩散的距离限制,最后到末尾时会消隐_HitFadeDistance",float) = 5
		_HitFadePower("_HitFadePower",float) = 1

	}
	SubShader
	{
    
    
		Tags {
    
     "RenderType"="Opaque" }
		LOD 100

		Pass
		{
    
    
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			// make fog work
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			struct appdata
			{
    
    
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;

			};

			struct v2f
			{
    
    
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
				float3 worldPos : TEXCOORD1;
			};

			sampler2D _NoiseTex,_RampTex;
			float4 _NoiseTex_ST,_RampTex_ST;
			float4 _HitPos;
			float _HitSize,_HitFadeDistance,_HitFadePower,_HitSpread,_NoiseIntensity;
			
			v2f vert (appdata v)
			{
    
    
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _NoiseTex);
				o.worldPos = mul(unity_ObjectToWorld,v.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
    
    
				// 第一点:
				// 深刻理解此行 : 顶点距离 hitPos 的距离  小于   _HitFadeDistance,    计算中的体现 为: (distance(_HitPos,i.worldPos) / _HitFadeDistance) 结果才会小于1
				//  那么   1 - 上面的结果  才会是一个 正数
				// 如果结果是一个负数, saturate 会直接将其转化为0  就起到mask的屏蔽效果
				
				// 第二点:
				// (1 -  (distance(_HitPos,i.worldPos) / _HitFadeDistance)  此值的计算结果是:   随着距离增大,   值变小
				//  所以 越往外 , 越接近于 0   

				//  基于以上两点, 用此结果作为mask      就起到: 水波纹扩散最后变淡消失的效果
				float fadeMask = saturate((1.0 -  (distance(_HitPos,i.worldPos) / _HitFadeDistance)) * _HitFadePower);
				//return float4(fadeMask.xxxx);
				fixed4 noiseCol = tex2D(_NoiseTex, i.uv);

				
				
				//
				// (distance(_HitPos - i.worldPos) - _HitSize  :  dis 小于 HitSize的 结果为负数  哪怕后面+ nosie的值 影响不大

				// (distance(_HitPos - i.worldPos) - _HitSize + (noiseCol.r * _NoiseIntensity))/ _HitSpread  此结果为负数, 

				// 将结果限制在clamp(-1,0)  , 最外面  用一个 “-” 将其转正!!!!!!!! 完美得到(0,1)的值!!!!!!!!  

				float uvX =  - clamp((distance(_HitPos , i.worldPos) - _HitSize + (noiseCol.r * _NoiseIntensity))/ _HitSpread, -1.0,0.0);

				//  上面 fadeMask  和 uvX 的计算  , 请分别  带入计算 距离hitPos 近和远的  结果值,  就能深刻理解了!!!!!


				// 因为是 采样  Ramp 渐变图,   Y 的值不影响采样结果,只变化 X 值即可
				float2 uv = float2(uvX,0.5);

				//return float4(uvX.xxxx);

				float3 rampCol = tex2D(_RampTex,uv ).rgb;

				// 最终的效果:  用fadeMask 作为遮罩
				float3 endCol = rampCol * fadeMask;


				return float4(endCol,1);
			}
			ENDCG
		}
	}
}

猜你喜欢

转载自blog.csdn.net/js0907/article/details/118828509
今日推荐