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