return love.graphics.newShader[[
  #define fog vec4( 0.6, 0.6, 0.7, 1.0 )
  #define fogHigh vec4( 0.7, 0.7, 0.6, 1.0 )
  #define sunDir 0.1 * vec3( 0.9, 0.2, 0.5 )
  varying float depth;
  varying vec3 normal;
  varying vec4 world;
#ifdef VERTEX
  //per instance: (uniform) x, y, z, height
  attribute vec4 spikeInstance;
  attribute float spikeOrientation;
  attribute vec3 VertexNormal;
  uniform mat4 view;
  uniform mat4 proj;
  vec4 position( mat4 _, vec4 pos ){
    normal = VertexNormal;
    pos.xz *= 0.25;
    pos.y *= spikeInstance.w;
    pos.xyz += spikeInstance.xyz;
    world = pos;
    
    vec4 eye = view * pos;
    depth = -eye.z;
    return proj*eye;
  }
#endif
#ifdef PIXEL
  uniform vec3 light;
  vec4 effect( vec4 color, Image tex, vec2 texuv, vec2 scruv) {
    vec2 uv = vec2(texuv.x, texuv.y/10.0);
    vec4 texel = Texel( tex, uv );
    
    //diffuse light
    vec3 norm  = normalize( normal );
    vec3 toLight = normalize( light - world.xyz );
    float diff = max( dot( norm, light ), 0.1 );
    
    vec4 mainColor = vec4( diff * texel.rgb, texel.a );
    
    
    return color * mix( mix( mainColor,
    fog,     clamp(  depth  / 80.0, 0.0, 1.0)),
    fogHigh, clamp(world.y / 20.0, 0.0, 1.0));
  }
#endif
]]