anchor.diff:      return mat3( T * invmax, B * invmax, N );
   }
   
  -vec3 perturb_normal( vec3 N, vec3 V, vec2 texcoord )
  +vec3 perturb_normal( vec3 N, vec3 V, vec2 texcoord)
   {
       // assume N, the interpolated vertex normal and 
       // V, the view vector (vertex to eye)
       vec3 map = texture(normalMap, texcoord ).xyz;
  +    //vec3 map = BiCubic(normalMap, texcoord).xyz;
       map = map * 255./127. - 128./127.;
       map.y = - map.y;
       mat3 TBN = cotangent_frame(N, -V, texcoord);
  
positive.code: vec3 fresnelSchlick(vec3 incidentVector, vec3 excidentVector, vec3 f0);
  vec4 getLightColor(LightSource l, vec3 p);
  float ShadowCalculation(vec4 fragPosLightSpace, vec3 normal, vec3 lightDir);
  
  // Normal Mapping Without Precomputed Tangents by Christian Schüler
  mat3 cotangent_frame(vec3 N, vec3 p, vec2 uv);
  vec3 perturb_normal( vec3 N, vec3 V, vec2 texcoord );
  
  // Number rendering code below by P_Malin
  float DigitBin( const int x );
  float PrintValue( const vec2 vStringCoords, const float fValue, const float fMaxDigits, const float fDecimalPlaces );
  
  void main(void) {
      vec3 specular = vec3(0.);
  
negative.code: 
      int nbLights = int(u_perPass.nbLights);
  
      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);
  
      // Fresnel f0 term
      vec3 f0 = vec3(0.04); 
  