anchor.diff:  }
         """
         ], prolog: [
  +        "",
           StdLibShader
         ])
     ];
  
positive.code:     new ShaderObject("LightBlinnPhongShadowF")
        ..AddVaryingVars([vVertexPosition, vNormal, vPositionFromLight])
        ..AddUniformVars([uLightDescs, uLightTypes, uShininess])
        ..AddUniformVars([uShadowMap, uEyePosition, uColor, uShadowBias])
        ..SetBody([
          """
  float GetShadow(vec4 positionFromLight,
                      sampler2D shadowMap,
                      float darkness,
                      float bias) {
  		vec3 depth = positionFromLight.xyz / positionFromLight.w;
  		depth = 0.5 * depth + vec3(0.5);
  		vec2 uv = depth.xy;
  
negative.code:     return (depth.z > d + bias) ? darkness : 1.0;
  }
  
  float GetShadowPCF(vec4 positionFromLight,
                     sampler2D shadowMap,
                     vec2 mapSize,
                     float darkness,
                     float bias) {
  		vec3 depth = positionFromLight.xyz / positionFromLight.w;
  		depth = 0.5 * depth + vec3(0.5);
  		vec2 uv = depth.xy;
      float d = 0.0;
      for(float dx = -1.5; dx <= 1.5; dx += 1.0) {
          for(float dy =-1.5; dy <= 1.5; dy += 1.0) {
              d += texture2D(shadowMap, uv + vec2(dx, dy) / mapSize).x;
          }
      }
      d /= 16.0;
      //return 1.0 - smoothstep(bias, bias, depth.z - d);
      return (depth.z > d + bias) ? darkness : 1.0;
  }
  
  void main() {
      float shadow = GetShadowPCF(${vPositionFromLight},
                                   ${uShadowMap}, ${uCanvasSize},
                                   0.1, ${uShadowBias});
  
  
      ColorComponents acc = ColorComponents(vec3(0.0), vec3(0.0));
  