anchor.diff:      return decodeDataForIBL(textureLod(light_iblSpecular, r, lod));
   }
   
  -vec3 specularIrradiance(const vec3 r, float roughness, float offset) {
  +vec3 prefilteredRadiance(const vec3 r, float roughness, float offset) {
       float lod = IBL_MAX_MIP_LEVEL * roughness * roughness;
       return decodeDataForIBL(textureLod(light_iblSpecular, r, lod + offset));
   }
  
positive.code:         inout vec3 Fd, inout vec3 Fr) {
  #if defined(SHADING_MODEL_SUBSURFACE)
      vec3 viewIndependent = diffuseIrradiance;
      vec3 viewDependent = specularIrradiance(-shading_view, pixel.roughness, 1.0 + pixel.thickness);
      float attenuation = (1.0 - pixel.thickness) / (2.0 * PI);
      Fd += pixel.subsurfaceColor * (viewIndependent + viewDependent) * attenuation;
  #elif defined(SHADING_MODEL_CLOTH) && defined(MATERIAL_HAS_SUBSURFACE_COLOR)
  
negative.code: // IBL specular
  //------------------------------------------------------------------------------
  
  vec3 prefilteredRadiance(const vec3 r, float roughness) {
      // lod = lod_count * sqrt(linear_roughness), which is the mapping used by cmgen
      // where linear_roughness = roughness^2
      // using all the mip levels requires seamless cubemap sampling
  