float4x4 ViewProjMat; float4 LightPos; struct s_vert2frag { float4 Pos : POSITION; float3 Normal : TEXCOORD1; float4 LightDir : TEXCOORD2; }; s_vert2frag vs_main(float4 inPos: POSITION, float3 inNormal: NORMAL) { s_vert2frag Out; Out.Pos = mul(ViewProjMat, inPos); Out.Normal = inNormal; Out.LightDir = Out.Pos - LightPos; return Out; } float4 Diffuse; float4 Specular; float4 EdgeColor; float EdgeThreshold; float SpecularThreshold; float4 ps_main(float3 inNormal:TEXCOORD1, float4 inLightDir:TEXCOORD2) : COLOR { float4 color = Diffuse; inLightDir = normalize(inLightDir); inNormal = normalize(inNormal); float lightDotNormal = dot(inLightDir, inNormal); if (abs(lightDotNormal) < EdgeThreshold) { color = EdgeColor; } if (lightDotNormal > SpecularThreshold) { color = Specular; } return color; }