Magnification shader creating very pixelated image

So I am trying to make a scope for my vr shooter. I have a setup where there is a render texture and a crosshair on the inside of the scope with a plane with a magnification shader on the eye side lense. This works great until I up the magnification on the scope to more than 2 times, then it becomes a pixelated mess. Basically, is there a way to remake this shader so that it doesn’t end up like this?171304-unknown-14.png

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

That’s because all you do is scaling up the rendertexture that still contains the same content. So of coruse zooming in on a finite pixel image won’t be great for the quality of the image. You should use a seperate camera for your rendertexture and zoom in by reducing the fov of that seperate camera. There’s not really a need for a magnification shader. You just want to make sure you cut out / mask your rendertexture to your scope shape properly.

ps: currently you don’t use an actual rendertexture since you just use a grabpass. A grabpass has a similar overhead

Thanks for the update and quick reply. I’ll be sure to keep an eye on this thread. Looking for the same issue. Bumped into your thread. Thanks for creating it. Looking forward for solution.