diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl index dc762e43d9..80411f4401 100644 --- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl @@ -1916,7 +1916,8 @@ void fragment_shader(in SceneData scene_data) { vec3 bent_normal = normal; #endif vec3 ref_vec = normalize(reflect(-view, bent_normal)); - ref_vec = mix(ref_vec, bent_normal, roughness * roughness); + // Interpolate between mirror and rough reflection by using linear_roughness * linear_roughness. + ref_vec = mix(ref_vec, bent_normal, roughness * roughness * roughness * roughness); for (uint i = item_from; i < item_to; i++) { uint mask = cluster_buffer.data[cluster_reflection_offset + i]; diff --git a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl index 00258efe38..b150de6ed3 100644 --- a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl @@ -1401,7 +1401,8 @@ void main() { vec3 bent_normal = normal; #endif vec3 ref_vec = normalize(reflect(-view, bent_normal)); - ref_vec = mix(ref_vec, bent_normal, roughness * roughness); + // Interpolate between mirror and rough reflection by using linear_roughness * linear_roughness. + ref_vec = mix(ref_vec, bent_normal, roughness * roughness * roughness * roughness); uvec2 reflection_indices = instances.data[draw_call.instance_index].reflection_probes; for (uint i = 0; i < sc_reflection_probes(); i++) {