Writing to normal - weird results

Hey guys. So I have the following shader:

Shader "Custom/ShaderTestBug"
{
    Properties
    {
        _Normal ("Normal", 2D) = "bump" {}
    }
 
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 400
 
        CGPROGRAM
        #pragma target 3.0
        #pragma surface surf Standard vertex:vert
        #include "UnityCG.cginc"
     
        struct Input
        {
            float4 color : COLOR;
            float3 worldPos;
            float3 wNormal;
            float3 pos;
            float2 uv_Normal;
        };

        sampler2D _Normal;
     
        void vert (inout appdata_full v, out Input o) {
            UNITY_INITIALIZE_OUTPUT(Input,o);
            o.color = v.color;
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            v.tangent.xyz = cross(v.normal, float3(0,0,1));
            v.tangent.w = -1;
            o.wNormal = mul( (float3x3) _Object2World , v.normal );
        }

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            [B]o.Normal = tex2D(_Normal, IN.uv_Normal);[/B]
            o.Albedo = abs(IN.wNormal);
        }

        ENDCG
    }
FallBack "Diffuse"
}

The bolded line is the important one. When commented out, this shader works as expected, producing the following image:

Uncommenting gives the following artifacts:

Confusingly, this artifact does not occur on the sphere, nor any high poly meshes I can find. This made me wonder if it’s something to do with batching breaking something with the input - even though I’m calculating the world normal myself! Turning off Dynamic Batching appears to do nothing.

Changing to Defferred rendering makes these artifacts white! Which makes me wonder if the black is actually a NaN as Defferred is a bit more careful about those?

Does anyone have any insight into this? Or perhaps an example of a shader that both reads the vertex normal, and writes the fragment normal?

EDIT: Oops! I was calculating the tangents wrong, that was it. Silly me!

Also…

o.Normal= tex2D(_Normal, IN.uv_Normal);

should be

o.Normal= UnpackNormal(tex2D(_Normal, IN.uv_Normal));