How to get vertex normal into surface program?

I have tried

float3 nml : NORMAL;
in struct input and similar spellings, i can’t get it to compile, how do i do it please?

I believe you need to transfer it to the Input structure via the vertex modifier function. e.g.

Shader "Example/Vertex Normal" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
    SubShader {
      Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
      LOD 200

      #pragma surface surf Lambert alpha vertex:vert

      sampler2D _MainTex;

      struct Input {
          float2 uv_MainTex;
          float4 color : COLOR;
          float3 vertexNormal; // This will hold the vertex normal

      // Transfer the vertex normal to the Input structure
      void vert (inout appdata_full v, out Input o) {
          o.vertexNormal = abs(v.normal);

      void surf (Input IN, inout SurfaceOutput o) {
          half4 c = tex2D (_MainTex, IN.uv_MainTex);
          o.Albedo = c.rgb * IN.color.rgb; // vertex RGB
          o.Alpha = c.a * IN.color.a; // vertex Alpha

          // Do whatever you want with IN.vextexNormal here. For example:
          o.Albedo *= IN.vertexNormal;
    Fallback "Diffuse"

In the docs on the page here: Unity - Manual: Writing Surface Shaders
They talk about the Surface Shader input structure. They say if you put a float3 called worldNormal in your input struct, it’ll be populated with the world-space normal. So this would look something like:

struct Input {
	float2 uv_MainTex;
	float3 worldNormal; //Note: for a surface shader, you don't put the semantic NORMAL here