How can I change magnification based on alpha value of texture in shader?

I found this shader on Reddit. The problem is I wanted to make a shader that will use texture to get magnification value, but I have no clue how to solve that. I tried to modify it to magnify based on distance from uv_diff and uv_center and it actually worked, but this is not the effect I wanted to achieve. I want to achieve effect on gif, which I made in another game engine, Construct 2.Thank you in advance.


112857-shader2.gif


Shader "Custom/Magnification"
{
    Properties
    {
        _Magnification("Magnification", Float) = 1
    }

    SubShader
    {
        Tags{ "Queue" = "Transparent" "PreviewType" = "Plane" }
        LOD 100

        GrabPass{ "_GrabTexture" }

        Pass
            {
                ZTest On
                ZWrite Off
                Blend One Zero
                Lighting Off
                Fog{ Mode Off }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                //our UV coordinate on the GrabTexture
                float4 uv : TEXCOORD0;
                //our vertex position after projection
                float4 vertex : SV_POSITION;
            };

            sampler2D _GrabTexture;
            half _Magnification;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                //the UV coordinate of our object's center on the GrabTexture
                float4 uv_center = ComputeGrabScreenPos(UnityObjectToClipPos(float4(0, 0, 0, 1)));
                //the vector from uv_center to our UV coordinate on the GrabTexture
                float4 uv_diff = ComputeGrabScreenPos(o.vertex) - uv_center;
                //apply magnification
                uv_diff /= _Magnification;
                //save result
                o.uv = uv_center + uv_diff;
                return o;
            }

            fixed4 frag(v2f i) : COLOR
            {
                return tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uv));
            }
            ENDCG
        }
    }
}

I do not programming shaders, I solved this issue.

I hope helped someone.

Just try:

Shader "Custom/Magnification"
 {
     Properties
     {
         _Magnification("Magnification", Float) = 1
        [HideInInspector] _MainTex ("Masking Texture", 2D) = "white" {}
        _AdditiveColor ("Additive Tint color", Color) = (0, 0, 0, 0)
        _MultiplyColor ("Multiply Tint color", Color) = (1, 1, 1, 1)
     }
 
     SubShader
     {
         Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Opaque" }
         LOD 100
 
         GrabPass{ "_GrabTexture" }
 
         Pass
             {

            
            Cull Off
            Lighting Off
            ZWrite Off
            ZTest [unity_GUIZTestMode]
            Blend SrcAlpha OneMinusSrcAlpha
 
             CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
 
             #include "UnityCG.cginc"
 
             struct appdata
             {
                 float4 vertex : POSITION;
                 float2 texcoord : TEXCOORD0;
             };
 
             struct v2f
             {
                 //our UV coordinate on the GrabTexture
                 float4 uv : TEXCOORD0;
                 float2 uvmain : TEXCOORD1;
                 //our vertex position after projection
                 float4 vertex : POSITION;
             };
 
             sampler2D _GrabTexture;
             half _Magnification;
             float4 _GrabTexture_TexelSize;
             float _Size;
             float4 _AdditiveColor;
             float4 _MultiplyColor;

             sampler2D _MainTex;
             float4 _MainTex_ST;
 
             v2f vert(appdata v)
             {
                 v2f o;
                 o.vertex = UnityObjectToClipPos(v.vertex);
                 //the UV coordinate of our object's center on the GrabTexture
                 float4 uv_center = ComputeGrabScreenPos(UnityObjectToClipPos(float4(0, 0, 0, 1)));
                 //the vector from uv_center to our UV coordinate on the GrabTexture
                 float4 uv_diff = ComputeGrabScreenPos(o.vertex) - uv_center;
                 //apply magnification
                 uv_diff /= _Magnification;
                 //save result
                 o.uv = uv_center + uv_diff;
                 o.uvmain = TRANSFORM_TEX(v.texcoord, _MainTex);
                 return o;
             }
 
             fixed4 frag(v2f i) : COLOR
             {
                    half4 sum = half4(0,0,0,0);

                    #define GRABPIXEL(weight,kernelx) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uv.x + _GrabTexture_TexelSize.x * kernelx * _Size, i.uv.y, i.uv.z, i.uv.w))) * weight

                    sum += GRABPIXEL(0.05, -4.0);
                    sum += GRABPIXEL(0.09, -3.0);
                    sum += GRABPIXEL(0.12, -2.0);
                    sum += GRABPIXEL(0.15, -1.0);
                    sum += GRABPIXEL(0.18,  0.0);
                    sum += GRABPIXEL(0.15, +1.0);
                    sum += GRABPIXEL(0.12, +2.0);
                    sum += GRABPIXEL(0.09, +3.0);
                    sum += GRABPIXEL(0.05, +4.0);
                    
                    half4 result = half4(sum.r * _MultiplyColor.r + _AdditiveColor.r, 
                        sum.g * _MultiplyColor.g + _AdditiveColor.g, 
                        sum.b * _MultiplyColor.b + _AdditiveColor.b, 
                        tex2D(_MainTex, i.uvmain).a);
                    
                    return result;
              }
             
             
             
             ENDCG
         }
     }
 }