# normalize light direction on a surface shader?

I don’t know a lot of shader programming! But I could manage to understand the at least “surface” of surface shaders!

Looks like with pixel shaders you use lightDir = normalize(lightDir); to normalize the light direction, but if I add that line on a surface shader, I get an error!

So long story short, how do I normalize light direction for my surface shader code?

Thanks!

In the Lighting function, add that line. Not in the bit you define o.Albedo and o.Normal, etc… the function after that

Oh I see. I studied a little more about the lighting function!

I still can’t quite understand how it works by reading the docs, so I copied and pasted one from the examples they provide, and added the normalizing line there.

Is this correct?

``````Shader "Reflective/Bumped Specular" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_SpecColor ("Specular Color", Color) = (0.5,0.5,0.5,1)
_Shininess ("Shininess", Range (0.01, 1)) = 0.078125
_ReflectColor ("Reflection Color", Color) = (1,1,1,0.5)
_MainTex ("Base (RGB) RefStrGloss (A)", 2D) = "white" {}
_Cube ("Reflection Cubemap", Cube) = "" { TexGen CubeReflect }
_BumpMap ("Normalmap", 2D) = "bump" {}
}

Tags { "RenderType"="Opaque" }
LOD 400
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0

sampler2D _MainTex;
sampler2D _BumpMap;
samplerCUBE _Cube;

fixed4 _Color;
fixed4 _ReflectColor;
half _Shininess;

half4 LightingSimpleLambert (SurfaceOutput s, half3 lightDir, half atten) {
lightDir = normalize(lightDir);
half NdotL = dot (s.Normal, lightDir);
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten * 2);
c.a = s.Alpha;
return c;
}

struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float3 worldRefl;
INTERNAL_DATA
};

void surf (Input IN, inout SurfaceOutput o) {
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
fixed4 c = tex * _Color;
o.Albedo = c.rgb;

o.Gloss = tex.a;
o.Specular = _Shininess;

o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

float3 worldRefl = WorldReflectionVector (IN, o.Normal);
fixed4 reflcol = texCUBE (_Cube, worldRefl);
reflcol *= tex.a;
o.Emission = reflcol.rgb * _ReflectColor.rgb;
o.Alpha = reflcol.a * _ReflectColor.a;

}
ENDCG
}
``````

Line where it says

#pragma surf BlinnPhong

#pragma surf SimpleLambert

but aside from that it seems to be ok.