@@ -1114,6 +1114,7 @@ void RasterizerSceneGLES3::environment_set_ssr_roughness_quality(RS::Environment
11141114}
11151115
11161116void RasterizerSceneGLES3::environment_set_ssao_quality (RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) {
1117+ ssao_quality = p_quality;
11171118}
11181119
11191120void RasterizerSceneGLES3::environment_set_ssil_quality (RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) {
@@ -2275,6 +2276,15 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
22752276 }
22762277 }
22772278
2279+ bool ssao_enabled = false ;
2280+ if (p_environment.is_valid ()) {
2281+ ssao_enabled = environment_get_ssao_enabled (p_environment);
2282+ if (ssao_enabled) {
2283+ // If SSAO is enabled, we apply tonemapping etc. in post, so disable it during rendering
2284+ apply_color_adjustments_in_post = true ;
2285+ }
2286+ }
2287+
22782288 // Assign render data
22792289 // Use the format from rendererRD
22802290 RenderDataGLES3 render_data;
@@ -2552,6 +2562,11 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
25522562 glBindFramebuffer (GL_FRAMEBUFFER, fbo);
25532563 glViewport (0 , 0 , rb->internal_size .x , rb->internal_size .y );
25542564
2565+ // If SSAO is enabled, we definitely need the depth buffer.
2566+ if (ssao_enabled) {
2567+ scene_state.used_depth_texture = true ;
2568+ }
2569+
25552570 // Do depth prepass if it's explicitly enabled
25562571 bool use_depth_prepass = config->use_depth_prepass ;
25572572
@@ -2835,6 +2850,18 @@ void RasterizerSceneGLES3::_render_post_processing(const RenderDataGLES3 *p_rend
28352850 rb->check_glow_buffers ();
28362851 }
28372852
2853+ // Check if we want and can have SSAO.
2854+ bool ssao_enabled = false ;
2855+ float ssao_strength = 4.0 ;
2856+ float ssao_radius = 0.5 ;
2857+ if (p_render_data->environment .is_valid ()) {
2858+ ssao_enabled = environment_get_ssao_enabled (p_render_data->environment );
2859+ // This SSAO is not implemented the same way, but uses the intensity and radius
2860+ // in a similar way. The parameters are scaled so the SSAO defaults look ok.
2861+ ssao_strength = environment_get_ssao_intensity (p_render_data->environment ) * 2.0 ;
2862+ ssao_radius = environment_get_ssao_radius (p_render_data->environment ) * 0.5 ;
2863+ }
2864+
28382865 uint64_t bcs_spec_constants = 0 ;
28392866 if (p_render_data->environment .is_valid ()) {
28402867 bool use_bcs = environment_get_adjustments_enabled (p_render_data->environment );
@@ -2882,6 +2909,10 @@ void RasterizerSceneGLES3::_render_post_processing(const RenderDataGLES3 *p_rend
28822909 if (fbo_int != 0 ) {
28832910 // Apply glow/bloom if requested? then populate our glow buffers
28842911 GLuint color = fbo_int != 0 ? rb->get_internal_color () : texture_storage->render_target_get_color (render_target);
2912+
2913+ // We need to pass this in for SSAO.
2914+ GLuint depth_buffer = fbo_int != 0 ? rb->get_internal_depth () : texture_storage->render_target_get_depth (render_target);
2915+
28852916 const GLES3::Glow::GLOWLEVEL *glow_buffers = nullptr ;
28862917 if (glow_enabled) {
28872918 glow_buffers = rb->get_glow_buffers ();
@@ -2898,7 +2929,10 @@ void RasterizerSceneGLES3::_render_post_processing(const RenderDataGLES3 *p_rend
28982929 }
28992930
29002931 // Copy color buffer
2901- post_effects->post_copy (fbo_rt, target_size, color, internal_size, p_render_data->luminance_multiplier , glow_buffers, glow_intensity, srgb_white, 0 , false , bcs_spec_constants);
2932+ post_effects->post_copy (fbo_rt, target_size, color,
2933+ depth_buffer, ssao_enabled, ssao_quality, ssao_strength, ssao_radius,
2934+ internal_size, p_render_data->luminance_multiplier , glow_buffers, glow_intensity,
2935+ srgb_white, 0 , false , bcs_spec_constants);
29022936
29032937 // Copy depth buffer
29042938 glBindFramebuffer (GL_READ_FRAMEBUFFER, fbo_int);
@@ -2945,6 +2979,9 @@ void RasterizerSceneGLES3::_render_post_processing(const RenderDataGLES3 *p_rend
29452979 const GLES3::Glow::GLOWLEVEL *glow_buffers = nullptr ;
29462980 GLuint source_color = fbo_int != 0 ? rb->get_internal_color () : texture_storage->render_target_get_color (render_target);
29472981
2982+ // Moved this up so SSAO could use it too.
2983+ GLuint read_depth = rb->get_internal_depth ();
2984+
29482985 if (glow_enabled) {
29492986 glow_buffers = rb->get_glow_buffers ();
29502987
@@ -2966,11 +3003,13 @@ void RasterizerSceneGLES3::_render_post_processing(const RenderDataGLES3 *p_rend
29663003
29673004 glBindFramebuffer (GL_FRAMEBUFFER, fbos[2 ]);
29683005 glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, write_color, 0 , v);
2969- post_effects->post_copy (fbos[2 ], target_size, source_color, internal_size, p_render_data->luminance_multiplier , glow_buffers, glow_intensity, srgb_white, v, true , bcs_spec_constants);
3006+ post_effects->post_copy (fbos[2 ], target_size, source_color,
3007+ read_depth, ssao_enabled, ssao_quality, ssao_strength, ssao_radius,
3008+ internal_size, p_render_data->luminance_multiplier , glow_buffers, glow_intensity,
3009+ srgb_white, v, true , bcs_spec_constants);
29703010 }
29713011
29723012 // Copy depth
2973- GLuint read_depth = rb->get_internal_depth ();
29743013 GLuint write_depth = texture_storage->render_target_get_depth (render_target);
29753014
29763015 glBindFramebuffer (GL_READ_FRAMEBUFFER, fbos[0 ]);
0 commit comments