anchor.diff:  }
   
   #if defined(HAS_REFRACTION)
  -void applyRefraction(const PixelParams pixel, const vec3 n0, vec3 Fd, vec3 Fr, inout vec3 color) {
  +void applyRefraction(const PixelParams pixel,
  +    const vec3 n0, const vec3 E, vec3 Fd, vec3 Fr,
  +    inout vec3 color) {
  +    // when reading from the cubemap, we are not pre-exposed so we apply iblLuminance
  +    // which is not the case when we'll read from the screen-space buffer
  +    float scale = frameUniforms.iblLuminance;
       float eta0 = pixel.eta;
       vec3 r = -shading_view;
   
  
positive.code:     //vec3 r = v;
      //vec3 p = d * r;   // sample screen space here
  
      // for a sphere, with light at infinity (i.e. cubemap)
      r = refract(r, n0, eta0);
  
  #if defined(MATERIAL_HAS_ABSORPTION) && defined(MATERIAL_HAS_THICKNESS)
      float d = pixel.thickness * dot(-n0, r);
      vec3 T = exp(-pixel.absorption * d);
  #endif
  
      vec3 n1 = -normalize(dot(-n0, r) * r + n0 * 0.5);
      float eta1 = 1.0 / eta0;
      r = refract(r, n1, eta1);
  
      // for a slab, with light at infinity (i.e. cubemap)
      //      r = refract(v, n, eta);
      //      r = refract(r, n, 1.0 / pixel.eta);
      //vec3 r = v;
  
      // when reading from the cubemap, we are not pre-exposed so we apply iblLuminance
      // which is not the case when we'll read from the screen-space buffer
      vec3 Ft = prefilteredRadiance(r, pixel.perceptualRoughness) * frameUniforms.iblLuminance;
  
  #if defined(MATERIAL_HAS_ABSORPTION)
      Ft *= T;
  
negative.code:     multiBounceSpecularAO(specularAO, pixel.f0, Fr);
  
      // Note: iblLuminance is already premultiplied by the exposure
      combineDiffuseAndSpecular(pixel, n, E, Fd, Fr, color);
  }
  