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 e222325622..30f7c6fa29 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 @@ -2098,39 +2098,6 @@ void fragment_shader(in SceneData scene_data) { #endif } - //process ssr - if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSR)) { - bool resolve_ssr = bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_RESOLVE_SSR); - - float ssr_mip_level = 0.0; - if (resolve_ssr) { -#ifdef USE_MULTIVIEW - ssr_mip_level = textureLod(sampler2DArray(ssr_mip_level_buffer, SAMPLER_NEAREST_CLAMP), vec3(screen_uv, ViewIndex), 0.0).x; -#else - ssr_mip_level = textureLod(sampler2D(ssr_mip_level_buffer, SAMPLER_NEAREST_CLAMP), screen_uv, 0.0).x; -#endif // USE_MULTIVIEW - - ssr_mip_level *= 14.0; - } - -#ifdef USE_MULTIVIEW - vec4 ssr = textureLod(sampler2DArray(ssr_buffer, SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), vec3(screen_uv, ViewIndex), ssr_mip_level); -#else - vec4 ssr = textureLod(sampler2D(ssr_buffer, SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), screen_uv, ssr_mip_level); -#endif // USE_MULTIVIEW - - if (resolve_ssr) { - const vec3 rec709_luminance_weights = vec3(0.2126, 0.7152, 0.0722); - ssr.rgb /= 1.0 - dot(ssr.rgb, rec709_luminance_weights); - } - - // Apply fade when approaching 0.7 roughness to smoothen the harsh cutoff in the main SSR trace pass. - ssr *= smoothstep(0.0, 1.0, 1.0 - clamp((roughness - 0.6) / (0.7 - 0.6), 0.0, 1.0)); - - // Alpha is premultiplied. - indirect_specular_light = indirect_specular_light * (1.0 - ssr.a) + ssr.rgb; - } - //finalize ambient light here { ambient_light *= ao; @@ -2188,6 +2155,39 @@ void fragment_shader(in SceneData scene_data) { ambient_light *= 1.0 - ssil.a; ambient_light += ssil.rgb * albedo.rgb; } + + //process ssr + if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSR)) { + bool resolve_ssr = bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_RESOLVE_SSR); + + float ssr_mip_level = 0.0; + if (resolve_ssr) { +#ifdef USE_MULTIVIEW + ssr_mip_level = textureLod(sampler2DArray(ssr_mip_level_buffer, SAMPLER_NEAREST_CLAMP), vec3(screen_uv, ViewIndex), 0.0).x; +#else + ssr_mip_level = textureLod(sampler2D(ssr_mip_level_buffer, SAMPLER_NEAREST_CLAMP), screen_uv, 0.0).x; +#endif // USE_MULTIVIEW + + ssr_mip_level *= 14.0; + } + +#ifdef USE_MULTIVIEW + vec4 ssr = textureLod(sampler2DArray(ssr_buffer, SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), vec3(screen_uv, ViewIndex), ssr_mip_level); +#else + vec4 ssr = textureLod(sampler2D(ssr_buffer, SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), screen_uv, ssr_mip_level); +#endif // USE_MULTIVIEW + + if (resolve_ssr) { + const vec3 rec709_luminance_weights = vec3(0.2126, 0.7152, 0.0722); + ssr.rgb /= 1.0 - dot(ssr.rgb, rec709_luminance_weights); + } + + // Apply fade when approaching 0.7 roughness to smoothen the harsh cutoff in the main SSR trace pass. + ssr *= smoothstep(0.0, 1.0, 1.0 - clamp((roughness - 0.6) / (0.7 - 0.6), 0.0, 1.0)); + + // Alpha is premultiplied. + indirect_specular_light = indirect_specular_light * (1.0 - ssr.a) + ssr.rgb; + } } #endif // AMBIENT_LIGHT_DISABLED