return love.graphics.newShader[[
  #define fog vec4( 0.85, 0.85, 1.0, 1.0 )
  #define fogHigh vec4( 1.0, 1.0, 0.85, 1.0 )
  #define sunDir 0.1 * vec3( 0.9, 0.2, 0.5 )
  varying float depth;
  varying vec3 normal;
  varying vec4 world;
  varying float instanceColor;
#ifdef VERTEX
  //per instance: (uniform) scale and xz position
  attribute vec4 bellInstance;
  attribute vec3 VertexNormal;
  uniform mat4 view;
  uniform mat4 proj;
  vec4 position( mat4 _, vec4 pos ){
    normal = VertexNormal;
    instanceColor = bellInstance.a;
    pos.xyz *= bellInstance.r;
    pos.xz += bellInstance.gb;
    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) {
    vec4 icolor = mix( vec4(1.0,1.0,1.0,1.0), vec4(0.5,0.0,0.0,1.0), instanceColor );
    vec4 texel = Texel( tex, texuv );
    float y = texuv.y;
    y = max( 0.1,
      1.4 * pow( 0.9*y*(1.0-0.9*y) , 0.25));
    vec3 albedo = texel.rgb * y;
    albedo.gb *= 0.5 * instanceColor + 0.75;
    
    
    //diffuse light
    vec3 norm  = normalize( normal );
    vec3 toLight = normalize( light - world.xyz );
    float diff = max( dot( norm, light ), 0.5 );
    
    vec4 mainColor = vec4( diff * albedo, 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
]]