I've modified the default diffuse sprite shader to support normals, but if I've 2 sprites on top of one another the normals appear to stack. When there's a lot of my characters on top of one another (they don't collide with each other on purpose) it gives almost a ghosting like affect. Any idea what I may have done wrong? Below is a screenshot of what's going on as well as my shader. The light is just a standard point light with default settings. Code (CSharp): Shader "Sprites/Bumped" { Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _BumpMap ("Sprite Normal", 2D) = "bump" {} _Color ("Tint", Color) = (1,1,1,1) [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } Cull Off Lighting Off ZWrite Off Fog { Mode Off } Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma surface surf Lambert vertex:vert #pragma multi_compile DUMMY PIXELSNAP_ON sampler2D _MainTex; sampler2D _BumpMap; fixed4 _Color; struct Input { float2 uv_MainTex; float2 uv_BumpMap; fixed4 color; }; void vert (inout appdata_full v, out Input o) { #if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH) v.vertex = UnityPixelSnap (v.vertex); #endif v.normal = float3(0,0,-1); v.tangent = float4(1, 0, 0, -1); UNITY_INITIALIZE_OUTPUT(Input, o); o.color = v.color * _Color; } void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color; o.Albedo = c.rgb * c.a; o.Alpha = c.a; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); } ENDCG } Fallback "Sprites/Diffuse" } I use the below script to add the normals to the sprites. It has a small amount of GC (pretty insignificant IMO.. couple bytes) if anyone is wondering how I'm setting the normals. The OnUpdate is optional with the animation parameter. Be sure you append _Normal to your sprite names and use that as the name for the normal as it uses a hashtable to match the current sprite to a normal. Code (CSharp): using UnityEngine; using System.Collections; public class SetSpriteNormal : MonoBehaviour { public Texture2D[] normals; public bool animated; private SpriteRenderer spriteRenderer; private string spriteName; private Hashtable textures; void Start() { spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); textures = new Hashtable(); foreach ( Texture2D normal in normals ) { textures.Add( normal.name.Replace( "_Normal", "" ), normal ); } setNormal(); } void Update() { if ( animated ) { setNormal(); } } void setNormal() { spriteName = spriteRenderer.sprite.name; if ( textures.Contains( spriteName ) ) { spriteRenderer.material.SetTexture( "_BumpMap", (Texture2D) textures[spriteName] ); } } }