// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' //扭曲外扩 Shader "YXJ/Effect/DistortionExternal" { Properties{ _Alpha("Alpha", range(0,1)) = 1 _MaskTex("Mask Tex (A)", 2D) = "white" {} _NoiseTex("Noise Texture (RG)", 2D) = "white" {} _HeatTime("Heat Time", range(0,1.5)) = 1 _HeatForce("Heat Force", range(0,5)) = 0.1 _CutAlpha("小于此alpha 跟着顶点a做渐变", range(0,1)) = 0.3 } Category{ Tags{ "Queue" = "Transparent+100" "IgnoreProjector" = "True" "RenderType" = "Transparent" "LightMode" = "Grab_YXJ" } Cull Off Lighting Off ZWrite Off SubShader{ LOD 300 Blend SrcAlpha OneMinusSrcAlpha AlphaTest Greater .01 Pass{ HLSLPROGRAM #pragma vertex vert #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" struct appdata_t { float4 vertex : POSITION; half4 color : COLOR; float2 texcoord: TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; half4 color : COLOR; float2 uvMask : TEXCOORD0; float4 uvGrab : TEXCOORD1; }; sampler2D _MaskTex; float4 _MaskTex_ST; sampler2D _NoiseTex; float4 _NoiseTex_ST; half _HeatTime; half _HeatForce; half _Alpha; half _CutAlpha; SAMPLER(_CameraTransparentTexture); v2f vert(appdata_t v) { v2f o; o.vertex = TransformObjectToHClip(v.vertex); o.color = v.color; o.uvMask = TRANSFORM_TEX(v.texcoord, _MaskTex); #if UNITY_UV_STARTS_AT_TOP float scale = -1.0; #else float scale = 1.0; #endif o.uvGrab.xy = (float2(o.vertex.x, o.vertex.y * scale) + o.vertex.w) * 0.5; o.uvGrab.zw = o.vertex.zw; return o; } half4 frag(v2f i) : COLOR { //noise effect, 外扩 half4 offsetColor1 = tex2D(_NoiseTex, i.uvMask - _Time.xz * _HeatTime); i.uvGrab.x += ((offsetColor1.r + offsetColor1.r) - 1) * _HeatForce; i.uvGrab.y += ((offsetColor1.g + offsetColor1.g) - 1) * _HeatForce; half4 grab = tex2D(_CameraTransparentTexture, i.uvGrab.xy / i.uvGrab.w); half4 mask = tex2D(_MaskTex, i.uvMask); half maskA = min(mask.r, mask.a) * _Alpha; if(i.color.a < _CutAlpha) maskA = maskA * i.color.a; return half4(grab.rgb, maskA); } ENDHLSL } } } }