|
@@ -52,7 +52,7 @@ vec3 F0(float metallic, float specular, vec3 albedo) {
|
|
return mix(vec3(dielectric), albedo, vec3(metallic));
|
|
return mix(vec3(dielectric), albedo, vec3(metallic));
|
|
}
|
|
}
|
|
|
|
|
|
-void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, bool is_directional, float attenuation, vec3 f0, uint orms, float specular_amount, vec3 albedo, inout float alpha, vec2 screen_uv,
|
|
|
|
|
|
+void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, bool is_directional, float attenuation, vec3 f0, uint orms, float specular_amount, vec3 albedo, inout float alpha, vec2 screen_uv, vec3 energy_compensation,
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
vec3 backlight,
|
|
vec3 backlight,
|
|
#endif
|
|
#endif
|
|
@@ -230,7 +230,7 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, bool is_di
|
|
// https://google.github.io/filament/Filament.html#lighting/occlusion/specularocclusion
|
|
// https://google.github.io/filament/Filament.html#lighting/occlusion/specularocclusion
|
|
float f90 = clamp(dot(f0, vec3(50.0 * 0.33)), metallic, 1.0);
|
|
float f90 = clamp(dot(f0, vec3(50.0 * 0.33)), metallic, 1.0);
|
|
vec3 F = f0 + (f90 - f0) * cLdotH5;
|
|
vec3 F = f0 + (f90 - f0) * cLdotH5;
|
|
- vec3 specular_brdf_NL = cNdotL * D * F * G;
|
|
|
|
|
|
+ vec3 specular_brdf_NL = energy_compensation * (cNdotL * D * F * G);
|
|
specular_light += specular_brdf_NL * light_color * attenuation * specular_amount;
|
|
specular_light += specular_brdf_NL * light_color * attenuation * specular_amount;
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
@@ -405,7 +405,7 @@ float get_omni_attenuation(float distance, float inv_range, float decay) {
|
|
return nd * pow(max(distance, 0.0001), -decay);
|
|
return nd * pow(max(distance, 0.0001), -decay);
|
|
}
|
|
}
|
|
|
|
|
|
-void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 vertex_ddx, vec3 vertex_ddy, vec3 f0, uint orms, float taa_frame_count, vec3 albedo, inout float alpha, vec2 screen_uv,
|
|
|
|
|
|
+void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 vertex_ddx, vec3 vertex_ddy, vec3 f0, uint orms, float taa_frame_count, vec3 albedo, inout float alpha, vec2 screen_uv, vec3 energy_compensation,
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
vec3 backlight,
|
|
vec3 backlight,
|
|
#endif
|
|
#endif
|
|
@@ -667,7 +667,7 @@ void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v
|
|
}
|
|
}
|
|
|
|
|
|
vec3 light_rel_vec_norm = light_rel_vec / light_length;
|
|
vec3 light_rel_vec_norm = light_rel_vec / light_length;
|
|
- light_compute(normal, light_rel_vec_norm, eye_vec, size, color, false, omni_attenuation * shadow, f0, orms, omni_lights.data[idx].specular_amount, albedo, alpha, screen_uv,
|
|
|
|
|
|
+ light_compute(normal, light_rel_vec_norm, eye_vec, size, color, false, omni_attenuation * shadow, f0, orms, omni_lights.data[idx].specular_amount, albedo, alpha, screen_uv, energy_compensation,
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
backlight,
|
|
backlight,
|
|
#endif
|
|
#endif
|
|
@@ -702,7 +702,7 @@ vec2 normal_to_panorama(vec3 n) {
|
|
return panorama_coords;
|
|
return panorama_coords;
|
|
}
|
|
}
|
|
|
|
|
|
-void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 vertex_ddx, vec3 vertex_ddy, vec3 f0, uint orms, float taa_frame_count, vec3 albedo, inout float alpha, vec2 screen_uv,
|
|
|
|
|
|
+void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 vertex_ddx, vec3 vertex_ddy, vec3 f0, uint orms, float taa_frame_count, vec3 albedo, inout float alpha, vec2 screen_uv, vec3 energy_compensation,
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
vec3 backlight,
|
|
vec3 backlight,
|
|
#endif
|
|
#endif
|
|
@@ -871,7 +871,7 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- light_compute(normal, light_rel_vec_norm, eye_vec, size, color, false, spot_attenuation * shadow, f0, orms, spot_lights.data[idx].specular_amount, albedo, alpha, screen_uv,
|
|
|
|
|
|
+ light_compute(normal, light_rel_vec_norm, eye_vec, size, color, false, spot_attenuation * shadow, f0, orms, spot_lights.data[idx].specular_amount, albedo, alpha, screen_uv, energy_compensation,
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
backlight,
|
|
backlight,
|
|
#endif
|
|
#endif
|