anchor.diff:  
       int nbLights = int(u_perPass.nbLights);
   
  -    vec3 albedo = pow(texture(albedoMap, vTexCoords).rgb, vec3(2.2));
  +    vec3 albedo = pow(BiCubic(albedoMap, vTexCoords).rgb, vec3(2.2));
  +    /*float roughness = BiCubic(roughnessMap, vTexCoords).r;
  +    float ao = BiCubic(aoMap, vTexCoords).r;
  +    float fresnel = BiCubic(fresnelMap, vTexCoords).r;
  +    vec3 n = perturb_normal( vNorm, excidentVector, vTexCoords );*/
  +
  +    //vec3 albedo = pow(BiCubic(albedoMap, vTexCoords).rgb, vec3(2.2));
       float roughness = texture(roughnessMap, vTexCoords).r;
       float ao = texture(aoMap, vTexCoords).r;
       float fresnel = texture(fresnelMap, vTexCoords).r;
  -    vec3 n = perturb_normal( vNorm, excidentVector, vTexCoords );
  +    vec3 n = perturb_normal( vNorm, excidentVector, vTexCoords);
   
       // Fresnel f0 term
       vec3 f0 = vec3(0.04); 
  
positive.code:     return floor(mod((fCharBin / pow(2.0, floor(fract(vStringCoords.x) * 4.0) + (floor(vStringCoords.y * 5.0) * 4.0))), 2.0));
  }
  
  `;
  
negative.code:     vec3 ambient = vec3(0.015) * albedo * ao;
      vec3 resultingColor = ambient + LO * shadowFactor;
  
      // Debug: print numbers
      /*vec2 vFontSize = vec2(8.0, 15.0);
      resultingColor = mix( resultingColor, vec3(1.0, 1.0, 1.0), PrintValue( (gl_FragCoord.xy - vec2(0.0, 5.0)) / vFontSize, 
          xy.x, 4.0, 10.0));*/
  
      // Tone mapping by reinhart operator
      //resultingColor = resultingColor / (resultingColor + vec3(1.0));
      // Exposure tone mapping
      float exposure = 1.0; // => should be a uniform
      resultingColor = vec3(1.0) - exp(-resultingColor * exposure);
      // Gamma correction
      resultingColor = pow(resultingColor, vec3(1.0/2.2));
      
      color = vec4(resultingColor,1.0);
  
  }
  
  // Blaise-Guthmann texture filtering
  vec3 getFilteredTexel(sampler2D textureMap, vec2 off){
      //vec2 off = 2.999 * texelSize / 2.0;
      //vec2 off = vTexCoords;
      vec2 texelSize = 1.0 / vec2(textureSize(textureMap, 0));
      vec2 texelNumber = floor(off / texelSize);
      vec2 xy = 2.0 * (off - texelNumber*texelSize) / texelSize;
  
      vec3 ta,tx,ty,tc;
      float xoff = xy.x > 1.0 ? 1.0 : -1.0;
      float yoff = xy.y > 1.0 ? 1.0 : -1.0;
  
      ta = texture(textureMap, off).rgb;
  
      if(xy.x>=1.0){
          xy.x-=1.0;
          tx = texture(textureMap, off + vec2(texelSize.x,0.0)).rgb;
      }else{
          xy.x = 1.0 - xy.x;
          tx = texture(textureMap, off - vec2(texelSize.x,0.0)).rgb;
      }
  
      if(xy.y>=1.0){
          xy.y-=1.0;
          ty = texture(textureMap, off + vec2(0.0,texelSize.y)).rgb;
      }else{
          xy.y = 1.0 - xy.y;
          ty = texture(textureMap, off - vec2(0.0,texelSize.y)).rgb;
      }
  
      tc = texture(textureMap, off + texelSize * vec2(xoff, yoff)).rgb;
  
      float d1 = sqrt(xy.x * xy.x + xy.y * xy.y);
      float d = d1 > 1.0 ? (d1 - 1.0) / (sqrt(2.0) - 1.0) : 0.0;
  
      return (xy.x * tx + (1.0-xy.x) * ta + xy.y * ty + (1.0-xy.y) * ta + d * tc + (1.0-d) * ta ) / 3.0;
  }
  
  // Light intensity attenuation
  